通过Keepalived部署高可用集群方案时,经常会遇到两个节点同时获取到VIP地址,导致集群出现脑裂的情况,该情况导致的原因也很多,但最主要的还是keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,有些时候我们可以对集群配置独立的组播地址来避免该情况的发生,但有时因网络和交换机设备等安全策略的影响,同样会导致该情况的发生,针对该情况我们可以将组播的模式改为单拨。这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突。
实验环境:
主1服务器:192.168.1.14 主2服务器:192.168.1.15 VIP地址:192.168.1.16
1、主1服务器:192.168.1.14 keepalived配置文件
! Configuration File for keepalived global_defs { script_user root enable_script_security } vrrp_script check_nginx { script "/etc/keepalived/nginx_check.sh" interval 10 } vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 101 priority 100 unicast_src_ip 192.168.1.14 unicast_peer { 192.168.1.15 } advert_int 1 authentication { auth_type PASS auth_pass test123 } virtual_ipaddress { 192.168.1.16/24 dev eth1 } track_interface { eth0 } track_script { check_nginx } }
2、主2服务器:192.168.1.15 keepalived配置文件
! Configuration File for keepalived global_defs { script_user root enable_script_security } vrrp_script check_nginx { script "/etc/keepalived/nginx_check.sh" interval 10 } vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 101 priority 50 unicast_src_ip 192.168.1.15 unicast_peer { 192.168.1.14 } advert_int 1 authentication { auth_type PASS auth_pass test123 } virtual_ipaddress { 192.168.1.16/24 dev eth1 } track_interface { eth0 } track_script { check_nginx } }
3、两个节点nginx服务状态监听nginx_check.sh脚本文件
#!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ]; then systemctl restart nginx.service sleep 1 if [ `ps -C nginx --no-header |wc -l` -eq 0 ]; then systemctl restart keepalived.service fi fi
4、Keepalived配置文件说明
! Configuration File for keepalived global_defs { script_user root enable_script_security } vrrp_script check_nginx { script "/etc/keepalived/nginx_check.sh" interval 10 } vrrp_instance VI_1 { # 定义一个实例 state BACKUP # 指定Keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器,所以设置priority时要注意MASTER比BACKUP高。如果设置了nopreempt,那么state的这个值不起作用,主备靠priority决定。 nopreempt # 设置为不抢占 interface eth0 #指定监测网络的接口,当LVS接管时,将会把IP地址添加到该网卡上。 virtual_router_id 101 #虚拟路由标识,同一个vrrp实例使用唯一的标识,同一个vrrp_instance下,MASTER和BACKUP必须一致。 priority 100 #指定这个实例优先级 unicast_src_ip 192.168.1.14 # 配置单播的源地址 unicast_peer { 192.168.1.15 #配置单播的目标地址 } #keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,可以将组播的模式改为单拨。这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突。 advert_int 1 #心跳报文发送间隔 authentication { auth_type PASS #设置验证类型,主要有PASS和AH两种 auth_pass test123 #设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 192.168.1.16/24 dev eth1 } track_interface { # 设置额外的监控,里面那个网卡出现问题都会切换 eth0 } track_script { check_nginx } }
5、问题:两台机器上面都有VIP的情况
排查:
1.检查防火墙,发现已经是关闭状态。如开启查看是否开放广播地址
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
2. keepalived.conf配置问题。
3.可能是上联交换机禁用了arp的广播限制,造成keepalive无法通过广播通信,两台服务器抢占vip,出现同时都有vip的情况。运行如下命令
tcpdump -i eth0 vrrp -n
检查发现 14和15都在对224.0.0.18发送消息。但是在正常情况下,备节点如果收到主节点的心跳消息时,优先级高于自己,就不会主动对外发送消息。
[[email protected] system]# tcpdump -i eth0 vrrp -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes 10:02:39.467565 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20 10:02:40.468797 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20 10:02:41.470015 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20 10:02:42.471260 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20 10:02:43.472577 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20 10:02:44.473818 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20 10:02:45.475055 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20 10:02:46.476300 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20 10:02:47.477565 IP 192.168.1.14 > 192.168.1.15: VRRPv2, Advertisement, vrid 95, prio 99, authtype simple, intvl 1s, length 20