如何解決和預防 Nginx+Keepalived 中會出現的腦裂現象?

2021-03-10 12:01:14

Nginx+Keepalived 的腦裂問題如何處理/預防?

①先複習一下 Keepalived

  • Keepalived 是一款強大的輔助工具,主要提供故障切換和健康檢查功能,實現高可用的效能需求
  • 原理是採用 VRRP(虛擬路由冗餘協定)熱備份協定,以軟體的形式來實現 Linux 伺服器的多機熱備功能,最初是針對 LVS 設計的
  • VRRP 是針對路由器的一種備份解決方案,由多臺路由器組成一個熱備組,通過共同的虛擬 IP 對外提供服務,每個熱備組內在同一時刻,只有一臺 Master 提供服務,其他的路由器(Backup)處於冗餘狀態,唯一需要做的就是監聽 Master 是否出現故障,取而代之(優先順序決定接替的順序),繼承虛擬 IP 地址,又稱之為漂移
  • Keepalived 是一種基於 VRRP 協定的熱備方式,能很好的完成伺服器之間的故障切換,解決了單點故障的問題,每臺熱備組可以有多臺伺服器,最常用的還是雙機熱備(根據虛擬 IP 的漂移來實現),可適用於各種應用服務

②腦裂現象是什麼意思?

腦裂現象出現於高可用架構之中

  • 通過前面的小複習,大家都知道了,在一個高可用的叢集內,Keepalived 內的節點通過監聽對方的存活狀態,若有 Master 宕機,則等待已久的備胎就會上位
  • 但是如果出現了網路故障問題,比如你網線被我拔了,給你戒網癮,這時,節點之間就會突然都監聽不到 Master 的存活狀態,且互相也失去聯絡,這會導致什麼結果?
  • 當然了,我們最親愛的防火牆也有可能導致這種情況的出現~
  • 這樣,在高可用的機制下,節點就會爭相頂替對方,即,導致原來被一個節點存取的資源會被多個節點同時存取,這個過程持續下去,又沒有別的機制來協調與控制,就會有很大機率導致當前存在的資料出現不完整性(這裡我還突然想到了 mysql 的事務特性)
  • 且,對外提供的服務也必然會出現異常!

③如何預防這種現象?

  • 既然在這個高可用叢集之中有一定機率會出現腦裂現象,那麼,最直接能想到的就是通過第三方手段來預防這種現象
  • 比如,在兩個節點之間出現分歧,開始互相爭搶要上位的時候,這時若有一個第三方仲裁性質的機制,就能夠決定到底最終聽誰的
  • 這個第三者,其實很簡單,就是我們萬能的 Shell 指令碼,下面簡單提供一下撰寫思路
1.在負載均衡節點中寫一個 while 迴圈指令碼,每輪迴圈 ping 閘道器,累積連續失敗的次數,當失敗次數達到一定次數則執行 systemctl stop keepalived 關閉服務
2.如果發現又能夠 ping 通了,再來重新啟動服務
3.不忘在指令碼的開頭加上指令碼是否已經執行的邏輯判斷
4.最終將其加入到 crontab 週期計劃性任務裡面定時執行!

在這裡插入圖片描述
蓋亞!!!!