heartbeat——高可用集群介紹
Heartbeat 項目是 Linux-HA 工程的一個組成部分,它實現了一個高可用集群系統。心跳服務和集群通信是高可用集群的兩個關鍵組件,在 Heartbeat 項目里,由 heartbeat 模塊實現了這兩個功能。
heartbeat
高可用集群是指一組通過硬件和軟件連接起來的獨立計算機,它們在用戶面前表現為一個單一系統,在這樣的一組計算機系統內部的一個或者多個節點停止工作,服務會從故障節點切換到正常工作的節點上運行,不會引起服務中斷。從這個定義可以看出,集群必須檢測節點和服務何時失效,何時恢復為可用。這個任務通常由一組被稱為“心跳”的代碼完成。在Linux-HA里這個功能由一個叫做heartbeat的程序完成。
Heartbeat通過插件技術實現了集群間的串口、多播、廣播和組播通信,在配置的時候可以根據通信媒介選擇采用的通信協議,heartbeat啟動的時候檢查這些媒介是否存在,如果存在則加載相應的通信模塊。這樣開發人員可以很方便地添加新的通信模塊,比如添加紅外線通信模塊。
對于高可用集群系統,如果集群間的通信不可靠,那么很明顯集群本身也不可靠。Heartbeat采用UDP協議和串口進行通信,它們本身是不可靠的,可靠性必須由上層應用來提供。那么怎樣保證消息傳遞的可靠性呢?
Heartbeat通過冗余通信通道和消息重傳機制來保證通信的可靠性。Heartbeat檢測主通信鏈路工作狀態的同時也檢測備用通信鏈路狀態,并把這一狀態報告給系統管理員,這樣可以大大減少因為多重失效引起的集群故障不能恢復。例如,某個工作人員不小心撥下了一個備份通信鏈路,一兩個月以后主通信鏈路也失效了,系統就不能再進行通信了。通過報告備份通信鏈路的工作狀態和主通信鏈路的狀態,可心完全避免這種情況。因為這樣在主通信鏈路失效以前,就可以檢測到備份工作鏈路失效,從而在主通信鏈路失效前修復備份通信鏈路。
Heartbeat通過實現不同的通信子系統,從而避免了某一通信子系統失效而引起的通信失效。最典型的就是采用以太網和串口相結合的通信方式。這被認為是當前的最好實踐,有幾個理由可以使我們選擇采用串口通信:
(1)IP通信子系統的失效不太可能影響到串口子系統。(2)串口不需要復雜的外部設備和電源。
(3)串口設備簡單,在實踐中非??煽?。
(4)串口可以非常容易地專用于集群通信。
(5)串口的直連線因為偶然性掉線事件很少。
不管是采用串口還是以太網IP協議進行通信,heartbeat都實現了一套消息重傳協議,保證消息包的可靠傳遞。實現消息包重傳有兩種協議,一種是發送者發起,另一種是接收者發起。
對于發送者發起協議,一般情況下接收者會發送一個消息包的確認。發送者維護一個計時器,并在計時器到時的時候重傳那些還沒有收到確認的消息包。這種方法容易引起發送者溢出,因為每一臺機器的每一個消息包都需要確認,使得要發送的消息包成倍增長。這種現像被稱為發送者(或者ACK)內爆(implosion)。
對于接收者發起協議,采用這種協議通信雙方的接收者通過序列號負責進行錯誤檢測。當檢測到消息包丟失時,接收者請求發送者重傳消息包。采用這種方 法,如果消息包沒有被送達任何一個接收者,那么發送者容易因NACK溢出,因為每個接收者都會向發送者發送一個重傳請求,這會引起發送者的負載過高。這種 現像被稱為NACK內爆(implosion)。
Heartbeat實現的是接收者發起協議的一個變種,它采用計時器來限制過多的重傳,在計時器時間內限制接收者請求重傳消息包的次數,這樣發送者重傳消息包的次數也被相應的限制了,從而嚴格的限制了NACK內爆。