解決keepalived腦裂問題
阿新 • • 發佈:2021-12-16
目錄
一.介紹
腦裂(split-brain):指在一個高可用(HA)系統中,當聯絡著的兩個節點斷開聯絡時,本來為一個整體的系統,分裂為兩個獨立節點,這時兩個節點開始爭搶共享資源,例如都去用同一個ip提供網頁服務,結果會導致系統混亂,資料損壞。
對於無狀態服務的HA,無所謂腦裂不腦裂;但對有狀態服務(比如MySQL)的HA,必須要嚴格防止腦裂。
二.產生的原因
-
高可用伺服器對之間心跳線鏈路發生故障,導致無法正常通訊。
-
因心跳線壞了(包括斷了,老化)。
-
因網絡卡及相關驅動壞了,ip配置及衝突問題(網絡卡直連)。
-
因心跳線間連線的裝置故障(網絡卡及交換機)。
-
因仲裁的機器出問題(採用仲裁的方案)。
-
高可用伺服器上開啟了 iptables防火牆阻擋了心跳訊息傳輸。
-
高可用伺服器上心跳網絡卡地址等資訊配置不正確,導致傳送心跳失敗。
-
其他服務配置不當等原因,如心跳方式不同,心跳廣插衝突、軟體Bug等。
提示: Keepalived配置裡同一 VRRP例項如果 virtual_router_id兩端引數配置不一致也會導致裂腦問題發生。
三.解決方案
檢測閘道器
由於keepalived體系中主備兩臺機器所處的狀態與對方有關。如果主備機器之間的通訊出了網題,那就ping閘道器,如果失敗則證明網路有問題,將當前節點關閉,如果成功再開啟。
問題是,當內部mysql所在機器出現網路問題,但是他是給內網提供服務的,這會導致2臺mysql都關閉虛擬ip。
所以可以改改,將兩臺機器互相ping,防止網路問題。
vim check_keepalived.sh
#!/bin/bash #檢測keepalived腦裂指令碼 #ping閘道器失敗2次則關閉keepalived服務,成功2次則啟動 #[使用設定] #閘道器地址或者對方keepalived節點地址,互ping getway_ip=192.168.1.1 #[自帶變數] check_ok=0 check_no=0 while [ 1 ] do ping -c 1 $getway_ip if [[ $? -eq 0 ]];then let check_ok++ else let check_ok++ fi if [[ $check_ok -eq 2 ]];then systemctl start keepalived check_ok=0 elif [[ $check_no -eq 2 ]];then systemctl stop keepalived check_no=0 fi sleep 1 done
更改為單播
將方式改為單播,這樣檢測更加完善
vrrp_instance VI_1 {
state MASTER
interface enp0s8
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#增加部分
unicast_src_ip 192.168.2.41 #本機ip
unicast_peer {
192.168.2.150 #其他機器ip,可多個
}
virtual_ipaddress {
192.168.2.99
}
}
本文版權歸作者所有,歡迎轉載,請務必新增原文連結。