1. 程式人生 > 其它 >解決keepalived腦裂問題

解決keepalived腦裂問題

目錄

一.介紹

腦裂(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
    }
}
本文版權歸作者所有,歡迎轉載,請務必新增原文連結。