Heartbeat基礎知識-運維小結


 

在日常的集群系統架構中,一般用到Heartbeat的主要就2種:
1)高可用(High Availability)HA集群, 使用Heartbeat實現,也稱為”雙機熱備”, “雙機互備”, “雙機”;
2)負載均衡群集(Load Balance Cluster),使用Linux Virtual Server(LVS)實現;

Heartbeat 的介紹
Heartbeat是Linux-HA項目中的一個組件,它實現了一個高可用集群系統。心跳服務和集群通信是高可用集群的兩個關鍵組件,在 Heartbeat項目里,由heartbeat模塊實現了這兩個功能。Heartbeat是目前開源HA項目中十分成功的一個例子,它提供了所有 HA 軟件所需要的基本功能,比如心跳檢測和資源接管、監測群集中的系統服務、在群集中的節點間轉移共享 IP 地址的所有者等,自1999年開始到現在,Heartbeat在行業內得到了廣泛的應用。heartbeat最核心的功能包括兩個部分,心跳監測和資源接管。心跳監測可以通過網絡鏈路和串口進行,而且支持冗 余鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未收到對方發送的報文,那么就認為對方失效,這時需啟動資源接管模塊來接管運行在對方主機上的資源或者服務。

Hearbeat和Keepalived區別
1) Keepalived使用的VRRP協議方式,虛擬路由冗余協議 (Virtual Router Redundancy Protocol,簡稱VRRP);
2) Heartbeat是基於主機或網絡的服務的高可用方式;
3) Keepalived的目的是模擬路由器的雙機;
4) Heartbeat的目的是用戶Service的雙機;
5) LVS的高可用建議用Keepavlived;
6) 業務的高可用用Heartbeat;

Keepalived 主要控制IP飄移,配置應用簡單,而且分層,layer3,4,5,各自配置極為簡單
Heartbeat 不但可以控制IP飄移,更擅長對資源服務的控制,配置,應用比較復雜;

HA集群中的相關術語

.節點(node)
運行heartbeat進程的一個獨立主機,稱為節點,節點是HA的核心組成部分,每個節點上運行着操作系統和heartbeat軟件服務,在heartbeat集群中,節點有主次之分,分別稱為主節點和備用/備份節點,每個節點擁有唯一的主機名,並且擁有屬於自己的一組資源,例如,磁盤、文件系統、網絡地址和應用服務等。主節點上一般運行着一個或多個應用服務。而備用節點一般處於監控狀態。

.資源(resource)
資源是一個節點可以控制的實體,並且當節點發生故障時,這些資源能夠被其它節點接管,heartbeat中,可以當做資源的實體有:
-  磁盤分區、文件系統
-  IP地址
-  應用程序服務
-  NFS文件系統

.事件(event)
集群中可能發生的事情,例如節點系統故障、網絡連通故障、網卡故障、應用程序故障等。這些事件都會導致節點的資源發生轉移,HA的測試也是基於這些事件來進行的。

.動作(action)
 事件發生時HA的響應方式,動作是由shell腳步控制的,例如當某個節點發生故障后,備份節點將通過事先設定好的執行腳本進行服務關閉或啟動, 進而接管故障節點的資源。

HeartBeat 的組成

Heartbeat提供了高可用集群最基本的功能,例如,節點間的內部通信方式、集群合作管理機制、監控工具和失效切換功能等等,目前的最新版本是Heartbeat2.x,下面講述也是以Heartbeat2.x為主,主要介紹Heartbeat2.0的內部組成,主要分為以下幾大部分:
heartbeat: 節點間通信檢測模塊
ha-logd: 集群事件日志服務
CCM(Consensus Cluster Membership):集群成員一致性管理模塊
LRM (Local Resource Manager):本地資源管理模塊
Stonith Daemon: 使出現問題的節點從集群環境中脫離
CRM(Cluster resource management):集群資源管理模塊
Cluster policy engine: 集群策略引擎
Cluster transition engine:集群轉移引擎

   下圖顯示的是Heartbeat2.0內部結構組成

Heartbeat僅僅是個HA軟件,它僅能完成心跳監控和資源接管,不會監視它控制的資源或應用程序,要監控資源和應用程序是否運行正常,必須使用第三方的插件,例如ipfail、Mon、Ldirector等Heartbeat自身包含了幾個插件,分別是ipfail、Stonith和Ldirectord,介紹如下:

ipfail插件的功能直接包含在Heartbeat里面,主要用於檢測網絡故障,並作出合理的反應,為了實現這個功能,ipfail使用ping節點或者ping節點組來檢測網絡連接是否出現故障,從而及時的做出轉移措施。

Stonith插件可以在一個沒有響應的節點恢復后,合理接管集群服務資源,防止數據沖突,當一個節點失效后,會從集群中刪除,如果不使用Stonith插件,那么失效的節點可能會導致集群服務在多於一個節點運行,從而造成數據沖突甚至是系統崩潰。因此,使用Stonith插件可以保證共享存儲環境中的數據完整性。

Ldirector插件是一個監控集群服務節點運行狀態的插件。Ldirector如果監控到集群節點中某個服務出現故障,就屏蔽此節點的對外連接功能,同時將后續請求轉移到正常的節點提供服務,這個插件經常用在LVS負載均衡集群中。

同樣,對於操作系統自身出現的問題,Heartbeat也無法監控,如果主節點操作系統掛起,一方面可能導致服務中斷,另一方面由於主節點資源無法釋放,而備份節點卻接管了主節點的資源,此時就發生了兩個節點同時爭用一個資源的狀況針對這個問題,就需要在linux內核中啟用一個叫watchdog的模塊,watchdog是一個Linux內核模塊,它通過定時向/dev/watchdog設備文件執行寫操作,從而確定系統是否正常運行,如果watchdog認為內核掛起,就會重新啟動系統,進而釋放節點資源。

在linux中完成watchdog功能的軟件叫softdog,softdog維護一個內部計時器,此計時器在一個進程寫入/dev/watchdog設備文件時更新,如果softdog沒有看到進程寫入/dev/watchdog文件,就認為內核可能出了故障。watchdog超時周期默認是一分鍾,可以通過將watchdog集成到Heartbeat中,從而通過Heartbeat來監控系統是否正常運行。

HeartBeat 的作用
通過HeartBeat,可以將資源(IP以及程序服務等資源)從一台已經故障的計算機快速轉移到另一台正常運轉的機器上繼續提供服務,一般稱之為高可用的服務。在實際的生產應用場景中,heartbeat的功能和另一個高可用的開源軟件keepalived有很多的相同之處,在我們實際的生產業務中也是有區別的。

HeartBeat 的工作原理
heartbeat最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過網絡鏈路和串口進行,而且支持冗 余鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未收到對方發送的報文,那么就認為對方失效,這時需啟動資源接管模塊來接管運行在對方主機上的資源或者服務。

Heartbeat: (心跳檢測)本身是整個集群的基礎(cluster messaging layer),負責維護集群各節點的信息以及它們之前通信;只提供主從備份功能,並不能對各個節點進行監控,需要安裝ldirectord。
Resource-agent: (資源代理)就是各種的資源的ocf腳本,這些腳本將被LRM調用從而實現各種資源啟動、停止、監控等等。
Cluster-glue: 相當於一個中間層,可以將heartbeat和crm(pacemaker)聯系起來,主要包含2個部分,LRM和STONITH;
Ldirectord: 負責realserver的健康檢查,可以自動將realserver中宕機的機器移除,不再分配請求。

通過修改Heartbeat的軟件的配置文件,可以制定那一台Heartbeat服務器作為主服務器,則另一台將自動成為熱備服務器。然后在熱備服務器上配置Heartbeat守護程序來監聽來自主服務器的心跳消息。如果熱備服務器在指定時間內為監聽到來自主服務器的心跳,就會啟動故障轉義程序,並取得主服務器上的相關資源服務的所有權,接替主服務器繼續不間斷的提供服務,從而達到資源以及服務高可用的目的。

以上的描述heartbeat的主備模式,heartbeat還支持主主模式,即兩台服務器互為主備,這是他們之間還會互相發送報文來告訴對方自己的當前的狀態,如果在指定的時間內未收到對方發送的心跳報文,那么,一方就會認為對方失效或者是已經宕機了,這時每個運行正常的主機就會啟動自身的資源接管模塊來接管運行在對方主機上的資源或者是服務,繼續為用戶提供服務。一般情況下,可以較好的實現一台主機故障后,企業業務能夠不間斷的持續的提供服務(注意:所謂的業務不間斷)。在故障轉移期間也是需要切換時間的,heartbeat的切換時間是5-20秒。(服務器宕機的切換比人工切換要快).

另外,和keepalived高可用軟件一樣,heartbeat高可用是操作系統級別的,不是服務(軟件)級別的,可以通過簡單的腳本控制,實現服務級別的高可用! 

故障切換的常見條件:
1)主機服務器物理宕機(硬件損壞,操作系統故障)
2)Heartbeat服務本身故障
3)兩台主備服務器之間的連接線路故障
應用服務故障則不會產生切換,可以通過服務宕機把heartbeat服務停掉。

heartbeat內部結構有三大部分組成
集群成員一致性管理模塊(CCM用於管理集群節點成員,同時管理成員之間的關系和節點間資源的分配,heartbeat模塊負責檢測主次節點的運行狀態,以決定節點是否失效。ha-logd模塊用於記錄集群中所有模塊和服務的運行信息。

本地資源管理器(LRM)負責本地資源的啟動,停止和監控,一般由LRM守護進程lrmd和節點監控進程(Stonith Daemon)組成,lrmd守護進程負責節點間的通信,Stonith Daemon通常是一個Fence設備,主要用於監控節點狀態,當一個節點出現問題時處於正常狀態的節點會通過Fence設備將其重啟或關機以釋放IP、磁盤等資源,始終保持資源被一個節點擁有,防止資源爭用的發生。

集群資源管理模塊(CRM)用於處理節點和資源之間的依賴關系,同時,管理節點對資源的使用,一般由CRM守護進程crmd、集群策略引擎和集群轉移引擎三個部分組成,集群策略引擎(Cluster policy engine)具體實施這些管理和依賴,集群轉移引擎(Cluster transition engine)監控CRM模塊的狀態,當一個節點出現故障時,負責協調另一個節點上的進程進行合理的資源接管。

在Heartbeat集群中,最核心的是heartbeat模塊的心跳監測部分和集群資源管理模塊的資源接管部分,心跳監測一般由串行接口通過串口線來實現,兩個節點之間通過串口線相互發送報文來告訴對方自己當前的狀態,如果在指定時間內未收到對方發送的報文,則就認為對方失效,這時資源接管模塊將啟動,用來接管運行在對方主機上的資源或者服務。

HeartBeat 的心跳連接
高可用集群是指一組通過硬件和軟件連接起來的獨立計算機,它們在用戶面前表現為一個單一系統,在這樣的一組計算機系統內部的一個或者多個節點停止工作,服務會從故障節點切換到正常工作的節點上運行,不會引起服務中斷。從這個定義可以看出,集群必須檢測節點和服務何時失效,何時恢復為可用。這個任務通常由一組被稱為“心跳”的代碼完成。在Linux-HA里這個功能由一個叫做heartbeat的程序完成。
通過上面的描述,要部署heartbeat服務,至少需要兩台主機才能完成。那么,要實現高可用服務,這兩台主機之間,是如何做到互相通信互相監控的呢?
下面是兩台heartbeat主機之間通信的一些常用的可行方法
1)串行電纜,即所謂的串口(首選,缺點是距離不能太遠)
2)一根以太網電纜量網口直連(生產環境中常用的方式)
3)以太網電纜,通過交換機等網絡設備連接(次選,原因是增加了故障點,不好排查故障,同時線路不是專用的心跳線,容易受其他數據傳輸的影響,導致心跳報文發送問題)

Heartbeat 的裂腦
什么是裂腦?
由於兩台高可用服務器之間在指定的時間內,無法互相檢測到對方心跳而各自啟動故障轉移功能,取得了資源以及服務的所有權,而此時的兩台高可用服務器對都還活着並作正常運行,這樣就會導致同一個IP湖綜合服務在兩端同時啟動而發生沖突的嚴重問題,最嚴重的就是兩台主機同時占用一個VIP的地址,當用戶寫入數據的時候可能會分別寫入到兩端,這樣可能會導致服務器兩端的數據不一致或造成數據的丟失,這種情況就本成為裂腦,也有的人稱之為分區集群或者大腦垂直分隔!

簡單來說, Hearbeat腦裂說的就是兩台服務都正常,但是就是檢測不到對方的心跳信息(心跳通信出現故障),兩台heartbeat都綁定VIP,這就是腦裂,由於相互失去聯系,兩台服務器本能的爭取接管資源,最嚴重的后果:共享資源被瓜分,服務都起不起來了,又或者服務都起來,但是共享資源同時寫,最后數據就被破壞了!

導致裂腦發生的原因:  
一般來說,裂腦的發生,主要是由以下的幾個原因導致的:
1)高可用服務器對之間心跳線路故障,導致無法正常的通信。原因比如:
    1--心跳線本身就壞了(包括斷了,老化);
    2--網卡以及相關驅動壞了,IP配置及沖突問題;
    3--心跳線間連接的設備故障(交換機的故障或者是網卡的故障);
    4--仲裁的服務器出現問題。
2)高可用服務器對上開啟了防火牆阻擋了心跳消息的傳輸;
3)高可用服務器對上的心跳網卡地址等信息配置的不正確,導致發送心跳失敗;
4)其他服務配置不當等原因,如心跳的方式不同,心跳廣播沖突,軟件出現了BUG等。

簡單來說,Heartbeat腦裂的原因可能就是:
1)心跳鏈路故障,導致無法正常通信;(比如: 網線誤拔,心跳線斷了,無法通信;心跳線之間的中轉設備壞了,仲裁設備壞了;)
2)開啟了防火牆阻擋了心跳信息傳輸;
3)心跳網卡地址等配置不正確;使用網路直連時,網卡驅動壞了,局域網IP沖突;
4)心跳方式,心跳廣播沖突,軟件bug;

防止腦裂發生的方法:
發生腦裂的時候,對業務的影響是及其嚴重的,有的時候甚至是致命的。
比如:兩台高可用的服務器對之間發生腦裂,導致互相競爭同一個IP資源,就如同我們局域網內常見的IP地址沖突一樣,兩個機器就會有一個或者兩個不正常,影響用戶正常訪問服務器。如果是應用在數據庫或者是存儲服務這種極重要的高可用上,那就導致用戶發布的數據間斷的寫在兩台服務器上的惡果,最終數據恢復及困難或者是難已恢復
實際的生產環境中,我們可以從以下幾個方面來防止裂腦的發生:
1)同時使用串行電纜和以太網電纜連接,同時用兩條心跳線路,這樣一條線路壞了,另一個線路還是好的,依然能傳送消息(推薦的)
2)檢測到裂腦的時候強行的關閉一個心跳節點(需要特殊的節點支持,如stonith,fence),相當於程序上備節點發現心跳線故障,發送關機命令到主節點。
3)做好對裂腦的監控報警(如郵件以及手機短信等),在問題發生的時候能夠人為的介入到仲裁,降低損失。當然,在實施高可用方案的時候,要根據業務的實際需求確定是否能夠容忍這樣的損失。對於一般的網站業務,這個損失是可控的(公司使用)
4)啟用磁盤鎖。正在服務一方鎖住共享磁盤,腦裂發生的時候,讓對方完全搶不走共享的磁盤資源。但使用鎖磁盤也會有一個不小的問題,如果占用共享盤的乙方不主動解鎖,另一方就永遠得不到共享磁盤。現實中介入服務節點突然死機或者崩潰,另一方就永遠不可能執行解鎖命令。后備節點也就截關不了共享的資源和應用服務。於是有人在HA中涉及了“智能”鎖,正在服務的一方只在發現心跳線全部斷開時才啟用磁盤鎖,平時就不上鎖了
5)報警報在服務器接管之前,給人員處理留足夠的時間就是1分鍾內報警了,但是服務器不接管,而是5分鍾之后接管,接管的時間較長。數據不會丟失,但就是會導致用戶無法寫數據。
6)報警后,不直接自動服務器接管,而是由人員接管。
7)增加仲裁的機制,確定誰該獲得資源,這里面有幾個參考的思路:
    1--增加一個仲裁機制。例如設置參考的IP,當心跳完全斷開的時候,2個節點各自都ping一下參考的IP,不同則表明斷點就出現在本段,這樣就主動放棄競爭,讓能夠ping通參考IP的一端去接管服務。
    2--通過第三方軟件仲裁誰該獲得資源,這個在阿里有類似的軟件應用

簡單來說,防止Heartbeat腦裂的辦法:
1)同時使用串行電纜和以太網電纜連接,同時使用兩條心跳線;
2)檢測到裂腦時,強制關閉一個節點,(需要特殊設備支持,如stonish和fence),相當於程序上的備節點發現心跳故障,發送關機指令到主節點;
3)做好監控預警,即做好腦裂監控報警(在仲裁設備上做),仲裁方式停服;
4)多個仲裁機制(仲裁設備,第三方仲裁軟件,並確定讓那個節點接管服務);
5) 一旦報警,短信電話通知運維人員,服務不要自動接管服務,有人員操作;
5)啟用磁盤鎖;

HeartBeat 的配置文件
heartbeat主要的配置文件有3個:
1)認證文件authkeys
2)主配置文件ha.cf
3)資源文件haresources

接下來就重點說一下這3個文件的具體功能以及配置:
1)heartbeat的認證配置文件authkeys,內容如下
    auth 1
    1 crc
    2 sha1 HI!
    3 md5 Hello!
該文件主要是用於集群中兩個節點的認證,采用的算法和密鑰(如果有的話)在集群中節點上必須相同,目前提供了3種算法:md5,sha1和crc。
其中crc不能夠提供認證,它只能夠用於校驗數據包是否損壞而sha1,md5需要一個密鑰來進行認證,從資源消耗的角度來講,md5消耗的比較多,sha1次之,因此建議一般使用sha1算法
如果要采用sha1算法,只需要將authkeys中的auth 指令(去掉注釋符)改為2,而對應的2 sha1行則需要去掉注釋符(#),后面的密鑰自己改變(兩節點上必須相同)。改完之后,保存,同時需要改變該文件的屬性為600,否則heartbeat啟動將失敗

2)heartbeat的主要配置文件ha.cf
第一個是ha.cf該文件位於在安裝后創建的/etc/ha.d目錄中。該文件中包括為Heartbeat使用何種介質通路和如何配置他們的信息。在源代碼目錄中的ha.cf文件包含了您可以使用的全部選項,詳述如下:

debugfile /var/log/ha-debug     用於記錄heartbeat的調試信息
logfile /var/log/ha-log        用於記錄heartbeat的日志信息
如果未定義上述的日志文件,那么日志信息將送往local0(對應的#/var/log/messages),如果這3個日志文件都未定義,那么heartbeat默認情況下
將在/var/log下建立ha-debug和ha-log來記錄相應的日志信息。

keepalive 2        發送心跳報文的間隔,默認單位為秒,如果你毫秒為單位,那么需要在后面跟ms單位,如1500ms即代表1.5s
deadtime 30      用於配置認為對方節點菪掉的間隔
warntime 10      發出最后的心跳警告報文的間隔
initdead 120      網絡啟動的時間
udpport 694       廣播/單播通訊使用的udp端口
bcast eth0 Linux      心跳所使用的網絡接口

baud 19200      波特率,串口通信的速度。
udpport 694     使用端口694進行bcast和ucast通信。這是默認的,並且在IANA官方注冊的端口號。

mcast eth0 225.0.0.1 694 1 0
如果采用組播通訊,在這里可以設置組播通訊所使用的接口,綁定的組播ip地#址(在224.0.0.0 - 239.255.255.255間),通訊端口,ttl(time to live)所能經過路由的#跳數,是否允許環回(也就是本地發出的數據包時候還接收)

ucast eth0 192.168.1.2       如果采用單播,那么可以配置其網絡接口以及所使用的ip地址
auto_failback on        該選項是必須配置的!用於決定當擁有該資源的屬主恢復之后,資源是否變遷:是遷移到屬主上,還是在當前節點上繼續運行,直到當前節點出現故障。
stonith baytech /etc/ha.d/conf/stonith.baytech        用於共享資源的集群環境中,采用stonith防御技術來保證數據的一致性

watchdog /dev/watchdog       該指令是用於設置看門狗定時器,如果節點一分鍾內都沒有心跳,那么節點將重新啟動
node ken3      設置集群中的節點,注意:節點名必須與uname –n相匹配

node primary.mydomain.com    該選項是必須配置的。集群中機器的主機名,與“uname –n”的輸出相同。
node backup.mydomain.com    該選項是必須配置的。同上。
respawn     該選項是可選配置的:列出將要執行和監控的命令。例如:要執行ccm守護進程,則要添加如下的內容:


ping 10.10.10.254
ping指令以及下面的ping_group指令是用於建立偽集群成員,它們必須與下述#的ipfail指令一起使用,它們的作用是監測物理鏈路,也就是說如果集群節點與上述偽設備不相通,那么該節點也將無權接管資源或服務,它將釋放掉資源。

respawn hacluster /usr/lib/heartbeat/ccm
使得Heartbeat以userid(在本例中為hacluster)的身份來執行該進程並監視該進程的執行情況,如果其死亡便重啟之。
對於ipfail,則應該是:
respawn hacluster /usr/lib/heartbeat/ipfail
對於pingd則應該是:
respawn hacluster /usr/lib64/heartbeat/pingd -m 100 -d 5s

注意:如果結束進程的退出代碼為100,則不會重啟該進程。
apiauth pingd gid=haclient uid=hacluster

apiauth client-name gid=gidlist uid=uidlist
apiauth ipfail gid=haclient uid=hacluster 設置你所指定的啟動進程的權限

3)heartbeat的資源配置文件haresources
配置好ha.cf文件之后,便是haresources文件。
該文件列出集群所提供的服務以及服務的默認所有者,該文件主要是為部署的集群配置資源或者服務。
注意:兩個集群節點上的該文件必須相同。集群的IP地址是該選項是必須配置的,不能在haresources文件以外配置該地址, haresources文件用於指定雙機系統的主節點、集群IP、子網掩碼、廣播地址以及啟動的服務等。

它的每一有效行的格式如下:
node-name resource1 resource2 ... resourceN
其中node-name即為集群中某一節點的名稱,必須與uname –n相同,
后面的資源組resource1 resource2 …resourceN中每一個資源都是一個shell腳本,它們的搜索路徑為/etc/init.d/和/usr/local/etc/ha.d/resource.d(該路徑根據你所安裝heartbeat的路徑有所不同),heartbeat為我們提供了一個非常好的資源擴展框架,如果我們需要控制一種自己的資源,只需要實現一個支持start和stop參數的shell腳本就可以了,目前heartbeat所支持的資源腳本可以在我提供的上述路徑中去查看。

如下配置進行說明:
node-name network-config
其中node-name指定雙機系統的主節點,取值必須匹配ha.cf文件中node選項設置的主機名中的一個,node選項設置的另一個主機名成為從節點。network-config用於網絡設置,包括指定集群IP、子網掩碼、廣播地址等。resource-group用於設置heartbeat啟動的服務,該服務最終由雙機系統通過集群IP對外提供。在本文中我們假設要配置的HA服務為Apache和Samba。
在haresources文件中需要如下內容:
primary.mydomain.com 192.168.85.3 httpd smb
該行指定在啟動時,節點linuxha1得到IP地址192.168.85.3,並啟動Apache和Samba。在停止時,Heartbeat將首先停止smb,然后停止Apache,最后釋放IP地址192.168.85.3。這里假設命令“uname –n”的輸出為“primary.mydomain.com”-如果輸出為“primary”,便應使用“primary”。
primary.mydomain.com IPaddr::192.168.21.107/24/eth0 drbddisk::r0 Filesystem::/dev/drbd1::/data::ext4 nfs
正確配置好haresources文件之后,將ha.cf和haresource拷貝到/etc/ha.d目錄。
注意:資源文件中能執行的命令必須在/etc/ha.d/resource.d/ 中可見!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM