mysql keepalive 脑裂_keepalived 预防脑裂检测脚本

本文介绍了一种针对Keepalived环境下脑裂现象的检测方法。通过部署脚本在备节点上持续监控VIP漂移情况,一旦发现VIP出现在备节点,则触发警告。此外,还提供了一个定时ping网关的脚本示例。

1 检查vip

[root@mysql2 keepalived]# cat /etc/keepalived/check_brain_keepalived.sh

#!/bin/bash

# 检查脑裂的脚本,在备节点上进行部署

LB01_VIP=*

LB01_IP=*

LB02_IP=*

while true

do

ping -c 2 -W 3 $LB01_VIP &>/dev/null

if [ $? -eq 0 -a `ip add|grep "$LB01_VIP"|wc -l` -eq 1 ];then

echo "ha is brain."

else

echo "ha is ok"

fi

sleep 5

done

运行脚本,在备节点(keepalived的备),不是mysql的备节点

[root@mysql2 keepalived]# ./check_brain_keepalived.sh

ha is ok

ha is ok

由于在M-M+Keepalived环境中,脑裂是一个始终存在的问题,因为vip的存在,这里提供一个脚本进行检查,检查vip漂移到备节点

发现backup有vip就发警告,此脚本部署在backup机器上

2 定时ping网关的方法

[root@mysql1 keepalived]# /sbin/arping -I ens192 -c 5 -s * *

#!/bin/bash

host=127.0.0.1

CHECK_TIME=3

VIP=*

GATEWAY=*

eth=ens192

#mysql is working MYSQL_IS_OK is 1 , mysql down MYSQL_IS_OK is 0

keepalived_IS_OK=1

function check_keepalived_status (){

/sbin/arping -I $eth -c 5 -s $VIP $GATEWAY >/dev/null 2>&1

if [ $? = 0 ] ;then

keepalived_IS_OK=1

else

keepalived_IS_OK=0

fi

return $keepalived_IS_OK

}

while [ $CHECK_TIME -ne 0 ]

do

let "CHECK_TIME -= 1"

check_keepalived_status

if [ $keepalived_IS_OK = 1 ] ; then

CHECK_TIME=0

#/bin/systemctl stop keepalived

echo 1

exit 0

fi

if [ $keepalived_IS_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]

then

/bin/systemctl stop keepalived

echo 0

exit 1

fi

sleep 3

done

keepalived的脑裂问题

keepalived的脑裂问题 学习了:http://blog.51cto.com/10630401/2089847 split-brain 无HA不脑裂

keepalived 检测脑裂切换脚本

#!/bin/bash count=0 run1=`curl -I 192.168.30.12:8000 | grep "200 OK" | wc -l` run2=`curl - ...

split-brain 脑裂问题(Keepalived)

脑裂(split-brain)指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏.对于无状 ...

解决keepalived脑裂问题

检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息 脚本如下: #!/bin/bash # 检查脑裂的脚本,在备节点上进行部署 LB01_VI ...

Keepalived脑裂

问题描述:开启防火墙后,Keepalived出现脑裂. 背景架构:两台centos7通过Keepalived实现高可用 问题具体表现形式:两台主机通过ip addr (ip  a)查看,发现两台主机都 ...

keepalived脑裂问题查找

在自己环境做keepalived+redis实验时,当重启了备用redies机器后,发现两台redies主机都拿到了VIP [root@redis2 ~]# ip addr list 1: lo: & ...

记一次keepalived脑裂问题查找

在自己环境做keepalived+Redis实验时,当重启了备用redies机器后,发现两台redies主机都拿到了VIP [root@redis2 ~]# ip addr list 1: lo: & ...

keepalive脑裂的处理,从节点发现访问的虚拟IP就报警,同时尝试发送内容到主节点服务器关闭keepalive和nginx,或者关机

解决keepalived脑裂问题   检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息 脚本如下: 1 2 3 4 5 6 7 8 9 10 ...

keepalive和脑裂问题

keepalive keepalive起初专门为lvs负载均衡软件设计的,用来管理监控lvs集群系统中各个服务节点的状态,后来又加入了可以实现高可用的vrrp功能. keepalive软件通过vrrp ...

随机推荐

loadrunner 的Administration Page页面设置

工作中用到Loadrunner不是很多,能够简单用用,深入的知识还得靠自己空余时自学.对于loadrunner 的Administration Page页面设置,我的理解是给自己设置各种障碍,然后一个 ...

洛谷P1738 洛谷的文件夹

原题目:点我 题目是一个略水的题,我机制地用面向对象做了...所以代码量急剧加大,100行233 模拟即可,字符串处理麻烦点.如果没有找到子文件夹就新建文件夹,如果有就进入该文件夹. 提示:高能,指针 ...

[JS] 面向对象的5种写法和拓展JS对象的写法

面向对象的JAVA  最开始当然是对象的定义了 收集了以下的五种写法 //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; C ...

使用NIO提升性能

NIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标准. 具有以下特性: 传统Java IO,它是阻塞的,低效的.那么Java NIO和传统Java ...

nginx的优缺点

1.nginx相对于apache优点: 轻量级同样起web 服务比apache占用更少内存及资源 抗并发nginx 处理请求异步非阻塞而apache 则阻塞型高并发下nginx 能保持低资源低消耗高性 ...

javascript高级特性(面向对象)

javascript高级特性(面向对象): * 面向对象: * 面向对象和面向过程的区别: * 面向对象:人就是对象,年龄\性别就是属性,出生\上学\结婚就是方法. * 面向过程:人出生.上学.工作. ...

关于android:screenOrientation="portrait" 横竖屏切换

当在AndroidManifest.xml文件中定义了android:screenOrientation="portrait",就表示当我们切换横竖屏的时候,屏幕的内容始终以竖屏显 ...

C#获取设备的IP和Mac类

/// /// 此类用于获得设备的Ip和Mac /// public class Mac { [DllImport("Iph ...

SZU:A25 Favorite Number

Judge Info Memory Limit: 32768KB Case Time Limit: 10000MS Time Limit: 10000MS Judger: Number Only Ju ...

php定时执行操作及ob_flush()与flush()的使用

版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.youkuaiyun.com/qq_38125058 一: 每隔30s执行一次,将字符串写入文件 // 30秒执行一次 ignore_ ...

<think>我们想要编写一个Keepalived检测脚本,用于监控多个Keepalived实例的Master状态。这个脚本的目标是定期检查每个配置的Keepalived实例(例如VI_1, VI_2等)的当前状态是否为MASTER,并根据检查结果进行一些操作(比如报警、日志记录等)。 注意:Keepalived本身提供了状态检测脚本的功能(通常用于检测服务的健康状态),但这里我们需要的是检测Keepalived实例自身的状态(即该节点当前是MASTER还是BACKUP状态)。 然而,Keepalived实例的状态信息通常可以通过以下方式获取: 1. 通过系统日志(/var/log/syslog或/var/log/messages)中查找。 2. 通过ipvsadm命令(但ipvsadm主要用于LVS状态,不直接反映VRRP实例状态)。 3. 通过查看Keepalived的运行时状态文件(如果配置了状态文件输出)或使用keepalived的套接字接口(如果启用)。 实际上,Keepalived在运行时会在内存中维护状态,我们可以通过配置vrrp_track_file或者使用keepalived的控制接口(通过unix域套接字)来获取状态。 但是,更简单的方法是利用Keepalived的notify机制将状态写入文件,然后我们的脚本读取这些文件来获取状态。 具体步骤: 方案一:利用notify机制将每个实例的状态写入单独的状态文件 在Keepalived配置文件中,为每个vrrp_instance配置notify_state(或者notify_master, notify_backup, notify_fault)脚本,将当前状态写入一个文件。 例如: vrrp_instance VI_1 { ... notify_master "/etc/keepalived/state.sh VI_1 MASTER" notify_backup "/etc/keepalived/state.sh VI_1 BACKUP" notify_fault "/etc/keepalived/state.sh VI_1 FAULT" } 然后,state.sh脚本可以这样写: #!/bin/sh echo $2 > /var/run/keepalived_$1.state 这样,每个实例的状态会被实时更新到对应的状态文件。 然后,我们编写一个检测脚本(比如check_keepalived_state.sh)来读取这些状态文件,检查每个实例的状态。 方案二:直接通过keepalived的套接字查询(需要启用控制接口) 在keepalived.conf中配置: vrrp_script check_keepalived_socket { script "[[ -S /var/run/keepalived.sock ]]" interval 2 } global_defs { enable_script_security script_user root vrrp_username root } vrrp_instance VI_1 { ... use_vmac [optional] vrrp_track_process [optional] } 然后,通过发送命令到套接字来查询状态。但这种方法比较复杂,需要解析返回的JSON。 考虑到简单性,我们采用方案一。 下面我们具体实现: 步骤1:修改keepalived配置文件,为每个实例添加notify状态脚本 步骤2:创建状态写入脚本(/etc/keepalived/state.sh) 步骤3:创建检测脚本(/etc/keepalived/check_keepalived_state.sh)来检查这些状态文件 注意:状态文件的位置,我们放在/var/run/目录下(因为该目录是内存文件系统,重启会丢失,但keepalived状态变化时会重新写入)。 检测脚本的目标: - 检查每个实例的状态是否为MASTER - 如果某个实例的状态不是MASTER(而是BACKUP或FAULT),则进行报警或记录日志(这里我们以日志为例) 下面我们编写脚本: 1. 状态写入脚本(/etc/keepalived/state.sh): ```bash #!/bin/sh # 参数1:实例名称,参数2:状态 # 将状态写入文件 echo $2 > /var/run/keepalived_$1.state ``` 2. 检测脚本(/etc/keepalived/check_keepalived_state.sh): ```bash #!/bin/bash # 定义要监控的实例列表 INSTANCES=("VI_1" "VI_2") # 根据实际情况修改 # 日志文件 LOG_FILE="/var/log/keepalived_state_check.log" # 当前时间 TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') # 检查每个实例的状态 for INSTANCE in "${INSTANCES[@]}"; do STATE_FILE="/var/run/keepalived_${INSTANCE}.state" if [ -f "$STATE_FILE" ]; then STATE=$(cat "$STATE_FILE") if [ "$STATE" == "MASTER" ]; then echo "$TIMESTAMP [INFO] Instance $INSTANCE is MASTER." >> "$LOG_FILE" else echo "$TIMESTAMP [ERROR] Instance $INSTANCE is in $STATE state!" >> "$LOG_FILE" # 这里可以添加报警动作,比如发送邮件、短信等 fi else echo "$TIMESTAMP [ERROR] State file for $INSTANCE not found!" >> "$LOG_FILE" fi done ``` 3. 将检测脚本加入crontab,定期执行(比如每分钟一次): 在crontab中添加: ```cron * * * * * /bin/bash /etc/keepalived/check_keepalived_state.sh ``` 4. 确保脚本有执行权限: ```bash chmod +x /etc/keepalived/state.sh chmod +x /etc/keepalived/check_keepalived_state.sh ``` 5. 重启keepalived服务使配置生效。 注意:如果系统重启,/var/run/目录下的状态文件会丢失,直到keepalived状态发生变化才会重新生成。因此,在keepalived启动时,我们可以通过notify_state在初始状态时写入文件。 在keepalived配置中,我们还可以使用: notify_state "/etc/keepalived/state.sh VI_1 $STATE" 但是,在旧版本中可能不支持notify_state,所以我们可以分别配置notify_master, notify_backup, notify_fault。 另外,在keepalived配置中,我们也可以使用notify_stop脚本,在keepalived停止时清理状态文件。 但是,为了简单,我们只使用notify_master, notify_backup, notify_fault。 补充:在keepalived配置文件中,每个实例的配置示例: ``` vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100/24 } notify_master "/etc/keepalived/state.sh VI_1 MASTER" notify_backup "/etc/keepalived/state.sh VI_1 BACKUP" notify_fault "/etc/keepalived/state.sh VI_1 FAULT" # 如果keepalived停止,我们可以使用notify_stop来清除状态(可选) notify_stop "/etc/keepalived/state.sh VI_1 STOP" } ``` 这样,当实例状态变化时,状态文件就会被更新。 最后,我们的检测脚本会定期检查这些状态文件,并记录日志。 注意:如果某个实例的状态是BACKUP,这可能是正常的(因为同一时间只有一个MASTER),所以报警需要根据实际情况考虑。例如,我们可能只关心某个特定的实例是否成为MASTER,或者我们可能希望所有实例都应该是MASTER(在多个VIP独立漂移的情况下,但通常不会这样配置,因为多个实例通常在同一节点上同时为MASTER或BACKUP)。 因此,这个脚本的报警逻辑可以根据实际需求调整。比如,我们可能只关心某个关键实例(如VI_1)的状态,如果它不在MASTER状态就报警。 另外,在双主或者多主的配置中,可能每个实例的MASTER分布在不同的节点上,那么我们的报警逻辑就需要更加复杂,需要知道每个实例期望在哪个节点上是MASTER。 这里我们只实现了基本的状态监控和日志记录。 相关问题: 1. 如何配置Keepalived以实现多个VIP的联动漂移? 2. Keepalived的健康检测脚本如何编写? 3. 如何防止Keepalived脑裂? 4. 在云环境中部署Keepalived有哪些注意事项? 5. Keepalived与Docker或Kubernetes如何集成?</think>以下是一个用于监控多个Keepalived实例Master状态的检测脚本实现方案,结合引用内容中的关键点进行设计: ### 脚本功能说明 1. 实时监控多个Keepalived实例的Master状态 2. 当实例状态异常时自动记录日志 3. 支持自定义报警机制 4. 可集成到Keepalived健康检测系统中 ```bash #!/bin/bash # keepalived_multi_monitor.sh - 监控多个Keepalived实例的Master状态 # 用法:在keepalived配置中通过vrrp_script调用 # 配置需要监控的实例名称(与keepalived.conf中的vrrp_instance名称一致) INSTANCES=("VI_1" "VI_2" "VI_3") # 状态文件存储路径 STATUS_DIR="/var/run/keepalived" # 日志文件 LOG_FILE="/var/log/keepalived_status.log" # 创建状态目录 mkdir -p $STATUS_DIR # 检查实例状态函数 check_instance_status() { local instance=$1 local status_file="${STATUS_DIR}/${instance}.status" # 获取当前实例状态(通过keepalived状态文件) if [ -f "/tmp/keepalived.${instance}.status" ]; then current_state=$(awk '/^State/{print $2}' /tmp/keepalived.${instance}.status) else current_state="UNKNOWN" fi # 检查状态变化 if [ -f "$status_file" ]; then last_state=$(cat $status_file) if [ "$current_state" != "$last_state" ]; then log_status "状态变化: $instance 从 $last_state 变为 $current_state" echo $current_state > $status_file # 添加报警触发点(邮件/短信等) # send_alert "$instance 状态变化: $last_state → $current_state" fi else echo $current_state > $status_file log_status "初始状态: $instance = $current_state" fi # 验证Master状态 if [ "$current_state" == "MASTER" ]; then # 检查实际服务状态(示例:Nginx) if ! pgrep -x "nginx" >/dev/null; then log_status "WARNING: $instance 是MASTER但Nginx未运行!" return 1 fi return 0 else log_status "INFO: $instance 当前状态 $current_state" return 0 fi } # 日志记录函数 log_status() { echo "[$(date '+%Y-%m-%d %T')] $1" >> $LOG_FILE } # 主循环检查所有实例 for instance in "${INSTANCES[@]}"; do check_instance_status $instance # 如果检测失败可触发优先级调整(用于VIP漂移) if [ $? -ne 0 ]; then exit 1 # 返回非0触发keepalived优先级调整[^3][^4] fi done exit 0 ``` ### 配置步骤 1. **保存脚本** ```bash sudo nano /etc/keepalived/keepalived_multi_monitor.sh sudo chmod +x /etc/keepalived/keepalived_multi_monitor.sh ``` 2. **修改Keepalived主配置** 在`keepalived.conf`中添加: ```nginx vrrp_script chk_multi_instances { script "/etc/keepalived/keepalived_multi_monitor.sh" interval 3 # 每3秒检测一次 weight -20 # 检测失败时权重降低20[^3] } vrrp_instance VI_1 { ... track_script { chk_multi_instances } } vrrp_instance VI_2 { ... track_script { chk_multi_instances } } ``` 3. **启用状态文件**(可选) 在每个实例配置中添加: ```nginx vrrp_instance VI_1 { ... state_file "/tmp/keepalived.VI_1.status" } ``` ### 功能验证 ```bash # 手动测试脚本 sudo /etc/keepalived/keepalived_multi_monitor.sh # 查看日志 tail -f /var/log/keepalived_status.log # 模拟服务故障 sudo systemctl stop nginx # 观察日志和VIP漂移情况 ``` ### 关键特性说明 1. **多实例监控** 通过`INSTANCES`数组配置需要监控的实例名称,灵活扩展 2. **状态变化检测** 记录实例状态变化历史,避免频繁报警[^5] 3. **服务状态验证** 当实例处于MASTER状态时,自动验证实际服务(如Nginx)是否正常运行[^4] 4. **联动机制** 返回非0状态码触发Keepalived优先级调整,实现VIP漂移[^3] 5. **云环境适配** 通过权重调整而非直接停止服务,适应云环境限制[^5] --- ### 相关问题 1. Keepalived在MASTER节点服务恢复后如何避免VIP不回切?[^5] 2. 如何扩展此脚本以支持Kubernetes中的Keepalived部署? 3. Keepalived与Nginx/Haproxy集成时有哪些最佳监控实践?[^2][^4] 4. 在跨机房部署中如何优化Keepalived检测灵敏度? 5. Keepalived的`nopreempt`参数在高可用场景中的实际作用是什么?[^5] [^1]: Keepalived集成了LVS功能和心跳检测能力 [^2]: 通过脚本实现Nginx存活检测可构建完整高可用方案 [^3]: 检测脚本需部署到所有节点并设置可执行权限 [^4]: Keepalived的价值依赖于实际服务的健康状态监控 [^5]: 在多个Master节点配置中需合理设置优先级和抢占策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值