keepalived腦裂問題與解決


keepalived腦裂問題與解決

Keepalived的作用是檢測服務器的狀態,如果有一台web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。

那么keepalived是如何解決或者防止腦裂問題的?

我們首先要先知道腦裂產生的原因:

腦裂產生的原因:

一般來說,裂腦的發生,有以下幾種原因:

1.高可用服務器對之間心跳線鏈路發生故障,導致無法正常通信。

2.因心跳線壞了(包括斷了,老化)。

3.因網卡及相關驅動壞了,ip配置及沖突問題(網卡直連)。

4.因心跳線間連接的設備故障(網卡及交換機)。

5.因仲裁的機器出問題(采用仲裁的方案)。

6.高可用服務器上開啟了 iptables防火牆阻擋了心跳消息傳輸。

7.高可用服務器上心跳網卡地址等信息配置不正確,導致發送心跳失敗。

8.其他服務配置不當等原因,如心跳方式不同,心跳廣插沖突、軟件Bug等。

9.Keepalived配置里同一 VRRP實例如果virtual_router_id兩端參數配置不一致也會導致裂腦問題發生。

常見的解決方案:

在實際生產環境中,我們可以從以下幾個方面來防止裂腦問題的發生:

同時使用串行電纜和以太網電纜連接,同時用兩條心跳線路,這樣一條線路壞了,另一個還是好的,依然能傳送心跳消息。

當檢測到裂腦時強行關閉一個心跳節點(這個功能需特殊設備支持,如Stonith、feyce)。相當於備節點接收不到心跳消患,通過單獨的線路發送關機命令關閉主節點的電源。

做好對裂腦的監控報警(如郵件及手機短信等或值班).在問題發生時人為第一時間介入仲裁,降低損失。例如,百度的監控報警短倍就有上行和下行的區別。報警消息發送到管理員手機上,管理員可以通過手機回復對應數字或簡單的字符串操作返回給服務器.讓服務器根據指令自動處理相應故障,這樣解決故障的時間更短.

當然,在實施高可用方案時,要根據業務實際需求確定是否能容忍這樣的損失。對於一般的網站常規業務.這個損失是可容忍的。

1、什么是腦裂

腦裂(split-brain):指在一個高可用(HA)系統中,當聯系着的兩個節點斷開聯系時,本來為一個整體的系統,分裂為兩個獨立節點,這時兩個節點開始爭搶共享資源,結果會導致系統混亂,數據損壞。

對於無狀態服務的HA,無所謂腦裂不腦裂;但對有狀態服務(比如MySQL)的HA,必須要嚴格防止腦裂。

2、解決keepalived腦裂問題

檢測思路:正常情況下keepalived的VIP地址是在主節點上的,如果在從節點發現了VIP,就設置報警信息。腳本(在從節點上)如下:

vim split-brainc_check.sh
 
#!/bin/bash
 
# 檢查腦裂的腳本,在備節點上進行部署
 
LB01_VIP=192.168.1.229
 
LB01_IP=192.168.1.129
 
LB02_IP=192.168.1.130
 
while true
 
do
 
  ping -c 2 -W 3 $LB01_VIP &>/dev/null
 
    if [ $? -eq 0 -a `ip add|grep "$LB01_VIP"|wc -l` -eq 1 ];then
 
        echo "ha is brain."
 
    else
 
        echo "ha is ok"
 
    fi
 
    sleep 5
 
done

3、曾經碰到的一個keepalived腦裂的問題(如果啟用了iptables,不設置"系統接收VRRP協議"的規則,就會出現腦裂)

曾經在做keepalived+Nginx主備架構的環境時,當重啟了備用機器后,發現兩台機器都拿到了VIP。這也就是意味着出現了keepalived的腦裂現象,檢查了兩台主機的網絡連通狀態,發現網絡是好的。然后在備機上抓包:

# tcpdump -i eth0|grep VRRP 

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 

listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 

22:10:17.146322 IP 192.168.1.54 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 160, authtype simple, intvl 1s, length 20 

22:10:17.146577 IP 192.168.1.96 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 50, authtype simple, intvl 1s, length 20 

22:10:17.146972 IP 192.168.1.54 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 160, authtype simple, intvl 1s, length 20 

22:10:18.147136 IP 192.168.1.96 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 50, authtype simple, intvl 1s, length 20 

抓包發現備機能接收到master發過來的VRRP廣播,那為什么還會有腦裂現象?

接着發現iptables開啟着,檢查了防火牆配置。發現系統不接收VRRP協議。於是修改iptables,添加允許系統接收VRRP協議的配置:

 -A INPUT -i lo -j ACCEPT 

-----------------------------------------------------------------------------------------

自己添加了下面的iptables規則:

  -A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT    #允許組播地址通信
  -A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT       #允許VRRP(虛擬路由器冗余協)通信

-----------------------------------------------------------------------------------------

最后重啟iptables,發現備機上的VIP沒了。

雖然問題解決了,但備機明明能抓到master發來的VRRP廣播包,卻無法改變自身狀態。只能說明網卡接收到數據包是在iptables處理數據包之前。

4、預防keepalived腦裂問題

(1)可以采用第三方仲裁的方法。由於keepalived體系中主備兩台機器所處的狀態與對方有關。如果主備機器之間的通信出了網題,就會發生腦裂,此時keepalived體系中會出現雙主的情況,產生資源競爭。

(2)一般可以引入仲裁來解決這個問題,即每個節點必須判斷自身的狀態。最簡單的一種操作方法是,在主備的keepalived的配置文件中增加check配置,服務器周期性地ping一下網關,如果ping不通則認為自身有問題 。

(3)最容易的是借助keepalived提供的vrrp_script及track_script實現。如下所示:

#vim /etc/keepalived/keepalived.conf
  ......
  vrrp_script check_local {
  script "/root/check_gateway.sh"
  interval 5
  }
  ...... 
  track_script {  
  check_local        
  }
  腳本內容:
  \# cat /root/check_gateway.sh
  \#!/bin/sh
  VIP=$1
  GATEWAY=192.168.1.1
  /sbin/arping -I em1 -c 5 -s $VIP $GATEWAY &>/dev/null  
  check_gateway.sh 就是我們的仲裁邏輯,發現ping不通網關,則關閉keepalived。

5、推薦自己寫腳本

寫一個while循環,每輪ping網關,累計連續失敗的次數,當連續失敗達到一定次數則運行service keepalived stop關閉keepalived服務。

如果發現又能夠ping通網關,再重啟keepalived服務。最后在腳本開頭再加上腳本是否已經運行的判斷邏輯,將該腳本加到crontab里面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM