Featured image of post keepalived配置虚拟ip补充

keepalived配置虚拟ip补充

背景

上篇我们介绍了keepalived的配置,但是有一个问题,keepalived 默认是抢占模式, 当主宕机之后再重启,虚拟ip会切回主,此时会有波动,影响业务。是否有什么办法可以避免这种情况?

我们可以配置成非抢占模式,当主宕机之后,虚拟ip不会切回主,而是保持在从节点上, 直到从节点宕机,才会切换到主节点。

配置示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
! 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
   max_auto_priority 99
   enable_script_security
   script_user root
  # vrrp_strict
}

vrrp_instance VI_1 {
    state BACKUP 
    interface ens160 
    virtual_router_id 52
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass testuser
    }

    virtual_ipaddress {
        172.16.4.96 dev ens160
    }
    
    notify_fault  "/data/scripts/vip_down.sh"
    notify_stop  "/data/scripts/vip_down.sh"

    # Allow packets addressed to the VIPs above to be received
    #accept
}

只需要nopreempt添加到vrrp_instance 中,另外主备节点的状态都为BACKUP, 就可以实现非抢占模式

当两个节点都是BACKUP状态,哪个节点先启动(一般会选择priority高的节点),虚拟ip就会分配给哪个节点。它就是主节点,另外一个是备节点

当主节点状态配置成MASTER,那么nopreempt参数就不会生效。日志中会有如下警告:

1
(VI_1) Warning - nopreempt will not work with initial state MASTER - clearing nopreempt flag

测试

还是使用上一章节的测试环境,先启动172.16.4.111节点,然后再启动172.16.4.113节点, 可以看到虚拟ip172.16.4.96分配给了172.16.4.111节点。

  1. 172.16.4.111节点的网卡
1
2
3
4
5
6
7
8
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:83:b9:d7 brd ff:ff:ff:ff:ff:ff
    inet 172.16.4.111/22 brd 172.16.7.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 172.16.4.96/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::e194:8abe:9eb7:bb02/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
  1. 172.16.4.113节点的网卡
1
2
3
4
5
6
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:83:0e:04 brd ff:ff:ff:ff:ff:ff
    inet 172.16.4.113/22 brd 172.16.7.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::45a0:3144:4cf8:fb8d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

172.16.4.111节点停止keepalived容器之后,虚拟ip172.16.4.96切到了172.16.4.113节点。

  1. 172.16.4.113节点的网卡
1
2
3
4
5
6
7
8
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:83:0e:04 brd ff:ff:ff:ff:ff:ff
    inet 172.16.4.113/22 brd 172.16.7.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 172.16.4.96/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::45a0:3144:4cf8:fb8d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
  1. 172.16.4.111节点的网卡
1
2
3
4
5
6
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:83:b9:d7 brd ff:ff:ff:ff:ff:ff
    inet 172.16.4.111/22 brd 172.16.7.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::e194:8abe:9eb7:bb02/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

然后再启动172.16.4.111节点的keepalived,虚拟ip172.16.4.96还是在172.16.4.113节点。

  1. 172.16.4.111节点的网卡
1
2
3
4
5
6
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:83:b9:d7 brd ff:ff:ff:ff:ff:ff
    inet 172.16.4.111/22 brd 172.16.7.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::e194:8abe:9eb7:bb02/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
  1. 172.16.4.113节点的网卡
1
2
3
4
5
6
7
8
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:83:0e:04 brd ff:ff:ff:ff:ff:ff
    inet 172.16.4.113/22 brd 172.16.7.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 172.16.4.96/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::45a0:3144:4cf8:fb8d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

可以看到,结果和预期一致。

其他

当我们想看两个节点的交互情况时,可以抓包查看tcpdump -n -i ens160 vrrp

1
2
3
4
5
6
7
8
9
tcpdump -n -i ens160 vrrp 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
16:40:43.218290 IP 172.16.7.138 > 224.0.0.18: VRRPv2, Advertisement, vrid 53, prio 91, authtype simple, intvl 1s, length 20
16:40:43.241397 IP 172.16.4.139 > 224.0.0.18: VRRPv2, Advertisement, vrid 77, prio 150, authtype simple, intvl 1s, length 20
16:40:43.399091 IP 172.16.7.82 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
16:40:43.941014 IP 172.16.4.113 > 224.0.0.18: VRRPv2, Advertisement, vrid 52, prio 90, authtype simple, intvl 1s, length 20
16:40:44.218608 IP 172.16.7.138 > 224.0.0.18: VRRPv2, Advertisement, vrid 53, prio 91, authtype simple, intvl 1s, length 20
16:40:44.241604 IP 172.16.4.139 > 224.0.0.18: VRRPv2, Advertisement, vrid 77, prio 150, authtype simple, intvl 1s, length 20

可以看到在整个局域网内,有很多其他的节点也在发送VRRP广播包。想要不和其他的节点混淆,设置virtual_router_id要不一样。

总结

  1. 两个节点都为BACKUP状态,并且添加nopreempt参数,可以实现非抢占模式。
  2. virtual_router_id 要自己设置一下,避免使用默认的,以免和其他的节点混淆。
本博客已稳定运行
发表了66篇文章 · 总计113.98k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计