keepalived主备切换时间研究
1. 概述
本文档主要研究keepalived主备切换过程中耗时的问题。
测试环境Windows10作为宿主机,两台虚拟机为Linux CentOS-7。
VIP | DIP | priority | 主备模式 |
---|---|---|---|
192.168.220.100 | 192.168.220.101 | 100 | MASTER |
192.168.220.100 | 192.168.220.102 | 100 | BACKUP |
2. 环境安装
在宿主机上安装wireshark,安装过程省略。
在两台虚拟机上安装keepalived
setenforce 0 # 临时关闭SELINUX
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config # 永久关闭SELINUX
yum install -y keepalived
master和backup都必须要有健康检查脚本,进程 x 未启动时会自动杀死keepalived进程
echo "
#!/bin/bash
PID=\`ps -ef | grep x | grep -v grep\`
if [[ \$PID = \"\" ]]; then
systemctl stop keepalived.service
fi
exit 0
" > /etc/keepalived/chk_my.sh
chmod 744 /etc/keepalived/chk_my.sh
主机master的 keepalived.conf 采用以下的配置
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id master-server
script_user root #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
}
vrrp_script chk_my_service {
script "/etc/keepalived/chk_my.sh"
interval 1
weight 5
}
vrrp_instance VI_1 {
state MASTER
interface ens33
mcast_src_ip 192.168.220.101
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass MrUse
}
virtual_ipaddress {
192.168.220.100
}
track_script {
chk_my_service
}
}
从机backup的 keepalived.conf 采用以下的配置
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id backup-server
script_user root #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
}
vrrp_script chk_my_service {
script "/etc/keepalived/chk_my.sh"
interval 1
weight 5
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.220.102
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass MrUse
}
virtual_ipaddress {
192.168.220.100
}
track_script {
chk_my_service
}
}
两台虚拟机均需要启动x并重启keepalived
systemctl restart keepalived.service
systemctl status keepalived.service
3. 主备切换时间研究
在虚拟机上利用tcpdump命令抓包,并通过宿主机上的wireshark分析抓取到的网络包,计算主备切换的时间。
3.1 直接停止keepalived时主备切换时间
启动x和keepalived之后,在master上使用
# tcpdump抓包vrrp协议的包
tcpdump -i ens33 vrrp -w ~/tcpdump/x-keepalived.pcap
# 停止master的keepalived
systemctl stop keepalived.service
分析x-keepalived.pcap后结果如下,可以看到master(192.168.220.101) 最后一次发出
通告是在19.614008,而发生vip漂移,即backup继位时间为20.224988,中间相差为0.6秒。
no time source destination proto len info
18 17.022250 192.168.220.101 224.0.0.18 VRRP 54 Announcement (v2)
19 18.023463 192.168.220.101 224.0.0.18 VRRP 54 Announcement (v2)
20 19.024858 192.168.220.101 224.0.0.18 VRRP 54 Announcement (v2)
21 19.614008 192.168.220.101 224.0.0.18 VRRP 54 Announcement (v2)
22 20.224988 192.168.220.102 224.0.0.18 VRRP 60 Announcement (v2)
23 21.226812 192.168.220.102 224.0.0.18 VRRP 60 Announcement (v2)
3.2 停止进程x时主备切换时间
健康监控脚本会一直监测x进程,一旦x退出,则会触发keepalived的停止,发生主从切换。
首先重启两个节点的keepalived,保证此时master是主机。
在master上使用tcpdump抓vrrp协议的包
tcpdump -i ens33 vrrp -w ~/tcpdump/x-keepalived.pcap
接下来在master上杀死x
PID=`ps -ef | grep x | grep -v grep | awk '{cmd="echo "$2;system(cmd)}'`
kill -9 $PID
分析x-keepalived.pcap后发现依旧是0.6秒左右
no time source destination proto len info
13 12.015911 192.168.220.101 224.0.0.18 VRRP 54 Announcement (v2)
14 13.017103 192.168.220.101 224.0.0.18 VRRP 54 Announcement (v2)
15 13.044299 192.168.220.101 224.0.0.18 VRRP 54 Announcement (v2)
16 13.655466 192.168.220.102 224.0.0.18 VRRP 60 Announcement (v2)
17 14.658398 192.168.220.102 224.0.0.18 VRRP 60 Announcement (v2)
18 15.660342 192.168.220.102 224.0.0.18 VRRP 60 Announcement (v2)
3.3 直接强制关掉master时主备切换时间
首先重启两个节点的keepalived,保证此时master是主机。
在backup上使用tcpdump抓vrrp协议的包
tcpdump -i ens33 vrrp -w ~/tcpdump/x-keepalived.pcap
接下来在master上执行强制重启指令
reboot -f
分析x-keepalived.pcap后发现强制关机时切换时间为3.6秒左右
no time source destination proto len info
8 7.009335 192.168.220.101 224.0.0.18 VRRP 60 Announcement (v2)
9 8.010574 192.168.220.101 224.0.0.18 VRRP 60 Announcement (v2)
10 9.011795 192.168.220.101 224.0.0.18 VRRP 60 Announcement (v2)
11 12.622001 192.168.220.102 224.0.0.18 VRRP 54 Announcement (v2)
12 13.623395 192.168.220.102 224.0.0.18 VRRP 54 Announcement (v2)
13 14.623648 192.168.220.102 224.0.0.18 VRRP 54 Announcement (v2)
4. vrrp超时时间的研究
实验3.3和前面3.1以及3.2区别在于,3.1和3.2中master keepalived的最后一条vrrp包会通知
backup它退出了。但是断电的情况,只能靠backup的超时机制。
本节主要探讨关于超时机制的时间设置。
超时时间的计算公式为:
- vrrp->ms_down_timer = 3 * vrrp->master_adver_int + VRRP_TIMER_SKEW(vrrp)
其中:
- vrrp->master_adver_int是配置文件中的advert_int,这个值在上面的例子中被设定成1,因此
根据公式算下来 1 * 3 = 3 秒 - VRRP_TIMER_SKEW(vrrp)=(256-Backup路由器的优先级)/256,Backup路由器的优先级是100。
(256 - 100)/ 256 = 0.6秒
所以3.3小节中的切换时间为3 + 0.6 = 3.6秒左右
因此可以从两方面入手来配置超时时间:
- VRRP_TIMER_SKEW(vrrp)这个值收益较小,用作时间的精准控制。
- advert_int这个参数可以大范围改变超时时间,但是要注意,这个参数在vrrp verion2里面最小值只能设为1s,
只有在vrrp version3里面才能设为小于1s(测试时配adver_int 0.5),所以需要在conf中的全局定义中配置:vrrp_version 3
接下来将master和backup的keepalived.conf中都做出如下修改:
- 在global_def中加入vrrp_version 3
- 将advert_int改为0.1
这样的话,超时时间应该为 3 * 0.1 + 0.6 = 1 秒左右
重启master和backup的keepalived,确保master是当前主机,并在backup上执行
tcpdump -i ens33 vrrp -w ~/tcpdump/x-keepalived.pcap
强制重启master
reboot -f
分析x-keepalived.pcap后发现结果比预期还要好一些,切换时间是0.36秒左右,估计是采
用了vrrp_version 3之后,即advert_int小于0以后,VRRP_TIMER_SKEW(vrrp)的值也缩小了10倍,
从0.6变成了0.06,以适应当前的时间精度级别。
no time source destination proto len info
194 19.446370 192.168.220.101 224.0.0.18 VRRP 60 Announcement (v3)
195 19.547255 192.168.220.101 224.0.0.18 VRRP 60 Announcement (v3)
196 19.908935 192.168.220.102 224.0.0.18 VRRP 46 Announcement (v3)
197 20.010096 192.168.220.102 224.0.0.18 VRRP 46 Announcement (v3)
198 20.110352 192.168.220.102 224.0.0.18 VRRP 46 Announcement (v3)
总结:虽然超时时间可以被缩得很短,但是建议不要把这个时间故意设置成很小,否则master和
backup通信超时也会被误认为是超时,从而可能产生脑裂现象。