准备使用keepalived作为高可用性软件,因此针对keepalived做了一些实验,得出的结论先说一下: 1: keepalived一个作为master,另一个做为backup。当master挂了
准备使用keepalived作为高可用性软件,因此针对keepalived做了一些实验,得出的结论先说一下:
1: keepalived一个作为master,另一个做为backup。当master挂了后,backup接管。但存在一个问题,当master恢复了后,master又会接管会来,这个频繁切换对于业务来说是不好的,再快的切换也会有影响。
2: keepalived进程被强制kill后,虚拟ip移除不掉,导致脑裂的现象。
对于对第1个结论,做的实验如下,探测设置为30s只是为了方便实验,对于生产环境不适用:
master(ip: 172.16.0.3)的配置:
vrrp_instance VI_1 { !state BACKUP state MASTER interface eth1 !nopreempt virtual_router_id 51 priority 100 advert_int 30 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.0.254 }}
backup(ip: 172.16.0.1)的配置:
vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 priority 50 advert_int 30 !nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.0.254 }}
经抓包发现,当一开始启动的时候,vrrp包只会抓到master发出100权重的,截图如下:
模拟master的keepalived出问题后(使用kill命令杀掉keepalived进程),backup发出权重为50的vrrp包,抓包还会发现kill掉后,master会发出一个权重为0的vrrp包。如下:
此时master切换到backup成功,当master恢复的时候,我们是不想让master再去抢占的,上面说了,切换总是会有影响的。可当master恢复后(启动keepalived),还是会切换,抓包会发现master一启动,就需要重新选master了,截图如下:
对于第1个结论的解决方案是,两个配置都使用backup,然后权重高的使用nopreempt,也就是不抢占的意思,这样子,就不会有两次切换的操作了。
对于第2个结论,做的实验如下:
配置同上,只是这次模拟master挂掉不是使用kill命令,而是使用kill -9命令强制kill。那虚拟ip便不会删除,所以使用kill -9杀keepalived的慎重,因为还有后续的任务要处理。截图如下
得使用ip addr del 172.16.0.254/32 dev eth1把ip移除掉一下。(截图有点问题,mac地址一样,不过对实验没什么影响)
对于不同的脑裂的解决方案都有所不同,本来想用ping网关来检测另外一台机器,但如果使用iptables把vrrp的output禁止掉,也会脑裂,因为ping是通的,但vrrp包发不出去,另外一台虚拟ip也会起来。
后续再想了个解决方案就是使用arping看下虚拟地址会不会有arp响应,如果有arp响应的话,就把虚拟ip移除掉,就不会脑裂了。脚本如下:
#!/bin/shwhile true;do arping -I eth1 -c 3 -q 172.16.0.254 if [ $? -eq 0 ];then ip addr del 172.16.0.254/32 dev eth1 exit 1 fi sleep 2doneexit 2
脚本可自行修改,就当检测到虚拟ip的arp响应时,就把虚拟ip给delete掉,可以再加上kill掉keepalived。