原創地址:https://blog.csdn.net/wdirdo/article/details/103011816
**
腦裂(split-brain)
**
指在一個高可用(HA)系統中,當聯繫着的兩個節點斷開聯繫時,本來爲一個整體的系統,分裂爲兩個獨立節點,這時兩個節點開始爭搶共享資源,結果會導致系統混亂,數據損壞。
對於無狀態服務的HA,無所謂腦裂不腦裂;但對有狀態服務(比如MySQL)的HA,必須要嚴格防止腦裂。(但有些生產環境下的系統按照無狀態服務HA的那一套去配置有狀態服務,結果可想而知…)
**
keepalived腦裂產生原因
**
①master node和backup node心跳線鏈路發生故障,導致無法正常通信。
②master node和backup node開啓了iptables防火牆阻擋了心跳消息傳輸。
③master node和backup node心跳網卡地址等信息配置不正確,導致發送心跳失敗。
④其他服務配置不當等原因,如心跳方式不同,心跳廣插衝突、軟件Bug等。
⑤Keepalived配置裏同一 VRRP實例如果virtual_router_id兩端參數配置不一致也會導致裂腦問題發生。
**
keepalived腦裂的解決辦法
**
(1)硬件設施網線:
同時使用串行電纜和以太網電纜連接,同時用兩條心跳線路,這樣一條線路壞了,另一個還是好的,依然能傳送心跳消息。
(2)劃分一個專門的VLAN用於master node和backup node發送心跳
**
keepalived腦裂解決方案
**
在備機執行監控,監控腳本如下
#!/bin/bash
#檢查sprit-brain,在備節點執行
#set -x
LB01_VIP=10.110.60.166
LB01_IP=10.110.60.181
LB02_IP=10.110.60.191
#循環VIP是否可用,如果不可用讓備節點啓動VIP地址
while true
do
ping -c 2 -W 3 $LB01_VIP &> /dev/null
if [[ $? -eq 0 && `ip add | grep "$LB01_VIP" | wc -l` -eq 1 ]];then
echo "=======ha is split-brain========"
echo "=======TODO 告警,執行備機切換========"
break
else
echo "=======ha is ok========"
fi
sleep 5
done
#function ping_test(){
# ping -c 1 -w 3 $1 &>/dev/null
# if [[ $? -eq 0 ]]; then
# echo $1 "ping 測試success"
# else
# echo $1 "ping 測試failed"
# fi
#}
#ip_list=(10.110.60.181 10.110.60.192)
#for (( i = 0; i < ${#ip_list[@]}; i++ )); do
# ping_test ${ip_list[i]}
#done