在實(shí)際生產(chǎn)環(huán)境中,我們可以從以下幾個(gè)方面來(lái)防止裂腦問(wèn)題的發(fā)生:
同時(shí)使用串行電纜和以太網(wǎng)電纜連接,同時(shí)用兩條心跳線路,這樣一條線路壞了,另一個(gè)還是好的,依然能傳送心跳消息。
當(dāng)檢測(cè)到裂腦時(shí)強(qiáng)行關(guān)閉一個(gè)心跳節(jié)點(diǎn)(這個(gè)功能需特殊設(shè)備支持,如Stonith、feyce)。相當(dāng)于備節(jié)點(diǎn)接收不到心跳消患,通過(guò)單獨(dú)的線路發(fā)送關(guān)機(jī)命令關(guān)閉主節(jié)點(diǎn)的電源。
做好對(duì)裂腦的監(jiān)控報(bào)警(如郵件及手機(jī)短信等或值班).在問(wèn)題發(fā)生時(shí)人為第一時(shí)間介入仲裁,降低損失。例如,百度的監(jiān)控報(bào)警短倍就有上行和下行的區(qū)別。報(bào)警消息發(fā)送到管理員手機(jī)上,管理員可以通過(guò)手機(jī)回復(fù)對(duì)應(yīng)數(shù)字或簡(jiǎn)單的字符串操作返回給服務(wù)器.讓服務(wù)器根據(jù)指令自動(dòng)處理相應(yīng)故障,這樣解決故障的時(shí)間更短.
當(dāng)然,在實(shí)施高可用方案時(shí),要根據(jù)業(yè)務(wù)實(shí)際需求確定是否能容忍這樣的損失。對(duì)于一般的網(wǎng)站常規(guī)業(yè)務(wù).這個(gè)損失是可容忍的。
多節(jié)點(diǎn)集群中,可以通過(guò)增加仲裁的機(jī)制,確定誰(shuí)該獲得資源,這里面有幾個(gè)參考的思路:
1.增加一個(gè)仲裁機(jī)制。例如設(shè)置參考的IP,當(dāng)心跳完全斷開(kāi)的時(shí)候,2個(gè)節(jié)點(diǎn)各自都ping一下參考的IP,不同則表明斷點(diǎn)就出現(xiàn)在本段,這樣就主動(dòng)放棄競(jìng)爭(zhēng),讓能夠ping通參考IP的一端去接管服務(wù)。
2.通過(guò)第三方軟件仲裁誰(shuí)該獲得資源,這個(gè)在阿里有類似的軟件應(yīng)用
啟用磁盤鎖。正在服務(wù)一方鎖住共享磁盤,腦裂發(fā)生的時(shí)候,讓對(duì)方完全搶不走共享的磁盤資源。但使用鎖磁盤也會(huì)有一個(gè)不小的問(wèn)題,如果占用共享盤的乙方不主動(dòng)解鎖,另一方就永遠(yuǎn)得不到共享磁盤?,F(xiàn)實(shí)中介入服務(wù)節(jié)點(diǎn)突然死機(jī)或者崩潰,另一方就永遠(yuǎn)不可能執(zhí)行解鎖命令。后備節(jié)點(diǎn)也就截關(guān)不了共享的資源和應(yīng)用服務(wù)。于是有人在HA中涉及了“智能”鎖,正在服務(wù)的一方只在發(fā)現(xiàn)心跳線全部斷開(kāi)時(shí)才啟用磁盤鎖,平時(shí)就不上鎖了
報(bào)警報(bào)在服務(wù)器接管之前,給人員處理留足夠的時(shí)間就是1分鐘內(nèi)報(bào)警了,但是服務(wù)器不接管,而是5分鐘之后接管,接管的時(shí)間較長(zhǎng)。數(shù)據(jù)不會(huì)丟失,但就是會(huì)導(dǎo)致用戶無(wú)法寫(xiě)數(shù)據(jù)。報(bào)警后,不直接自動(dòng)服務(wù)器接管,而是由人員接管。
檢查處理腳本(供參考)
注:
1.腳本無(wú)法解決服務(wù)器主備之間因?yàn)榉阑饓?,配置等產(chǎn)生的腦裂問(wèn)題(安裝配置時(shí)注意檢查,keepalived服務(wù)正常運(yùn)行后再加入檢查處理腳本),腳本只能處理自身網(wǎng)絡(luò)問(wèn)題產(chǎn)生的腦裂,必須保證網(wǎng)關(guān)服務(wù)器穩(wěn)定
2.備機(jī)獲取vip有2種情況:A主機(jī)keepalived服務(wù)發(fā)生故障vip漂移(非腦裂);B主機(jī)通信異常vip漂移(腦裂)。
腳本使用機(jī)制(引入第三方仲裁),步驟:
1.查看是否可獲取vip,未獲?。号袛鄈eepalived服務(wù)運(yùn)行狀態(tài),運(yùn)行中不操作,未運(yùn)行重新啟動(dòng),結(jié)束腳本。
2.服務(wù)器周期性地ping一下網(wǎng)關(guān)(第三方仲裁ip地址),如果ping通:判斷keepalived服務(wù)運(yùn)行狀態(tài),運(yùn)行中不操作,未運(yùn)行重新啟動(dòng),結(jié)束腳本;如果ping不通則認(rèn)為自身有問(wèn)題,累計(jì)次數(shù)達(dá)到閾值,關(guān)閉keepalived。
腳本執(zhí)行方式:
1.借助keepalived提供的vrrp_script及track_script實(shí)現(xiàn)(腳本內(nèi)keepalived服務(wù)如果被關(guān)閉,腳本將不在執(zhí)行,重新啟動(dòng)不生效),配置:
... vrrp_scriptcheck_local{ script "/usr/local/src/check_gateway.sh 192.168.1.198" #192.168.1.198 需要檢查的vip interval10#10秒一次 ... track_script{ check_local }
2.linux定時(shí)任務(wù)(查看 tailf /var/spool/mail/root)
crontab -e
#1分1次延遲10秒實(shí)現(xiàn)(時(shí)間自定義)keepalived服務(wù)腦裂腳本 *****sleep10;bash/usr/local/src/check_gateway.sh192.168.1.198
腳本內(nèi)容(根據(jù)實(shí)際環(huán)境修改網(wǎng)關(guān)ip,是否重新啟動(dòng)keepalived服務(wù)):
vim /usr/local/src/check_gateway.sh
#!/bin/bash export PATH=$PATH:/usr/sbin #腦裂檢查及控制:第三方仲裁機(jī)制,使用ping網(wǎng)關(guān)ip方式 #循環(huán)次數(shù) CHECK_TIME=3 #虛擬ip VIP=$1 #網(wǎng)關(guān)ip(根據(jù)實(shí)際環(huán)境修改) GATEWAY=192.168.1.8 #本機(jī)網(wǎng)卡 eth=enp2s0 #服務(wù)器和網(wǎng)關(guān)通信狀態(tài) 0=失敗,1=成功 keepalived_communication_status=1 #是否獲取vip狀態(tài) 0=失敗,1=成功 get_vip_status=1 #keepalived服務(wù)狀態(tài) 0=未運(yùn)行,1=運(yùn)行中 keepalived_service_status=1 #服務(wù)狀態(tài)運(yùn)行中字符串 active_status_str='active (running)' echo "開(kāi)始執(zhí)行腳本 check_gateway.sh $VIP;時(shí)間:" date #查看是否獲取vip狀態(tài) function check_get_vip_status() { #通過(guò)ip add命令查看ip信息,搜索$VIP,統(tǒng)計(jì)行數(shù),是否等于1 if [ $(ip add | grep "$VIP" | wc -l) -eq 1 ]; then get_vip_status=1 else get_vip_status=0 fi return $get_vip_status } #檢查通信狀態(tài) function check_keepalived_status() { #檢測(cè)$VIP 能否ping通$GATEWAY:使用$eth網(wǎng)絡(luò)設(shè)備(-I $eth),發(fā)送數(shù)據(jù)包5(-c 5),源地址$VIP詢問(wèn)目的地[vip] $GATEWAY [網(wǎng)關(guān)地址 公用參考ip](-s $VIP $GATEWAY) 日志不保存 >/dev/null 2>&1 /sbin/arping -I $eth -c 5 -s $VIP $GATEWAY >/dev/null 2>&1 #判斷上一步執(zhí)行結(jié)果 等于0成功 if [ $? = 0 ]; then keepalived_communication_status=1 else keepalived_communication_status=0 fi return $keepalived_communication_status } #檢查keepalived服務(wù)狀態(tài) function check_keepalived_service_status() { #通過(guò)systemctl status keepalived.service命令查看keepalived服務(wù)狀態(tài),搜索$active_status_str,統(tǒng)計(jì)行數(shù),是否等于1 if [ $(systemctl status keepalived.service | grep "$active_status_str" | wc -l) -eq 1 ]; then keepalived_service_status=1 else keepalived_service_status=0 fi return $keepalived_service_status } #循環(huán)執(zhí)行 #判斷$CHECK_TIME 不等于 0 while [ $CHECK_TIME -ne 0 ]; do #執(zhí)行check_get_vip_status獲取get_vip_status check_get_vip_status #未獲取vip if [ $get_vip_status = 0 ]; then #修改CHECK_TIME值 結(jié)束循環(huán) CHECK_TIME=0 #檢查服務(wù)狀態(tài) 執(zhí)行check_keepalived_service_status獲取keepalived_service_status if [ $keepalived_service_status = 0 ]; then echo "執(zhí)行腳本 check_gateway.sh $VIP;啟動(dòng)keepalived服務(wù)" systemctl start keepalived.service fi echo "執(zhí)行腳本 check_gateway.sh $VIP;執(zhí)行結(jié)果:未獲取vip,無(wú)需處理,腳本執(zhí)行結(jié)束,時(shí)間:" date #正常運(yùn)行程序并退出程序 exit 0 fi #$CHECK_TIME = $CHECK_TIME-1 let "CHECK_TIME -= 1" #執(zhí)行check_keepalived_status獲取keepalived_communication_status check_keepalived_status #判斷 $keepalived_communication_status = 1 通信成功 if [ $keepalived_communication_status = 1 ]; then #修改CHECK_TIME值 結(jié)束循環(huán) CHECK_TIME=0 #檢查服務(wù)狀態(tài) 執(zhí)行check_keepalived_service_status獲取keepalived_service_status check_keepalived_service_status if [ $keepalived_service_status = 0 ]; then echo "執(zhí)行腳本 check_gateway.sh $VIP;啟動(dòng)keepalived服務(wù)" systemctl start keepalived.service fi echo "執(zhí)行腳本 check_gateway.sh $VIP;GATEWAY=$GATEWAY,執(zhí)行結(jié)果:通信正常,無(wú)需處理,腳本執(zhí)行結(jié)束,時(shí)間:" date #正常運(yùn)行程序并退出程序 exit 0 fi #通信失敗&&連續(xù)3次 if [ $keepalived_communication_status -eq 0 ] && [ $CHECK_TIME -eq 0 ]; then #關(guān)閉keepalived echo "執(zhí)行腳本 check_gateway.sh $VIP;關(guān)閉keepalived服務(wù)" systemctl stop keepalived.service echo "執(zhí)行腳本 check_gateway.sh $VIP;GATEWAY=$GATEWAY,執(zhí)行結(jié)果:通信失敗&&連續(xù)3次 關(guān)閉keepalived,腳本執(zhí)行結(jié)束,時(shí)間:" date #非正常運(yùn)行程序并退出程序 exit 1 fi sleep 3 done
-
電源
+關(guān)注
關(guān)注
184文章
17486瀏覽量
249166 -
電纜
+關(guān)注
關(guān)注
18文章
2681瀏覽量
54622 -
磁盤
+關(guān)注
關(guān)注
1文章
362瀏覽量
25154
原文標(biāo)題:Keepalived腦裂的解決和預(yù)防(附腳本)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論