解决keepalived的主备服务器都持有VIP——出现脑裂现象

一、问题描述

1.1、脑裂

当我们使用keepalived方案给服务做主备高可用时,若我们的防火墙是开启状态,那么就会出现主备服务器的网卡都绑定上了VIP(即:两主,这也称为脑裂【本来在一个高可用HA的系统中,主备服务器是一个整体的系统,同一时间只能有一个提供服务,但现在却分裂为了两个独立的节点,这样就会两个节点争抢共享资源,会导致系统混乱、数据损坏等情况】,因此必须防止脑裂)【这是由于keepalived软件是MASTER【192.168.1.10】定时发送vrrp到BACKUP【192.168.1.40】来维持主备关系的,若是BACKUP收不到从主机发送来的vrrp包,则BACKUP会升级为MASTER】。

通过keepalived搭建MySQL双主模式的MySQL集群https://blog.csdn.net/xiaochenXIHUA/article/details/152114041?spm=1001.2014.3001.5501

1.2、观察日志

我们可以手动模拟keepalived的服务故障后,观察【/var/log/messages】日志内容(即可以新开一个终端直接运行【tail -f /var/log/messages】命令持续查看日志内容)。通过观察日志可以发现,当MASTER上的服务或keepalived重启后,先是BACKUP状态,然后会去争抢MASTER后变为了MASTER状态;而BACKUP服务故障或者重启后也是一样先进入BACKUP状态,然后会去争抢MASTER后变为了MASTER状态,如下图所示:

二、问题分析

之所以出现以上的keepalived主备都持有VIP,结合keepalived的vrrp原理,应该是主备服务器直接的vrrp失效了(即:当MASTER定时发送vrrp流量给BACKUP来维持主备关系时,由于BACKUP没有收到,因此去争抢了MASTER权限),我们可以通过使用【tcpdump】抓包工具来查看广播情况,相信操作如下:

bash 复制代码
#抓包分析keeaplived的vrrp广播数据

#1-安装tcpdump抓包工具
yum install tcpdump -y

#2-可在keepalived主备服务器所在局域网内的任意一台机器上执行抓包命令查看广播情况(注意:如下的ens33是网卡名称需要根据自己的实际网卡修改【ip addr】命令可以查询到网卡等信息)
#【正常情况下应该BACKUP这个备的服务器是不应该发送vrrp广播的】
tcpdump -i ens33 vrrp -n


#3-关闭keepalived的主备所在服务器的防火墙后再抓取vrrp广播数据包
#【可以看到只有MASTER(192.168.1.10)在发vrrp广播了】
systemctl stop firewalld
tcpdump -i ens33 vrrp -n

根据抓包的实际情况可以看到我们关闭了防火墙就可以让keepalived的主备高可用成功运行而不产生脑裂;若我们的防火墙开启就会有问题,也就是说我们需要给防火墙放开vrrp的广播数据包,详细操作如下图所示:

三、解决方法

配置防火墙允许VRRP流量通过https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/load_balancer_administration/s1-lvs-connect-vsa#firewallrequirements-VSA

bash 复制代码
#方法一:若我们开启的是【firewalld】防火墙则添加vrrp广播的操作如下
#【keepalived的主备所在服务器都需要操作】查看firewalld防火墙状态,若没启动则启动,然后添加允许vrrp广播通过的规则
systemctl status firewalld.service
systemctl restart firewalld.service
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
firewall-cmd --list-all


#方法二:若我们开启的是【iptables】则打开【iptables】文件添加接收vrrp的规则
#【keepalived的主备所在服务器都需要操作】查看iptables状态,然后添加允许vrrp广播通过的规则
systemctl status iptables
systemctl restart iptables
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
iptables -I INPUT -p vrrp -j ACCEPT
iptables-save > /etc/sysconfig/iptables
systemctl restart iptables
iptables -nL

《1》【keepalived的主备所在服务器】通过firewalld添加允许vrrp广播通过的规则实操流程:

《2》【keepalived的主备所在服务器】通过iptables添加允许vrrp广播通过的规则实操流程:

文档 - 手册页 - firewalld.richlanguage |防火墙dhttps://firewalld.org/documentation/man-pages/firewalld.richlanguage.htmlVRRP的原理与配置(附实验)https://www.cnblogs.com/weq0805/p/14817519.htmlVRRP 的原理与配置,你了解多少?https://www.zhihu.com/question/512114545

相关推荐
每天更新2 小时前
Linux 内核空间 并发竞争处理 共享资源&线程同步
linux
weixin_423196172 小时前
使用vscode的ssh功能连接远程服务器卡在Setting up SSH Host IP: Downloading VS Code Server的解决方案
服务器·vscode·ssh
woshihonghonga2 小时前
Ubuntu 如何安装.NET6 runtime
linux·ubuntu·.net
☆璇2 小时前
【Linux】库的链接与加载
linux·运维·服务器
半夏知半秋2 小时前
基于skynet框架业务中的gateway实现分析
服务器·开发语言·后端·学习·gateway
程序员小白条3 小时前
度小满运维开发一面
java·运维·python·职场和发展·运维开发
问道飞鱼4 小时前
【服务器知识】HTTP 请求头信息及其用途详细说明
运维·服务器·nginx·http·http头信息
weixin_436525074 小时前
linux-RabbitMQ创建虚拟主机、用户、分配权限、标签
linux·运维·服务器·rabbitmq
铁手飞鹰7 小时前
从零复现论文:深度学习域适应1
linux·pytorch·python·深度学习·ubuntu·ai·迁移学习