keepalived主备切换时间研究

keepalived主备切换时间研究

1. 概述

本文档主要研究keepalived主备切换过程中耗时的问题。

测试环境Windows10作为宿主机,两台虚拟机为Linux CentOS-7。

VIPDIPpriority主备模式
192.168.220.100192.168.220.101100MASTER
192.168.220.100192.168.220.102100BACKUP

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秒左右

因此可以从两方面入手来配置超时时间:

  1. VRRP_TIMER_SKEW(vrrp)这个值收益较小,用作时间的精准控制。
  2. advert_int这个参数可以大范围改变超时时间,但是要注意,这个参数在vrrp verion2里面最小值只能设为1s,
    只有在vrrp version3里面才能设为小于1s(测试时配adver_int 0.5),所以需要在conf中的全局定义中配置:vrrp_version 3

接下来将master和backup的keepalived.conf中都做出如下修改:

  1. 在global_def中加入vrrp_version 3
  2. 将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通信超时也会被误认为是超时,从而可能产生脑裂现象。

参考文档

[1] 缩短keepalived切换时间的方法
[2] 通过抓包分析keepalived的浮动IP是如何飘移的

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值