1. 程式人生 > >Linux 雙機HA的功能實現

Linux 雙機HA的功能實現

基於heartbeat方式

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 (責任編輯:admin)