heartbeat——高可用集群介紹
Heartbeat 項(xiàng)目是 Linux-HA 工程的一個(gè)組成部分,它實(shí)現(xiàn)了一個(gè)高可用集群系統(tǒng)。心跳服務(wù)和集群通信是高可用集群的兩個(gè)關(guān)鍵組件,在 Heartbeat 項(xiàng)目里,由 heartbeat 模塊實(shí)現(xiàn)了這兩個(gè)功能。
heartbeat
高可用集群是指一組通過(guò)硬件和軟件連接起來(lái)的獨(dú)立計(jì)算機(jī),它們?cè)谟脩裘媲氨憩F(xiàn)為一個(gè)單一系統(tǒng),在這樣的一組計(jì)算機(jī)系統(tǒng)內(nèi)部的一個(gè)或者多個(gè)節(jié)點(diǎn)停止工作,服務(wù)會(huì)從故障節(jié)點(diǎn)切換到正常工作的節(jié)點(diǎn)上運(yùn)行,不會(huì)引起服務(wù)中斷。從這個(gè)定義可以看出,集群必須檢測(cè)節(jié)點(diǎn)和服務(wù)何時(shí)失效,何時(shí)恢復(fù)為可用。這個(gè)任務(wù)通常由一組被稱為“心跳”的代碼完成。在Linux-HA里這個(gè)功能由一個(gè)叫做heartbeat的程序完成。
Heartbeat通過(guò)插件技術(shù)實(shí)現(xiàn)了集群間的串口、多播、廣播和組播通信,在配置的時(shí)候可以根據(jù)通信媒介選擇采用的通信協(xié)議,heartbeat啟動(dòng)的時(shí)候檢查這些媒介是否存在,如果存在則加載相應(yīng)的通信模塊。這樣開(kāi)發(fā)人員可以很方便地添加新的通信模塊,比如添加紅外線通信模塊。
對(duì)于高可用集群系統(tǒng),如果集群間的通信不可靠,那么很明顯集群本身也不可靠。Heartbeat采用UDP協(xié)議和串口進(jìn)行通信,它們本身是不可靠的,可靠性必須由上層應(yīng)用來(lái)提供。那么怎樣保證消息傳遞的可靠性呢?
Heartbeat通過(guò)冗余通信通道和消息重傳機(jī)制來(lái)保證通信的可靠性。Heartbeat檢測(cè)主通信鏈路工作狀態(tài)的同時(shí)也檢測(cè)備用通信鏈路狀態(tài),并把這一狀態(tài)報(bào)告給系統(tǒng)管理員,這樣可以大大減少因?yàn)槎嘀厥б鸬募汗收喜荒芑謴?fù)。例如,某個(gè)工作人員不小心撥下了一個(gè)備份通信鏈路,一兩個(gè)月以后主通信鏈路也失效了,系統(tǒng)就不能再進(jìn)行通信了。通過(guò)報(bào)告?zhèn)浞萃ㄐ沛溌返墓ぷ鳡顟B(tài)和主通信鏈路的狀態(tài),可心完全避免這種情況。因?yàn)檫@樣在主通信鏈路失效以前,就可以檢測(cè)到備份工作鏈路失效,從而在主通信鏈路失效前修復(fù)備份通信鏈路。
Heartbeat通過(guò)實(shí)現(xiàn)不同的通信子系統(tǒng),從而避免了某一通信子系統(tǒng)失效而引起的通信失效。最典型的就是采用以太網(wǎng)和串口相結(jié)合的通信方式。這被認(rèn)為是當(dāng)前的最好實(shí)踐,有幾個(gè)理由可以使我們選擇采用串口通信:
(1)IP通信子系統(tǒng)的失效不太可能影響到串口子系統(tǒng)。(2)串口不需要復(fù)雜的外部設(shè)備和電源。
(3)串口設(shè)備簡(jiǎn)單,在實(shí)踐中非??煽?。
(4)串口可以非常容易地專用于集群通信。
(5)串口的直連線因?yàn)榕既恍缘艟€事件很少。
不管是采用串口還是以太網(wǎng)IP協(xié)議進(jìn)行通信,heartbeat都實(shí)現(xiàn)了一套消息重傳協(xié)議,保證消息包的可靠傳遞。實(shí)現(xiàn)消息包重傳有兩種協(xié)議,一種是發(fā)送者發(fā)起,另一種是接收者發(fā)起。
對(duì)于發(fā)送者發(fā)起協(xié)議,一般情況下接收者會(huì)發(fā)送一個(gè)消息包的確認(rèn)。發(fā)送者維護(hù)一個(gè)計(jì)時(shí)器,并在計(jì)時(shí)器到時(shí)的時(shí)候重傳那些還沒(méi)有收到確認(rèn)的消息包。這種方法容易引起發(fā)送者溢出,因?yàn)槊恳慌_(tái)機(jī)器的每一個(gè)消息包都需要確認(rèn),使得要發(fā)送的消息包成倍增長(zhǎng)。這種現(xiàn)像被稱為發(fā)送者(或者ACK)內(nèi)爆(implosion)。
對(duì)于接收者發(fā)起協(xié)議,采用這種協(xié)議通信雙方的接收者通過(guò)序列號(hào)負(fù)責(zé)進(jìn)行錯(cuò)誤檢測(cè)。當(dāng)檢測(cè)到消息包丟失時(shí),接收者請(qǐng)求發(fā)送者重傳消息包。采用這種方 法,如果消息包沒(méi)有被送達(dá)任何一個(gè)接收者,那么發(fā)送者容易因NACK溢出,因?yàn)槊總€(gè)接收者都會(huì)向發(fā)送者發(fā)送一個(gè)重傳請(qǐng)求,這會(huì)引起發(fā)送者的負(fù)載過(guò)高。這種 現(xiàn)像被稱為NACK內(nèi)爆(implosion)。
Heartbeat實(shí)現(xiàn)的是接收者發(fā)起協(xié)議的一個(gè)變種,它采用計(jì)時(shí)器來(lái)限制過(guò)多的重傳,在計(jì)時(shí)器時(shí)間內(nèi)限制接收者請(qǐng)求重傳消息包的次數(shù),這樣發(fā)送者重傳消息包的次數(shù)也被相應(yīng)的限制了,從而嚴(yán)格的限制了NACK內(nèi)爆。