Keepalived避免无用的failover
- - 小火箭通常情况下,当主挂掉时,从会自动切换为主. 当主上的服务恢复时,则会再次抢占成为主,这里就发生了一次不必要的failover. 为了解决上述情况,可以在主的配置中vrrp_instance增加nopreempt. 注意:确保实验机器防火墙不会过滤掉vrrp协议的数据包. 以下是 sudo tcpdump vrrp -i eno16777736命令输出.
通常情况下,当主挂掉时,从会自动切换为主。当主上的服务恢复时,则会再次抢占成为主,这里就发生了一次不必要的failover。
为了解决上述情况,可以在主的配置中vrrp_instance增加nopreempt。
注意:确保实验机器防火墙不会过滤掉vrrp协议的数据包。
主配置:
1 ! Configuration File for keepalived
2
3 global_defs {
4 router_id LVS_DEVEL_TEST
5 }
6
7 vrrp_script chk_httpd {
8 script "systemctl status httpd.service > /dev/null 2>&1"
9 interval 2
10 weight -2
11 }
12
13 vrrp_instance VI_1 {
14 state MASTER
15 interface eno16777736
16 virtual_router_id 51
17 priority 100
18 nopreempt
19 advert_int 1
20 mcast_src_ip 192.168.213.128
21 track_script {
22 chk_httpd
23 }
24 authentication {
25 auth_type PASS
26 auth_pass 1111
27 }
28 virtual_ipaddress {
29 192.168.213.200
30 }
31 }
从配置:
1 ! Configuration File for keepalived
2
3 global_defs {
4 router_id LVS_DEVEL_TEST
5 }
6
7 vrrp_script chk_httpd {
8 script "systemctl status httpd.service > /dev/null 2>&1"
9 interval 2
10 weight -2
11 }
12
13 vrrp_instance VI_1 {
14 state BACKUP
15 interface eno16777736
16 virtual_router_id 51
17 priority 99
18 advert_int 1
19 mcast_src_ip 192.168.213.129
20 track_script {
21 chk_httpd
22 }
23 authentication {
24 auth_type PASS
25 auth_pass 1111
26 }
27 virtual_ipaddress {
28 192.168.213.200
29 }
30 }
以下是 sudo tcpdump vrrp -i eno16777736
命令输出。
正常情况下:
128挂掉,129切换为主:
128恢复,并未抢占成为主,仍然是129对外提供服务。
但这里有一个问题,如果此时129挂掉,128不会抢占成为主!为了解决这个问题,可以在129挂掉时,将129上的Keepalived服务停止。如下修改129配置的vrrp_script:
systemctl status httpd.service > /dev/null 2>&1;[ $? -ne 0 ] || systemctl stop keepalived.service
现在,当129挂掉时,128能够抢占成为主,不过再恢复129时,需要重启Keepalived服务: