歡迎您光臨本站 註冊首頁

Linux下雙機HA的功能實現(理論)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
——基於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


[火星人 ] Linux下雙機HA的功能實現(理論)已經有676次圍觀

http://coctec.com/docs/linux/show-post-51647.html