keepalived 高可用
Keepalived介紹
Keepalived 軟件起初是專為 LVS 負載均衡軟件設計的,用來管理並監控 LVS 集群系統中各個服務節點的狀態,后來又加入了可以實現高可用的 VRRP 功能。因此,Keepalived除了能夠管理 LVS 軟件外,還可以作為其他服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件。
Keepalived 軟件主要通過 VRRP 協議實現高可用功能的,VRRP 是 Virtual Router Redundancy Protocol (虛擬路由器冗余協議)的縮寫,VRRP 出現的目的就是為了解決動態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷的運行。所以,Keepalived 一方面具有配置管理 LVS 的功能,同時還具有對LVS 下面節點進行健康檢查的功能,另一方面也可以實現系統網絡服務的高可用功能。
Keepalived 軟件的官方站點: http://www.keepalived.org
Keepalived 服務的三個重要功能
1)管理 LVS 負載均衡軟件
早期的 LVS 軟件,需要通過命令行或腳本實現管理,並且沒有針對 LVS 節點的健康檢查功能。為了解決 LVS 的這些使用不便的問題,Keepalived就誕生了,可以說,Keepalived軟件起初是專為了解決 LVS 的問題而誕生的。因此,Keepalived和LVS的感情很深,它們的關系如同夫妻一樣,可以緊密的結合,愉快的工作。Keepalived 可以通過讀取自身的配置文件實現通過更底層的接口直接管理 LVS 的配置以及控制服務的啟動、停止等功能,這使得 LVS 的應用就更加簡單方便了。
2)實現對 LVS 集群節點健康檢查功能(healthcheck)
Keepalived 可以通過在自身的keepalived.conf文件里配置 LVS 的節點 IP 和相關參數實現對 LVS 的直接管理;除此之外,當 LVS 集群中的某一個甚至是幾個節點服務器同時發生故障無法提供服務時,Keepalived 服務會自動將失效的節點服務器從 LVS 的正常轉發隊列中清楚出去,並轉換到別的正常節點服務器上,從而保證最終用戶的訪問不受影響;當故障的節點服務器被修復后,Keepalived 服務又會自動地把它們加入到正常轉發隊列中,對客戶提供服務。
3)作為系統網絡服務的高可用功能(failover)
Keepalived 可以實現任意兩台主機之間,例如 Master 和 Backup 主機之間的故障轉移和自動切換,這個主機可以是普通的不能停機的業務服務器,也可以是 LVS 負載均衡、Nginx 反向代理這樣的服務器。
Keepalived 高可用功能實現的原理為:兩台主機同時安裝好 keepalived 軟件並啟動服務,開始正常工作時,由角色為 Master 的主機獲得所有資源並對用戶提供服務,角色 Backup 的主機作為 Master 主機的熱備;當角色為 Master 的主機失效或出現故障時,角色為 Backup 的主機將自動接管 Master 主機的所有工作,包括接管 VIP 資源及相應資源服務;而當角色為 Master 的主機故障修復后,又會自動接管回它原來處理的工作,角色為 Backup 的主機則同時釋放 Master 主機失效它接管的工作,此時,兩台主機將恢復到最初啟動時各自的原始角色及工作狀態。
Keepalived 高可用故障切換轉移原理(重點)
Keepalived 高可用服務對之間的故障切換轉移,是通過 VRRP 協議(虛擬路由冗余協議)來實現的。
在 Keepalived 服務正常工作時,主 Master 節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備 Backup 節點自己還活着,當主 Master 節點發生故障時,就無法發送心跳消息了,備節點也就因此無法繼續檢測到來自Master 節點的心跳了,進而調用自身的接管程序,接管主 Master 節點的 IP 資源及服務。而當主 Master 節點恢復時,備 Backup 節點又會釋放主節點故障時自身接管的 IP 資源及服務,恢復到原來備用角色。
VRRP協議
VRRP 協議,全稱 Virtual Router Redundancy Protocol,中文名為虛擬路由冗余協議,VRRP 的出現就是為了解決靜態路由的單點故障問題,VRRP 協議是通過一種競選機制來將路由的任務交給某台 VRRP 路由器的。VRRP 協議早期是用來解決交換機、路由器等設備單點故障的。
1)VRRP 原理描述(同樣適用於 Keepalived 的工作原理)
在一組 VRRP 路由器集群中,有多台物理 VRRP 路由器,但是這多台物理的機器並不是同時工作的,而是由一台稱為 MASTER 的機器負責路由工作,其他的機器都是 BACKUP。MASTER 角色並非一成不變,VRRP 協議會讓每個 VRRP 路由參與競選,最終獲勝的就是 MASTER。MASTER 擁有虛擬路由器的 IP 地址,我們把這個 IP 地址稱為 VIP,MASTER 負責轉發發送給網關地址的數據包和響應 ARP 請求。
2)VRRP 是如何工作的?
VRRP 協議通過競選機制來實現虛擬路由器的功能,所有的協議報文都是通過 IP 多播(默認的多播地址:224.0.0.18)形式進行發送。虛擬路由器由 VRID (范圍0-255)和一組 IP 地址組成,對外表現為一個周知的 MAC 地址:00-00-5E-00-01-{VRID}。所以,在一個虛擬路由器中,不管誰是 MASTER,對外都是相同的 MAC 地址和 IP 地址,如果其中一台虛擬路由器宕機,角色發生切換,那么客戶端並不需要因為 MASTER 的變化修改自己的路由設置,可以做到透明的切換。這樣就實現了如果一台機器宕機,那么備用的機器會擁有 MASTER 上的 IP 地址,實現高可用功能。
3)VRRP 是如何通信的?
在一組虛擬路由器中,只有作為 MASTER 的 VRRP 路由器會一直發送 VRRP 廣播包,此時 BACKUP 不會搶占 MASTER 。當 MASTER 不可用時,這個時候 BACKUP 就收不到來自 MASTER 的廣播包了,此時多台 BACKUP 中優先級最高的路由器會去搶占為 MASTER。這種搶占是非常快速的(可能只有1秒甚至更少),以保證服務的連續性。出於安全性考慮,VRRP 數據包使用了加密協議進行了加密。
Keepalived 高可用服務腦裂問題
什么是腦裂?
由於某些原因,導致兩台高可用服務器在指定時間內,無法檢測到對方的心跳消息,各自取得資源及服務的所有權,而此時的兩台高可用服務器都還活着並在正常運行,這樣就會導致同一個 IP 或服務在兩端同時存在發生沖突,最嚴重的是兩台主機占用同一個 VIP 地址,當用戶寫入數據時可能會分別寫入到兩端,這可能會導致服務器兩端的數據不一致或造成數據丟失,這種情況就被稱為腦裂。
導致腦裂發生的原因
一般來說,腦裂的發生,有以下幾種原因:
1)高可用服務器之間心跳線鏈路故障,導致無法正常通信。
- 心跳線壞了(包括斷了,老化)
- 網卡及相關驅動壞了,IP 配置及沖突問題(網卡直連)
- 心跳線連接的設備故障(網卡及交換機)
2)高可用服務器上開啟了 iptables 防火牆阻擋了心跳消息傳輸。
3)高可用服務器上心跳網卡地址等信息配置不正確,導致發送心跳失敗。
4)其他服務配置不當等原因,如心跳方式不同,心跳廣播沖突、軟件 BUG等。
注意:Keepalived 配置里同一 VRRP 實例如果 virtual_router_id 參數兩端配置不一致,也會導致腦裂問題發生。
解決腦裂的具體方案
在實際生產環境中,可以從以下幾個方面來防止腦裂問題的發生
1)同時使用串行電纜和以太網電纜連接,同時用兩條心跳線路,這樣一條線路壞了,另一個還是好的,依然能夠傳送心跳消息
2)當檢測到腦裂時強行關閉一個心跳節點(這個功能需要特殊設備支持,如Stonith、fence)。相當於備節點接收不到心跳消息,發送關機命令通過單獨的線路關閉主節點的電源。
3)做好對腦裂的監控報警(如郵件及手機短信等或值班),在問題發生時人為第一時間介入仲裁,降低損失。例如,百度的監控報警短信就有上行和下行的區別。報警信息報到管理員手機上,管理員可以通過手機回復對應數字或簡單的字符串操作返回給服務器,讓服務器根據指令自動處理相應故障,這樣解決故障的時間更短。
4)如果開啟防火牆,一定要讓心跳消息通過,一般通過允許 IP 段的形式。
Keepalived >>>配置詳解