CentOS 7 Keepalive 脚本不执行解决

问题

起因是在测试部署 Altls + Keepalive 高可用读写分离,测试停止Atlas服务的时候,发现Keepalive不会自动主从切换,就是Keepalive还是正常运行,vip并没有被slave接管。

也就是文章: centos 7 Atlas keepalived 实现高可用 MySQL 5.7 MHA环境读写分离

后来通过查询,发现解决,这里总结一下(文章中的问题已经被解决)。

一共发现两种问题

  • 括号问题
  • 脚本名称有问题

问题一 括号问题

第一个问题就是keepalive中配置的脚本不自动执行

首先需要检查脚本是否有问题,也就是需要手动执行脚本是否正常

首先需要检查脚本是否有问题,也就是需要手动执行脚本是否正常

以上述文章中的案例

! Configuration File for keepalived

global_defs {
   router_id mysql_proxy_196
}

vrrp_script chk_atlas_proxy    # 这里的大括号'{' 不能放在这里行,要换行顶头,前面不能有空格
{
    script "/etc/keepalived/che_atlas.sh"
    interval 2
    weight -2
}   # 这里的大括号前面也不能有空格

vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 151
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.20.198/24 dev bond0 label bond0:1
    }
    track_script {
        chk_atlas_proxy
    }
}

做到上述,基本上就可以了


问题二 脚本名称问题

以 Nginx + keepalive 高可用为案例

脚本名称为: check_nginx.sh

脚本内容

if [ `ps aux | grep nginx | grep -v grep | wc -l` -ne 3 ];then
systemctl stop keepalived
fi

如果在Keepalive配置文件中配置是下面的配置,会发现keepalive启动不了,查看message日志,启动后,就会立马被停止。

这里的问题经常性的被忽略,根据脚本的判断,nginx主进程加上ngxin的线程不等于3的时候,就会停止keepalive

手动执行ps 命令的时候,没问题,也是3个

有一个问题大家想过没有,当keepalive启动后,会执行check_nginx.sh脚本,而ps命令中的grep命令筛选条件是nginx,而脚本名称中包含nginx,当keepalive执行check_nginx.sh脚本的时候,也会产生一个进程,其中就包含nginx的字符,同样会被脚本中的grep命令当做条件筛选出来,那么if判断就会生效,执行if内部的命令

这么说应该明白了吧。。。。不明白博客下面有我扣扣。。。。

所以要解决这个问题,要么更换if条件,要么更换脚本名称,建议更换脚本名称为check_ngx.sh,这样问题就迎刃而解了。

原文地址:https://www.cnblogs.com/winstom/p/11045286.html