Linux —— keepalived

简介

Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。

Keepalived 开源并且免费的软件。

Keepalived 的2大核心功能

  1. loadbalance 负载均衡 LB:ipvs--》lvs软件在linux内核里已经安装,不需要单独安装

  2. high-availability 高可用 HA : vrrp协议

keepalived实现负载均衡的功能是依靠lvs这个软件里实现的

负载平衡框架依赖于提供第4层负载平衡的著名且广泛使用的Linux虚拟服务器(IPVS)内核模块。

负载均衡和高可用性是2个概念

负载均衡:将很多的请求分散到后端很多的服务器上 --》化解压力的一个软件

高可用: 有2个或者多个服务器(人)做相同的事情,互相备份。

高可用的软件:keepalived 、HA Proxy、heartbeat

进程

keepalived正常启动的时候,共启动3个进程,一个是父进程,负责监控其子进程,一个是vrrp子进程,另外一个是checkers子进程

两个子进程都被系统watchdog看管,两个子进程各自负责复杂自己的事。

vrrp协议 虚拟路由冗余协议

工作在网络层

VRRP是一种容错协议,它通过把几台路由设备联合组成一台虚拟的路由设备,并通过一定的机制来保证当主机的下一跳设备出现故障时,可以及时将业务切换到其它设备,从而保持通讯的连续性和可靠性。

VRRP将局域网内的一组路由器划分在一起,称为一个备份组。备份组由一个Master路由器和多个Backup路由器组成,功能上相当于一台虚拟路由器。局域网内的主机只需要知道这个虚拟路由器的IP地址,并不需知道具体某台设备的IP地址,将网络内主机的缺省网关设置为该虚拟路由器的IP地址,主机就可以利用该虚拟网关与外部网络进行通信。

VRRP将该虚拟路由器动态关联到承担传输业务的物理路由器上,当该物理路由器出现故障时,再次选择新路由器来接替业务传输工作,整个过程对用户完全透明,实现了内部网络和外部网络不间断通信。

VRRP通告(advertisement)。它使用IP多播数据包进行封装,组地址为224.0.0.18

参考:https://blog.csdn.net/zhongzh86/article/details/81537644

++vrrp协议工作在哪层++ ?

网络层

vrrp协议的组播地址:

封装角度:

帧: 源mac,目的mac

vrrp协议: 封装

ip协议

vrrp协议的工作原理:

选举的过程:

1.所有的路由器或者服务器发送vrrp宣告报文,进行选举,必须是相同vrid和认证密码的,优先级高的服务器或者路由器会被选举为master,其他的机器都是backup

2.master定时(Advertisement Interval)发送VRRP通告报文,以便向Backup路由器告 知自己的存活情况。 默认是间隔1秒

3.接收Master设备发送的VRRP通告报文,判断Master设备的状态是否正常。 如果超过1秒没有收到vrrp报文,就认为master挂了,开始重新选举新的master,vip会漂移到新的master上

vip是虚拟的ip地址,真正对外提供业务ip地址,可以告诉用户的

名词术语

单点故障: 某些重要的应用,只有1个节点,如果这个节点出现故障,导致服务不可用。

高可用: high availability :至少有2个以上的节点提供服务,互相备份,其中的一个坏了,另外一个可用顶替。

灾备---》多搞几台机器--》成本会增加

master :主要的,对外提供服务的

backup :备份的,不对外提供服务,在master是好的情况下。一旦master挂了,backup马上就会接替master的工作,成为master

VRRP的工作过程

(1) 虚拟路由器中的路由器根据优先级选举出Master。Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通知给与它连接的设备或者主机,从而承担报文转发任务;

(2) Master路由器周期性发送VRRP报文,以公布其配置信息(优先级等)和工作状况;

(3) 如果Master路由器出现故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master;

(4) 虚拟路由器状态切换时,Master路由器由一台设备切换为另外一台设备,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和虚拟IP地址信息的免费ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息。网络中的主机感知不到Master路由器已经切换为另外一台设备。

(5) Backup路由器的优先级高于Master路由器时,由Backup路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举Master。

由此可见,为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能:

Master路由器的选举;

Master路由器状态的通告;

同时,为了提高安全性,VRRP还提供了认证功能;

Master路由器的选举

VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器)。初始创建的路由器工作在Backup状态,通过VRRP报文的交互获知虚拟路由器中其他成员的优先级优先级越高,则越有可能成为Master路由器。

Master路由器状态的通告

Master路由器周期性地发送VRRP报文,在虚拟路由器中公布其配置信息(优先级等)和工作状况。Backup路由器通过接收到VRRP报文的情况来判断Master路由器是否工作正常。

认证方式

无认证:不进行任何VRRP报文的合法性认证,不提供安全性保障。

简单字符认证:在一个有可能受到安全威胁的网络中,可以将认证方式设置为简单字符认证。发送VRRP报文的路由器将认证字填入到VRRP报文中,而收到VRRP报文的路由器会将收到的VRRP报文中的认证字和本地配置的认证字进行比较。如果认证字相同,则认为接收到的报文是合法的VRRP报文;否则认为接收到的报文是一个非法报文。

MD5认证:在一个非常不安全的网络中,可以将认证方式设置为MD5认证。发送VRRP报文的路由器利用认证字和MD5算法对VRRP报文进行加密,加密后的报文保存在AuthenticationHeader(认证头)中。收到VRRP报文的路由器会利用认证字解密报文,检查该报文的合法性

IP头参数

VRRP包的源地址是本机地址,目的地址必须为 224.0.0.18,为一多播地址;IP协议号为112;IP包的TTL值必须为255。

VRRP协议数据格式

现象

vip漂移

当master服务器挂了之后,vip自动漂移到backup服务器上

master 挂了,vip会漂到backup服务器上

在master上关闭下keepalived服务就可以了,在backup上查看是否有vip地址

vip脑裂

2台或者多台LB上都有vip地址

产生脑裂现象的原因:

1.vrid(虚拟路由id)不一样

2.网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信

3.认证密码不一样也会出现脑裂

++脑裂有没有危害?如果有危害对业务有什么影响?++

没有危害,能正常访问,反而还有负载均衡的作用

脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务的

keepalived的架构

单vip 架构

只有master上有vip,backup上没有vip,这个时候master会比较忙,backup机器会比较闲,设备使用率比较低

双vip 架构

启动2个vrrp实例,每台机器上都启用2个vrrp实例,一个做master,一个做backup,启用2个vip,每台机器上都会有一个vip,这2个vip都对外提供服务,这样就可以避免单vip的情况下,一个很忙一个很闲。 可以提升设备的使用率

配置

复制代码
[root@lb-1 keepalived]# pwd
/etc/keepalived
[root@lb-1 keepalived]# ls
keepalived.conf
[root@lb-1 keepalived]# vim keepalived.conf 
[root@lb-1 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 59
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.188
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.199
    }
}
[root@lb-1 keepalived]# 



第2台机器上的配置
[root@lb2 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 59
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.188
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 60
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.199
    }
}


[root@lb2 keepalived]# 

keepalived的健康检查

参考:https://www.cnblogs.com/Yuanbangchen/p/16551032.html

vrrp_script,track_script

只要vrrp示例在运行,脚本就会执行

复制代码
keepalived调用脚本进行资源监控
keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。
通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点
 
分两步:(1) 先定义一个脚本;(2) 调用此脚本
vrrp_script SCRIPT_NAME {  # 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换,定义在与vrrp_instance平级。
        script <STRING>|<QUOTED-STRING>     # shell命令或脚本路径,此脚本返回值为非0时(假),会触发下面OPTIONS执行
        interval <INTEGER>                    # 间隔时间,单位为秒,默认1秒
        timeout <INTEGER>                     # 超时时间
        weight <INTEGER:-254..254>            # 权重,监测失败后会执行权重相加,权重可以为负数即相加后降低本机权重
        fall <INTEGER>                        # 脚本几次失败转换为失败
        rise <INTEGER>                        # 脚本连续监测成功后,把服务器从失败标记为成功的次数
        user USERNAME [GROUPNAME]           # 执行监测的用户或组
        init_fail                           # 设置默认标记为失败状态,监测成功之后再转换为成功状态
   }           
track_script {           #追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容,定义在vrrp_instance里。
    SCRIPT_NAME
    SCRIPT_NAME
}  

[root@localhost7A ~]# cat  /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     348987564@qq.com  
   }
   notification_email_from root@localhost 
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30
   router_id localhost7A
   vrrp_iptables
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.100.100
}
vrrp_script chk_down {   #定义脚本 说明:两台KA都需要/etc/keepalived/down,建议使用网络挂载方式这个文件夹,也叫仲裁盘。 
    script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0" # down存在时返回非0,触发权重-30
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}
vrrp_script chk_nginx { #定义脚本
    script "/usr/bin/killall -0 nginx "  #0表示检查进程是否运行。
    interval 1
    weight -20  #减后要小于backup中priority的值。
    fall 2
    rise 1
}
vrrp_instance zzhz {
    state MASTER
    interface eth0
    virtual_router_id 88
    priority 88       
    advert_int 2        
    authentication {
        auth_type PASS
        auth_pass centos
    }
    virtual_ipaddress {
        192.168.80.222/24 dev eth0 label eth0:1
    }
    track_script { 
    chk_down
    chk_nginx  #在vrrp示例里调用此脚本
    }
}
virtual_server 192.168.80.222  80 {
    delay_loop 6
        lb_algo rr
        lb_kind DR
        protocol TCP
        sorry_server 127.0.0.1 80
 
    real_server 192.168.80.120 80 {
            weight 1
            HTTP_GET {
                url {
                        path /
                        status_code 200
             }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }      
    }  
    real_server 192.168.80.130 80 {
            weight 1
            HTTP_CHECK {
            connect_ip 192.168.80.130
            connect_port 80
            bindto 192.168.80.100
            bind_port 7777
            connect_timeout 3
             nb_get_retry 3
            delay_before_retry 3
         }
     }
} 

notify

只会执行一次

用法

notify_master:当当前节点成为master时,通知脚本执行任务(一般用于启动某服务,比如nginx,haproxy等)

notify_backup:当当前节点成为backup时,通知脚本执行任务(一般用于关闭某服务,比如nginx,haproxy等)

notify_fault:当当前节点出现故障,执行的任务;

notify_stop VRRP停止后后执行的脚本

案例

监控本机的nginx进程是否运行,如果nginx进程不运行就立马将优先级降低30,观察vip是否漂移?

1.编写监控nginx的脚本

复制代码
1.编写监控nginx的脚本
	如何判断nginx是否运行,方法很多?
		1.pidof  nginx
		2.killall -0 nginx
[root@lb-1 nginx]# pwd
/nginx
[root@lb-1 nginx]# cat check_nginx.sh 
#!/bin/bash

#检测nginx是否正常运行
if  /usr/sbin/pidof  nginx  ;then
	exit 0
else
	exit 1
fi
[root@lb-1 nginx]# 
[root@lb-1 nginx]# chmod +x check_nginx.sh 
[root@lb-1 nginx]# ll
总用量 4
-rwxr-xr-x 1 root root 102 12月 21 15:01 check_nginx.sh
[root@lb-1 nginx]# 

keepalived 会通过看脚本执行的返回值来判断脚本是否正确执行
	0 执行成功
	非0 表示执行失败

在2台负载均衡器上都要完成脚本的编写,并且授予可执行权限
[root@lb2 keepalived]# mkdir /nginx
[root@lb2 keepalived]# cd /nginx/
[root@lb2 nginx]# ls
[root@lb2 nginx]# vim check_nginx.sh
[root@lb2 nginx]# ll
总用量 4
-rw-r--r-- 1 root root 128 12月 21 15:06 check_nginx.sh
[root@lb2 nginx]# chmod +x check_nginx.sh 
[root@lb2 nginx]# ll
总用量 4
-rwxr-xr-x 1 root root 128 12月 21 15:06 check_nginx.sh
[root@lb2 nginx]# 

2.在keepalived里定义监控脚本

复制代码
#定义监控脚本chk_nginx
vrrp_script chk_nginx {
#当脚本/nginx/check_nginx.sh脚本执行返回值为0的时候,不执行下面的weight  -30的操作,只有脚本执行失败,返回值非0的时候,就执行执行权重值减30的操作
script "/nginx/check_nginx.sh"
interval 1
weight -30
}

3.在keepalived里调用监控脚本

要用在vrrp实例里

复制代码
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 59
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.188
    }
#调用监控脚本
track_script {
chk_nginx
}

}

如果检查到nginx进程关闭,立马关闭keepalived的软件

第1步先编写脚本

复制代码
#当本机成为backup的时候,立马执行下面的脚本
notify_backup  "/nginx/halt_keepalived.sh"
[root@lb-1 nginx]# pwd
/nginx
[root@lb-1 nginx]# ls
check_nginx.sh  halt_keepalived.sh
[root@lb-1 nginx]# cat halt_keepalived.sh 
#!/bin/bash

service  keepalived stop
[root@lb-1 nginx]# 

第2步:在vrrp实例里使用notify_backup 调用脚本

++如果负载均衡器上的nginx程序出现问题,keepalived是否还有价值?++

keepalived的价值是建立在nginx能正常工作的情况下,如果nginx异常,这台机器就不是负载均衡器了,需要停止它的master身份,将优先级降低,让位给其他的机器。 背后需要有健康检测功能。

负载均衡

keeaplived的负载均衡功能是通过lvs软件实现的,这个软件linux里自带,不需要安装。

相关推荐
liliangcsdn5 分钟前
curl如何发送json文件数据示例
服务器
没有啥的昵称8 分钟前
linux下用QLibrary载入动态库
linux·qt
北方的流星9 分钟前
华为帧中继配置
运维·网络·华为
踏浪无痕15 分钟前
从 node-exporter 学如何写出可复用的监控指标
运维·后端·架构
飞Link18 分钟前
【CentOS】Linux(CentOS7)安装教程
linux·运维·服务器·centos
知识分享小能手21 分钟前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04中的过滤器知识点详解(13)
linux·学习·ubuntu
lifewange22 分钟前
100 个接口,1000 个业务场景,如何设计自动化测试用例?框架是如何设计的?
运维·自动化·测试用例
牛奔30 分钟前
Linux 的日志分析命令
linux·运维·服务器·python·excel
深耕AI35 分钟前
Docker Volumes详解
运维·docker·容器
飞Link37 分钟前
【Linux】Linux(CentOS7)配置SSH免密登录
linux·运维·服务器