<b>——基于</b><b>heartbeat</b><b>方式</b><b></b>
HeartBeat
運作于備用主機上的Heartbeat可以通過以太網連接配接檢測主伺服器的運作狀态,一旦其無法檢測到主伺服器的“心跳”則自動接管主伺服器的資源。通常情況下,主、備伺服器間的心跳連接配接是一個獨立的實體連接配接,這個連接配接可以是串行線纜、一個由“交叉線”實作的以太網連接配接。Heartbeat甚至可同時通過多個實體連接配接檢測主伺服器的工作狀态,而其隻要能通過其中一個連接配接收到主伺服器處于活動狀态的資訊,就會認為主伺服器處于正常狀态。從實踐經驗的角度來說,建議為Heartbeat配置多條獨立的實體連接配接,以避免Heartbeat通信線路本身存在單點故障。
1、串行電纜:被認為是比以太網連接配接安全性稍好些的連接配接方式,因為hacker無法通過串行連接配接運作諸如telnet、ssh或rsh類的程式,進而可以降低其通過已劫持的伺服器再次侵入備份伺服器的幾率。但串行線纜受限于可用長度,是以主、備伺服器的距離必須非常短。
2、以太網連接配接:使用此方式可以消除串行線纜的在長度方面限制,并且可以通過此連接配接在主備伺服器間同步檔案系統,進而減少了從正常通信連接配接帶寬的占用。
基于備援的角度考慮,應該在主、備伺服器使用兩個實體連接配接傳輸heartbeat的控制資訊;這樣可以避免在一個網絡或線纜故障時導緻兩個節點同時認為自已是唯一處于活動狀态的伺服器進而出現争用資源的情況,這種争用資源的場景即是所謂的“腦裂”(split-brain)或“partitioned cluster”。在兩個節點共享同一個實體裝置資源的情況下,腦裂會産生相當可怕的後果。
為了避免出現腦裂,可采用下面的預防措施:
1、如前所述,在主、備節點間建立一個備援的、可靠的實體連接配接來同時傳送控制資訊;
2、一旦發生腦裂時,借助額外裝置強制性地關閉其中一個節點;
第二種方式即是俗稱的“将其它節點‘爆頭’(shoot the other node in the head)”,簡稱為STONITH。基于能夠通過軟體指令關閉某節點特殊的硬體裝置,Heartbeat即可實作可配置的Stonith。但當主、備伺服器是基于WAN進行通信時,則很難避免“腦裂”情景的出現。是以,當建構異地“容災”的應用時,應盡量避免主、備節點共享實體資源。
Heartbeat的控制資訊:
“心跳”資訊: (也稱為狀态資訊)僅150 bytes大小的廣播、多點傳播或多點傳播資料包。可為以每個節點配置其向其它節點通報“心跳”資訊的頻率,以及其它節點上的heartbeat程序為了确認主節點出節點出現了運作等錯誤之前的等待時間。
叢集變動事務(transition)資訊:ip-request和ip-request-rest是相對較常見的兩種叢集變動資訊,它們在節點間需要進行資源遷移時為不同節點上heartbeat程序間會話傳遞資訊。比如,當修複了主節點并且使其重新“上線”後,主節點會使用ip-request要求備用節點釋放其此前從因主節點故障而從主節點那裡接管的資源。此時,備用節點則關閉服務并使用ip-request-resp通知主節點其已經不再占用此前接管的資源。主接點收到ip-request-resp後就會重新啟動服務。
重傳請求:在某叢集節點發現其從其它節點接收到的heartbeat控制資訊“失序”(heartbeat程序使用序列号來確定資料包在傳輸過程中沒有被丢棄或出現錯誤)時,會要求對方重新傳送此控制資訊。 Heartbeat一般每一秒發送一次重傳請求,以避免洪泛。
上面三種控制資訊均基于UDP協定進行傳送,可以在/etc/ha.d/ha.cf中指定其使用的UDP端口或者多點傳播位址(使用以太網連接配接的情況下)。
此外,除了使用“序列号/确認”機制來確定控制資訊的可靠傳輸外,Heartbeat還會使用MD5或SHA1為每個資料包進行簽名以確定傳輸中的控制資訊的安全性。
資源腳本:
資源腳本(resource scripts)即Heartbeat控制下的腳本。這些腳本可以添加或移除IP别名(IP alias)或從屬IP位址(secondary IP address),或者包含了可以啟動/停止服務能力之外資料包的處理功能等。通常,Heartbeat會到/etc/init.d/或/etc/ha.d/resource.d/目錄中讀取腳本檔案。Heartbeat需要一直明确了解“資源”歸哪個節點擁有或由哪個節點提供。在編寫一個腳本來啟動或停止某個資源時,一定在要腳本中明确判斷出相關服務是否由目前系統所提供。
Heartbeat的配置檔案:
/etc/ha.d/ha.cf
定義位于不同節點上的heartbeat程序間如何進行通信;
1.3.1 配置ha.cf檔案
ha.cf是heartbeat的主要配置檔案,可以對heartbeat的多數性能和狀态進行配置。大部分選項的取值可以采用預設值,其中的主要選項及配置方法說明如下:
debugfile /var/log/ha-debug:該檔案儲存heartbeat的調試資訊
logfile /var/log/ha-log:heartbeat的日志檔案
keepalive 2:心跳的時間間隔,預設時間機關為秒
deadtime 30:超出該時間間隔未收到對方節點的心跳,則認為對方已經死亡。
warntime 10:超出該時間間隔未收到對方節點的心跳,則發出警告并記錄到日志中。
initdead 120:在某些系統上,系統啟動或重新開機之後需要經過一段時間網絡才能正常工作,該選項用于解決這種情況産生的時間間隔。取值至少為deadtime的兩倍。
udpport 694:設定廣播通信使用的端口,694為預設使用的端口号。
baud 19200:設定串行通信的波特率。
serial /dev/ttyS0:選擇串行通信裝置,用于雙機使用序列槽線連接配接的情況。如果雙機使用以太網連接配接,則應該關閉該選項。
bcast eth0:設定廣播通信所使用的網絡接口卡。
auto_failback on:heartbeat的兩台主機分别為主節點和從節點。主節點在正常情況下占用資源并運作所有的服務,遇到故障時把資源交給從節點并由從節點運作服務。在該選項設為on的情況下,一旦主節點恢複運作,則自動擷取資源并取代從節點,否則不取代從節點。
ping ping-node1 ping-node2:指定ping node,ping node并不構成雙機節點,它們僅僅用來測試網絡連接配接。
respawn hacluster /usr/lib/heartbeat/ipfail:指定與heartbeat一同啟動和關閉的程序,該程序被自動監視,遇到故障則重新啟動。最常用的程序是ipfail,該程序用于檢測和處理網絡故障,需要配合ping語句指定的ping node來檢測網絡連接配接。
/etc/ha.d/haresources
定義對某個資源來說哪個伺服器是主節點,以及哪個節點應該擁有用戶端通路資源時的目标IP位址。
authkeys檔案用于heartbeat的鑒權設定,共有三種可用的鑒權方式:crc、md5和sha1。三種方式安全性依次提高,但同時占用的系統資源也依次擴大。crc安全性最低,适用于實體上比較安全的網絡,sha1提供最為有效的鑒權方式,占用的系統資源也最多。
其配置語句格式如下:
auth <number>
<number> <authmethod> [<authkey>]
舉例說明:
auth 1
1 sha1 key-for-sha1
其中鍵值key-for-sha1可以任意指定,number設定必須保證上下一緻。
auth 2
2 crc
crc方式不需要指定鍵值。
/etc/ha.d/authkeys
定義Heartbeat包在通信過程中如何進行加密。
當ha.cf或authkeys檔案發生改變時,需要重新加載它們就可以使用之生效;而如果haresource檔案發生了改變,則隻能重新開機heartbeat服務方可使之生效。
盡管Heartbeat并不要求主從節點間進行時鐘同步,但它們彼此間的時間差距不能超過1分鐘,否則一些配置為高可用的服務可能會出異常。
Heartbeat目前也不監控其所控制的資源的狀态,比如它們是否正在運作,是否運作良好以及是否可供用戶端通路等。要想監控這些資源,冉要使用額外的Mon軟體包來實作。
haresources配置檔案介紹:
主從節點上的/etc/ra.d/raresource檔案必須完全相同。檔案每行通常包含以下組成部分:
1、伺服器名字:指正常情況下資源運作的那個節點(即主節點),後跟一個空格或tab;這裡指定的名字必須跟某個節點上的指令"uname -n"的傳回值相同;
2、IP别名(即額外的IP位址,可選):在啟動資源之前添加至系統的附加IP位址,後跟空格或tab;IP位址後面通常會跟一個子網路遮罩和廣播位址,彼此間用“/”隔開;
3、資源腳本:即用來啟動或停止資源的腳本,位于/etc/init.d/或/etc/ha.d/resourcd.d目錄中;如果需要傳遞參數給資源腳本,腳本和參數之間需要用兩個冒号分隔,多個參數時彼此間也需要用兩個冒号分隔;如果有多個資源腳本,彼此間也需要使用空格隔開;
haresources檔案用于指定雙機系統的主節點、叢集IP、子網路遮罩、廣播位址以及啟動的服務等。其配置語句格式如下:
node-name network-config <resource-group>
其中node-name指定雙機系統的主節點,取值必須比對ha.cf檔案中node選項設定的主機名中的一個,node選項設定的另一個主機名成為從節點。
network-config用于網絡設定,包括指定叢集IP、子網路遮罩、廣播位址等。resource-group用于設定heartbeat啟動的服務,該服務最終由雙機系統通過叢集IP對外提供。
格式如下:
primary-server [IPaddress[/mask/interface/broadcast]] resource1[::arg1::arg2] resource2[::arg1::arg2]
例如:
primary-server 221.67.132.195 sendmail httpd
HA的LVS叢集有兩台Director,在啟動時,主節點占有叢集負載均衡資源(VIP和LVS的轉發及高度規則),備用節點監聽主節點的“心跳”資訊并在主節點出現異常時進行“故障轉移”而取得資源使用權,這包括如下步驟:
1、添加VIP至其網絡接口;
2、廣播GARP資訊,通知網絡内的其它主機目前本Director其占有VIP;
3、建立IPVS表以實作入站請求連接配接的負載均衡;
4、Stonith;
棄用resource腳本,改用ldirecotord來控制LVS:
ldirectord用來實作LVS負載均衡資源的在主、備節點間的故障轉移。在首次啟動時,ldirectord可以自動建立IPVS表。此外,它還可以監控各Realserver的運作狀态,一旦發現某Realserver運作異常時,還可以将其從IPVS表中移除。
ldirectord程序通過向Realserver的RIP發送資源通路請求并通過由Realserver傳回的響應資訊來确定Realserver的運作狀态。在Director上,每一個VIP需要一個單獨的ldirector程序。如果Realserver不能正常響應Directord上ldirectord的請求,ldirectord程序将通過ipvsadm指令将此Realserver從IPVS表中移除。而一旦Realserver再次上線,ldirectord會使用正确的ipvsadm指令将其資訊重新添加至IPVS表中。
例如,為了監控一組提供web服務的Realserver,ldirectord程序使用HTTP協定請求通路每台Realserver上的某個特定網頁。ldirectord程序根據自己的配置檔案中事先定義了的Realserver的正常響應結果來判斷目前的傳回結果是否正常。比如,在每台web伺服器的網站目錄中存放一個頁面".ldirector.html",其内容為"GOOD",ldirectord程序每隔一段時間就通路一次此網頁,并根據擷取到的響應資訊來判斷Realserver的運作狀态是否正常。如果其傳回的資訊不是"GOOD",則表明服務不正常。
ldirectord需要從/etc/ha.d/目錄中讀取配置檔案,檔案名可以任意,但建議最好見名知義。
實作過程:
建立/etc/ha.d/ldirectord-192.168.0.219.cf,添加如下内容:
# Global Directives
checktimeout=20
# ldirectord等待Realserver健康檢查完成的時間,機關為秒;
# 任何原因的檢查錯誤或超過此時間限制,ldirector将會将此Realserver從IPVS表中移除;
checkinterval=5
# 每次檢查的時間間隔,即檢查的頻率;
autoreload=yes
# 此項用來定義ldirectord是否定期每隔一段時間檢查此配置檔案是否發生改變并自動重新加載此檔案;
logfile="/var/log/ldirectord.log"
# 定義日志檔案存放位置;
quiescent=yes
# 當某台Realserver出現異常,此項可将其設定為靜默狀态(即其權重為“0”)進而不再響應用戶端的通路請求;
# For an http virtual service
virtual=192.168.0.219:80
# 此項用來定義LVS服務及其使用的VIP和PORT
real=192.168.0.221:80 gate 100
# 定義Realserver,文法:real=RIP:port gate|masq|ipip [weight]
real=192.168.0.223:80 gate 300
fallback=127.0.0.1:80 gate
# 當IPVS表沒有任何可用的Realserver時,此“位址:端口”作為最後響應的服務;
# 一般指向127.0.0.1,并可以通過一個包含錯誤資訊的頁面通知使用者服務發生了異常;
service=http
# 定義基于什麼服務來測試Realserver;
request=".ldirectord.html"
receive="GOOD"
scheduler=wlc
#persistent=600
#netmask=255.255.255.255
protocol=tcp
# 定義此虛拟服務用到的協定;
checktype=negotiate
# ldirectord程序用于監控Realserver的方法;{negotiate|connect|A number|off}
checkport=80
在/etc/hd.d/haresources中添加類似如下行:
node1.example.com 192.168.0.219 ldirectord::ldirectord-192.168.0.219.cf
本文轉自 linuxtro 51CTO部落格,原文連結:http://blog.51cto.com/linuxtro/287651,如需轉載請自行聯系原作者