首页 > 其他分享 >Keepalived脑裂的解决和预防(附脚本)

Keepalived脑裂的解决和预防(附脚本)

时间:2023-07-28 10:06:14浏览次数:37  
标签:脚本 status service Keepalived keepalived VIP vip 脑裂 check

在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:

同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。

当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。相当于备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源。

做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.

当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务.这个损失是可容忍的。

多节点集群中,可以通过增加仲裁的机制,确定谁该获得资源,这里面有几个参考的思路:

          1.增加一个仲裁机制。例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。        

          2.通过第三方软件仲裁谁该获得资源,这个在阿里有类似的软件应用

启用磁盘锁。正在服务一方锁住共享磁盘,脑裂发生的时候,让对方完全抢不走共享的磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的乙方不主动解锁,另一方就永远得不到共享磁盘。现实中介入服务节点突然死机或者崩溃,另一方就永远不可能执行解锁命令。后备节点也就截关不了共享的资源和应用服务。于是有人在HA中涉及了“智能”锁,正在服务的一方只在发现心跳线全部断开时才启用磁盘锁,平时就不上锁了

报警报在服务器接管之前,给人员处理留足够的时间就是1分钟内报警了,但是服务器不接管,而是5分钟之后接管,接管的时间较长。数据不会丢失,但就是会导致用户无法写数据。报警后,不直接自动服务器接管,而是由人员接管。 

检查处理脚本(供参考)

注:

1.脚本无法解决服务器主备之间因为防火墙,配置等产生的脑裂问题(安装配置时注意检查,keepalived服务正常运行后再加入检查处理脚本),脚本只能处理自身网络问题产生的脑裂,必须保证网关服务器稳定

2.备机获取vip有2种情况:A主机keepalived服务发生故障vip漂移(非脑裂);B主机通信异常vip漂移(脑裂)。

脚本使用机制(引入第三方仲裁),步骤:

1.查看是否可获取vip,未获取:判断keepalived服务运行状态,运行中不操作,未运行重新启动,结束脚本。

2.服务器周期性地ping一下网关(第三方仲裁ip地址),如果ping通:判断keepalived服务运行状态,运行中不操作,未运行重新启动,结束脚本;如果ping不通则认为自身有问题,累计次数达到阈值,关闭keepalived。

脚本执行方式:

1.借助keepalived提供的vrrp_script及track_script实现(脚本内keepalived服务如果被关闭,脚本将不在执行,重新启动不生效),配置:

...
vrrp_script check_local {
script "/usr/local/src/check_gateway.sh 192.168.1.198" #192.168.1.198 需要检查的vip
interval 10 #10秒一次
...
track_script {
check_local
}

 2.linux定时任务(查看 tailf /var/spool/mail/root)

crontab -e

#1分1次 延迟10秒实现(时间自定义) keepalived服务脑裂脚本
* * * * * sleep 10; bash /usr/local/src/check_gateway.sh 192.168.1.198

脚本内容(根据实际环境修改网关ip,是否重新启动keepalived服务):

vim /usr/local/src/check_gateway.sh

#!/bin/bash
export PATH=$PATH:/usr/sbin
#脑裂检查及控制:第三方仲裁机制,使用ping网关ip方式
#循环次数
CHECK_TIME=3
#虚拟ip
VIP=$1
#网关ip(根据实际环境修改)
GATEWAY=192.168.1.8
#本机网卡
eth=enp2s0
#服务器和网关通信状态  0=失败,1=成功
keepalived_communication_status=1
#是否获取vip状态 0=失败,1=成功
get_vip_status=1
#keepalived服务状态 0=未运行,1=运行中
keepalived_service_status=1
#服务状态运行中字符串
active_status_str='active (running)'
echo "开始执行脚本 check_gateway.sh $VIP;时间:"
date
#查看是否获取vip状态
function check_get_vip_status() {
  #通过ip add命令查看ip信息,搜索$VIP,统计行数,是否等于1
  if [ $(ip add | grep "$VIP" | wc -l) -eq 1 ]; then
    get_vip_status=1
  else
    get_vip_status=0
  fi
  return $get_vip_status
}
 
#检查通信状态
function check_keepalived_status() {
  #检测$VIP 能否ping通$GATEWAY:使用$eth网络设备(-I $eth),发送数据包5(-c 5),源地址$VIP询问目的地[vip] $GATEWAY [网关地址 公用参考ip](-s $VIP $GATEWAY) 日志不保存 >/dev/null 2>&1
  /sbin/arping -I $eth -c 5 -s $VIP $GATEWAY >/dev/null 2>&1
  #判断上一步执行结果 等于0成功
  if [ $? = 0 ]; then
    keepalived_communication_status=1
  else
    keepalived_communication_status=0
  fi
  return $keepalived_communication_status
}
 
#检查keepalived服务状态
function check_keepalived_service_status() {
  #通过systemctl status keepalived.service命令查看keepalived服务状态,搜索$active_status_str,统计行数,是否等于1
  if [ $(systemctl status keepalived.service | grep "$active_status_str" | wc -l) -eq 1 ]; then
    keepalived_service_status=1
  else
    keepalived_service_status=0
  fi
  return $keepalived_service_status
}
 
#循环执行
#判断$CHECK_TIME 不等于 0
while [ $CHECK_TIME -ne 0 ]; do
  #执行check_get_vip_status获取get_vip_status
  check_get_vip_status
  #未获取vip
  if [ $get_vip_status = 0 ]; then
    #修改CHECK_TIME值 结束循环
    CHECK_TIME=0
    #检查服务状态 执行check_keepalived_service_status获取keepalived_service_status
    if [ $keepalived_service_status = 0 ]; then
      echo "执行脚本 check_gateway.sh $VIP;启动keepalived服务"
      systemctl start keepalived.service
    fi
 
    echo "执行脚本 check_gateway.sh $VIP;执行结果:未获取vip,无需处理,脚本执行结束,时间:"
    date
    #正常运行程序并退出程序
    exit 0
  fi
  #$CHECK_TIME  = $CHECK_TIME-1
  let "CHECK_TIME -= 1"
  #执行check_keepalived_status获取keepalived_communication_status
  check_keepalived_status
  #判断 $keepalived_communication_status = 1 通信成功
  if [ $keepalived_communication_status = 1 ]; then
    #修改CHECK_TIME值 结束循环
    CHECK_TIME=0
    #检查服务状态 执行check_keepalived_service_status获取keepalived_service_status
    check_keepalived_service_status
    if [ $keepalived_service_status = 0 ]; then
      echo "执行脚本 check_gateway.sh $VIP;启动keepalived服务"
      systemctl start keepalived.service
    fi
 
    echo "执行脚本 check_gateway.sh $VIP;GATEWAY=$GATEWAY,执行结果:通信正常,无需处理,脚本执行结束,时间:"
    date
    #正常运行程序并退出程序
    exit 0
  fi
  #通信失败&&连续3次
  if [ $keepalived_communication_status -eq 0 ] && [ $CHECK_TIME -eq 0 ]; then
    #关闭keepalived
    echo "执行脚本 check_gateway.sh $VIP;关闭keepalived服务"
    systemctl stop keepalived.service
    echo "执行脚本 check_gateway.sh $VIP;GATEWAY=$GATEWAY,执行结果:通信失败&&连续3次 关闭keepalived,脚本执行结束,时间:"
    date
    #非正常运行程序并退出程序
    exit 1
  fi
  sleep 3
done

标签:脚本,status,service,Keepalived,keepalived,VIP,vip,脑裂,check
From: https://blog.51cto.com/u_64214/6878354

相关文章

  • 不错的shell 脚本教程
    [url]http://neoman.iteye.com/blog/1485862[/url]超强视频教程推荐】方老师shell脚本讲座。特别适合新手,也是老手复习的好资料下载地址:(一)shell脚本与应用示例.rmvb:[url]http://szdxr008.qjwm.com/down_2730621.html[/url](二)三剑客--文本处理......
  • Keepalived非抢占模式配置
    Keepalived非抢占模式配置1、前言非抢占模式,这种模式主要是针对主机崩溃,集群已经重新选出新的主机,并且原来的主机重新上线后并不争夺主机的情况。这种模式适合那些倾向于认为崩溃的主机即便上线还是会出现崩溃的场景。这种模式的核心思想是将所有节点的优先级(priority)值设为相......
  • 正点原子Ubuntu入门015---shell脚本入门
    一、什么是shell脚本shell脚本类似于Windows的批处理文件,shell脚本就是将连续执行的命令写成一个文件shell脚本提供数组、循环、条件判断功能。shell脚本一般是Linux运维或者系统管理员要掌握的,作为嵌入式开发人员,只需要掌握基本的命令即可二、shell脚本的写法shell脚......
  • shell 脚本的5种执行方式比较
    方式1:直接运行方式2:使用命令sh或bash方式3:使用命令source或.分类:是否需要执行权限只有方式1需要执行权限。这是因为方式1把脚本作为可执行文件,自然需要执行权限,但方式2和方式3都是把脚本作为命令的参数,可以不具备执行权限是否会创建子进程只有方式3不会创建子进......
  • 一键hook脚本原理
    1.第一个知识点:原型链先拿平时大家最经常hook document.cookie来举个例子。Object.defineProperty(document,”cookie”,{get:function(){},set:function(){}});然后我们需要自己去实现里面的代码逻辑而这个代码又有一个问题。事实上cookie是不在document对象下的Obj......
  • docker run 修改运行的脚本
    DockerRun:修改运行的脚本在使用Docker部署应用程序时,我们经常需要在容器启动时执行一些特定的脚本。Docker提供了dockerrun命令,允许我们修改容器运行时要执行的脚本。本文将介绍如何使用dockerrun命令来修改容器的启动脚本,并提供相应的代码示例。DockerRun命令简介......
  • INNOVUS批量摆放cell array的脚本
    说明:invs_place_cell_array-prefix$prefix-libcell$libcell-hornum$hornum-vernum$vernum-startX$startX-startY$startY-spaceX$spaceX-spaceY$spaceY-orientation$orientation,类似于ICC2中create_cell_array的用法procinvs_place_cell_array{args}{ ......
  • java 调用shell脚本如何传数据进去
    Java调用Shell脚本传递数据的方案在Java程序中调用Shell脚本可以很方便地实现与底层系统交互的功能。但是,如果我们需要将数据传递给Shell脚本进行处理,就需要找到一种合适的方法来实现。本文将介绍一种实用的方法来解决这个问题。方案概述Java程序通过Runtime类的exec方法可以调......
  • SSL 证书过期巡检脚本
    哈喽大家好,我是咸鱼我们知道SSL证书是会过期的,一旦过期之后需要重新申请。如果没有及时更换证书的话,就有可能导致网站出问题,给公司业务带来一定的影响所以说我们要每隔一定时间去检查网站上的SSL证书是否过期如果公司业务体量较大的话,肯定不止一个域名,而一个域名后面又会对......
  • Java SE 6 新特性: 对脚本语言的支持
    [-]脚本引擎ServiceProviderJava脚本API概述脚本引擎脚本引擎就是指脚本的运行环境,它能能够把运行其上的解释性语言转换为更底层的汇编语言,没有脚本引擎,脚本就无法被运行。JavaSE6引入了对JavaSpecificationRequest(JSR)223的支持,JSR223 旨在定义一个统......