简介
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里自带,不需要安装。