VRRP協議
VRRP,Virtual Router Redundancy Protocol,中文名爲虛擬路由冗餘協議,VRRP的出現就是爲了解決靜態路由的單點故障問題,VRRP是通過一種競選機制來將路由的任務交給某臺VRRP路由器的。
Keepalived高可用對之間是通過VRRP通信的,因此,從VRRP開始講起:
- VRRP,全稱Virtual Router Redundancy Protocol,中文名爲虛擬路由冗餘協議,VRRP的出現是爲了解決靜態路由的單點故障。
- VRRP是通過一種競選協議機制來將路由任務交給某臺VRRP路由器的。
- VRRP用IP多播的方式(默認多播地址(224.0.0.18))實現高可用對之間通信。
- 工作時主節點發包,備節點接包,當備節點接收不到主節點發的數據包的時候,就啓動接管程序接管主節點的資源。備節點可以有多個,通過優先級競選,但一般Keepalived系統運維工作中都是一對。
- VRRP使用了加密協議加密數據,但Keepalived官方目前還是推薦用明文的方式配置認證類型和密碼。
介紹完了VRRP,接下來介紹一下Keepalived服務的工作原理:
它是通過競選機制來確定主備的,主的優先級高於備,因此,工作時主會優先獲得所有的資源,備節點處於等待狀態,當主掛了的時候,備節點就會接管主節點的資源,然後頂替主節點對外提供服務。
在Keepalived服務對之間,只有作爲主的服務器會一直髮送VRRP廣播包,告訴備它還活着,此時備用服務器不會搶佔主,當主服務器不可用時,即備用服務器監聽不到主服務器發送的廣播包時,就會啓動相關服務接管資源,保證業務的連續性。接管速度最快可以小於1秒。
裂腦問題
由於某些原因,導致兩臺高可用服務器對在指定時間內,無法檢測到對方的心跳消息,各自取得資源及服務的所有權,而此時的兩臺高可用服務器對都還活着並在正常運行,這樣就會導致同一個IP或服務在兩端同時存在而發生衝突,最嚴重的是兩臺主機佔用同一VIP(虛擬IP)地址,用戶寫入數據時可能會分別寫入到兩端,這可能會導致服務器兩端數據不一致或造成數據丟失,這種情況就被稱爲裂腦。
一般來說,裂腦的發生,有以下幾種原因:
- 高可用服務器對之間心跳線鏈路發生故障,導致無法正常通信。
- 心跳線壞了(包括斷了,老化)。
- 網卡及相關驅動壞了,IP配置及衝突問題(網卡直連)。
- 心跳線間連接的設備故障(網卡及交換機)。
- 仲裁的機器出問題(採用仲裁的方案)。
- 高可用服務器上開啓了iptables防火牆阻擋了心跳消息傳輸。
- 高可用服務器上心跳網卡地址等信息配置不正確,導致發送心跳失敗。
- 其他服務配置不當等原因,如心跳方式不同,心跳廣播衝突、軟件Bug等。
- Keepalived配置裏同一VRRP實例如果vir-tual_router_id兩端參數配置不一致,也會導致裂腦問題發生。
裂腦解決方案
- 同時使用串行電纜和以太網電纜連接,同時用兩條心跳線路,這樣一條線路壞了,另一個還是好的,依然能傳送心跳消息。
- 當檢測到裂腦時強行關閉一個心跳節點(這個功能需特殊設備支持,如Stonith、fence)。相當於備節點接收不到心跳消息,通過單獨的線路發送關機命令關閉主節點的電源。
- 做好對裂腦的監控報警(如郵件及手機短信等或值班),在問題發生時人爲第一時間介入仲裁,降低損失。例如,百度的監控報警短信就有上行和下行的區別。報警信息發送到管理員手機上,管理員可以通過手機回覆對應數字或簡單的字符串操作返回給服務器,讓服務器根據指令自動處理相應故障,這樣解決故障的時間更短。
keepalived裂腦解決方案
作爲互聯網應用服務器的高可用,特別是前端Web負載均衡器的高可用,裂腦的問題對普通業務的影響是可以忍受的,如果是數據庫或者存儲的業務,一般出現裂腦問題就非常嚴重了。因此,可以通過增加冗餘心跳線路來避免裂腦問題的發生,同時加強對系統的監控,以便裂腦發生時人爲快速介入解決問題。
- 如果開啓防火牆,一定要讓心跳消息通過,一般通過允許IP段的形式解決。
- 可以拉一條以太網網線或者串口線作爲主被節點心跳線路的冗餘。
- 開發監測程序通過監控軟件(例如Nagios)監測裂腦。
下面是生產場景檢測裂腦故障的一些思路:
1)簡單判斷的思想:只要備節點出現VIP就報警,這個報警有兩種情況,一是主機宕機了備機接管了;二是主機沒宕,裂腦了。不管屬於哪個情況,都進行報警,然後由人工查看判斷及解決。
2)比較嚴謹的判斷:備節點出現對應VIP,並且主節點及對應服務(如果能遠程連接主節點看是否有VIP就更好了)還活着,就說明發生裂腦了。