问题
起因是在测试部署 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
,这样问题就迎刃而解了。