問題
起因是在測試部署 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
,這樣問題就迎刃而解了。