高可用服务器裂脑问题

1 什么是裂脑

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端数据不一致或造成数据丢失,这种情况被成为裂脑。

2 导致裂脑发生的原因
一般来说,裂脑的发生,有一下几种原因。

     @高可用服务器对之间心跳线链路故障,导致无法正常通信
                   心跳线坏了(包括断了,老化)
                   网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
                   心跳线间连接的设备故障(网卡及交换机)
                   仲裁的机器出问题(采用仲裁的方案)
      @高可用服务器对上开启了iptables防火墙阻挡了心跳消息传输
      @高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败
      @其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件BUG等
   提示:keepalived配置里同一VRRP示例如果virtual_router_id参数两端配置不一致,也会导致裂脑问题发生。

3 解决裂脑的常见方案
在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生。

    #1  同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路,另一个还是好的,依然能传送心跳消息
    #2  当检测到裂脑时强行关闭一个心跳节点(这个功能需要特殊设备支持,如Stonith,fence)。相当于设备节点接收不到心跳消息,发送关机命令通过单独的线路关闭主节点的电源
    #3  做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发送时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警信息报到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器,让服务器根据指令自动处理相应故障,这样解决故障的时间更短
  当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对应一般的网站常规业务,这个损失时可容忍的

4 常见的解决Keepalived裂脑的方案
作为互联网应用服务器的高可用,特别时前端Web负载均衡器的高可用,裂脑的问题对普通业务的影响是可以容忍的,如果是数据库或者存储的业务,一般出现裂脑的问题就非常严重了。因此,可以通过增加冗余心跳线路来避免裂脑问题的发生,同时加强对系统的监控,以便裂脑发生时人为快速介入解决问题

       #如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
       #可以拉一条以太网网线或者串口线作为主被节点心跳的冗余
       #开发监测程序通过监控软件(例如nagios)检测裂脑

下面是生产场景检测裂脑故障的一些思路:

 1)简单判断的思路:只要备节点出现VIP就报警,这个报警有两种情况,一是主机宕机了备机接管了;二是主机没宕,裂脑了,不管属于哪个情况,都进行报警,然后由人工查看判断及解决
 2) 比较严谨的判断:备节点出现对应VIP,并且主节点及对应服务(如果能远程连接主节点看是否有VIP就更好了)还活着,就说明发生裂脑了

5.nginx服务宕机,但是服务器没宕,如何保证高可用切换。
思路:监控nginx服务状态,如果不正常,就停掉keepalived或者halt
实现上述思路还有两种方法
1.守护进程
2.keepalived配置
vrrp_script chk_nginx_proxy {
script “/server/scripts/check_web_proxy.sh”
interval 2
weight 2
}

或者在keepalived的实例配置里添加:
vrrp_instance VI_1 {
state MASTER
interface eth2
virtual_router_id 51
。。。。。。。。
track_script {
check_w_proxy
}
}

====================================================
cat chk_nginx_proxy.sh

#!/bin/sh
while true
do
nginxpid=ps -C nginx --no-header |wc -l
if [ $nginxpid -eq 0 ]; then
/application/nginx/sbin/nginx
sleep 5
nginxpid=ps -C nginx --no-header|wc -l
if [ $nginxpid -eq 0 ]; then
/etc/init.d/keepived stop
exit 1
fi
fi
sleep 5
done

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值