天长街道两学一做网站,手机网站模版 优帮云,学校二级网站建设自查情况,做网站怎么更新静态页Keepalived的作用是检测服务器的状态#xff0c;如果有一台web服务器宕机#xff0c;或工作出现故障#xff0c;Keepalived将检测到#xff0c;并将有故障的服务器从系统中剔除#xff0c;同时使用其他服务器代替该服务器的工作#xff0c;当服务器工作正常后Keepalived自…Keepalived的作用是检测服务器的状态如果有一台web服务器宕机或工作出现故障Keepalived将检测到并将有故障的服务器从系统中剔除同时使用其他服务器代替该服务器的工作当服务器工作正常后Keepalived自动将服务器加入到服务器群中这些工作全部自动完成不需要人工干涉需要人工做的只是修复故障的服务器。
什么是脑裂
脑裂split-brain指在一个高可用HA系统中当联系着的两个节点断开联系时本来为一个整体的系统分裂为两个独立节点这时两个节点开始争抢共享资源结果会导致系统混乱数据损坏。 对于无状态服务的HA无所谓脑裂不脑裂但对有状态服务(比如MySQL)的HA必须要严格防止脑裂。
那么keepalived是如何解决或者防止脑裂问题的 我们首先要先知道脑裂产生的原因
脑裂产生的原因
一般来说裂脑的发生有以下几种原因
1.高可用服务器对之间心跳线链路发生故障导致无法正常通信。 2.因心跳线坏了包括断了老化。 3. 因网卡及相关驱动坏了ip配置及冲突问题网卡直连。 4. 因心跳线间连接的设备故障网卡及交换机。 5.因仲裁的机器出问题采用仲裁的方案。 6.高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。 7.高可用服务器上心跳网卡地址等信息配置不正确导致发送心跳失败。 8.其他服务配置不当等原因如心跳方式不同心跳广插冲突、软件Bug等。 9.Keepalived配置里同一 VRRP实例如果virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
常见的解决方案
在实际生产环境中我们可以从以下几个方面来防止裂脑问题的发生
同时使用串行电缆和以太网电缆连接同时用两条心跳线路这样一条线路坏了另一个还是好的依然能传送心跳消息。当检测到脑裂时强行关闭一个心跳节点这个功能需特殊设备支持如Stonith、feyce。相当于备节点接收不到心跳消患通过单独的线路发送关机命令关闭主节点的电源。做好对脑裂的监控报警如邮件及手机短信等或值班.在问题发生时人为第一时间介入仲裁降低损失。例如百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障这样解决故障的时间更短.
当然在实施高可用方案时要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务这个损失是可容忍的。
解决keepalived脑裂问题
检测思路正常情况下keepalived的VIP地址是在主节点上的如果在从节点发现了VIP就设置报警信息。脚本在从节点上如下vim split-brainc_check.sh#!/bin/bash
# 检查脑裂的脚本在备节点上进行部署
LB01_VIP192.168.1.229
LB01_IP192.168.1.129
LB02_IP192.168.1.130while true
doping -c 2 -W 3 $LB01_VIP /dev/nullif [ $? -eq 0 -a ip add|grep $LB01_VIP|wc -l -eq 1 ];thenecho ha is brain.elseecho ha is okfisleep 5
done曾经碰到的一个keepalived脑裂的问题如果启用了iptables不设置系统接收VRRP协议的规则就会出现脑裂
曾经在做keepalivedNginx主备架构的环境时当重启了备用机器后发现两台机器都拿到了VIP。这也就是意味着出现了keepalived的脑裂现象检查了两台主机的网络连通状态发现网络是好的。然后在备机上抓包# tcpdump -i eth0|grep VRRP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
22:10:17.146322 IP 192.168.1.54 vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 160, authtype simple, intvl 1s, length 20
22:10:17.146577 IP 192.168.1.96 vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 50, authtype simple, intvl 1s, length 20
22:10:17.146972 IP 192.168.1.54 vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 160, authtype simple, intvl 1s, length 20
22:10:18.147136 IP 192.168.1.96 vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 50, authtype simple, intvl 1s, length 20 抓包发现备机能接收到master发过来的VRRP广播那为什么还会有脑裂现象 接着发现iptables开启着检查了防火墙配置。发现系统不接收VRRP协议。于是修改iptables添加允许系统接收VRRP协议的配置
-A INPUT -i lo -j ACCEPT 自己添加了下面的iptables规则
-A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信
-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP虚拟路由器冗余协通信最后重启iptables发现备机上的VIP没了。
虽然问题解决了但备机明明能抓到master发来的VRRP广播包却无法改变自身状态。只能说明网卡接收到数据包是在iptables处理数据包之前。
预防keepalived脑裂问题
1可以采用第三方仲裁的方法。由于keepalived体系中主备两台机器所处的状态与对方有关。如果主备机器之间的通信出了网题就会发生脑裂此时keepalived体系中会出现双主的情况产生资源竞争。
2一般可以引入仲裁来解决这个问题即每个节点必须判断自身的状态。最简单的一种操作方法是在主备的keepalived的配置文件中增加check配置服务器周期性地ping一下网关如果ping不通则认为自身有问题 。
3最容易的是借助keepalived提供的vrrp_script及track_script实现。如下所示
#vim /etc/keepalived/keepalived.confvrrp_script check_local {script /root/check_gateway.shinterval 5}...... track_script { check_local }脚本内容 # cat /root/check_gateway.sh#!/bin/shVIP$1GATEWAY192.168.1.1/sbin/arping -I em1 -c 5 -s $VIP $GATEWAY /dev/null check_gateway.sh 就是我们的仲裁逻辑发现ping不通网关则关闭keepalived。
推荐自己写脚本
写一个while循环每轮ping网关累计连续失败的次数当连续失败达到一定次数则运行service keepalived stop关闭keepalived服务。 如果发现又能够ping通网关再重启keepalived服务。最后在脚本开头再加上脚本是否已经运行的判断逻辑将该脚本加到crontab里面。