HA集羣的架構
圖3.1 HA集羣架構
1) 共享信息層
在基礎架構上實現心跳信息探測。雙方節點可以隨時探測到對方的心跳信息,以實現對對方主機工作狀態的探測。三類控制信息:心跳(Heartbeats),集羣事務信息(Cluster Transition Messages),重傳信息(Retransmission Request)。 配置文件:/etc/ha.d/ha.cf。各節點間域共享密鑰,實現節點間互相通信的認證。加密方式:MD5,HMAC-SHA1 。常用實現軟件:HeartBeat、keepalived、ultramonkey、openais/corosync。紅帽官方提供的集羣套件RHCS底層使用的通信機制就是openais/corosync。
2) 資源分配子層
在資源分配上定義資源種類,界定資源歸屬,每個服務需要哪些資源及這些資源之間的前後次序。
集羣資源管理器(CRM,常用軟件pacemaker),管理雙方向外提供服務所需用到的資源,包括IP地址、Web服務、共享存儲等等。而這些資源需要依靠集羣信息庫CIB(XML文件)來定義,同時還必須保證一旦某個節點上的XML文件更新,即刻通知其他節點上的XML也要及時更新。
策略引擎(PE Policy Engine):定義法定人數以及根據法定人數所做出的動作等等。
本地資源管理器(LRM Local Resource Manager):監控本地某個資源的工作狀況。
3) 資源層
本地資源代理(Resource Agent),腳本文件,一旦集羣資源管理器發現某個資源工作異常,立即通知本地資源代理重啓服務。常用方法:
(1)Heartbeat v1;
(2)使用腳本LSB scripts (Linux Standards Base );
(3)OCF Open Cluster Format 開放集羣格式(最佳方式)。
3.1.2 高可用集羣常用架構模型
(1)一主一從架構;
(2)互爲主從架構:兩臺主機分別提供兩種不同的服務;
(3)多主機架構:N臺主機組成一個集羣,分別提供不同的服務,一臺服務器空閒做備節點。或者全部處於工作狀態,一臺服務器出故障,立刻將服務轉移到其他主機上。各節點之間需要以多播的形式將自己的健康情況發送給其他主機。
故障轉移域,如果一臺主機發生故障,會將主機上的服務轉移到域內的另一臺主機上。
法定人數(Quorum) 集羣超過這個值會正常工作,低於這個值會停止工作,同時也避免出現資源爭用的情況。
腦裂和仲裁:在某種情況下,由於底層通知錯誤,或者傳遞信息的介質出現故障,會出現資源爭用的情況,稱之爲腦裂。此時,每個部分都想取得對集羣資源的控制權,以保證集羣的高可用,這將破壞集羣資源的完整性和一致性,導致整個集羣癱瘓,硬件被破壞等嚴重後果。爲防止腦裂的放生,將由仲裁協議即法定代表人數來決定哪個部分取得對集羣資源的控制權。
STONITH (Shoot The Other Node In The Head ):避免出現資源爭用的情況,爲了防止錯誤操作的節點對集羣資源進行破壞性控制和操作,使其不斷重新啓動或關機,從而使其無法取得對集羣資源的控制權。
3.1.3高可用(HA)集羣的設計及實現
3.1 主從架構
環境搭建:
Primary eth0 192.168.0.39
eth1 192.168.10.10 //心跳測試
提供Web服務,測試頁內容爲 Web1
Standby eth0 192.168.0.27
eth1 192.168.10.11 //心跳測試
提供Web服務,測試頁內容爲 Web2
向外提供Web服務IP:192.168.0.100
Primary:
3.2 所需軟件包
Heartbeat所需軟件包如圖3.2所示,直接使用yum本地安裝。
[root@station39 Heartbeat2]# yum localinstall \
heartbeat-2.1.4-9.el5.i386.rpm \
heartbeat-pils-2.1.4-10.el5.i386.rpm \
heartbeat-stonith-2.1.4-10.el5.i386.rpm \
libnet-1.1.4-3.el5.i386.rpm \
perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck
Heartbeat依靠服務器的主機名來識別服務器,因此使用hostname命令得到的結果必須與uname -n 結果保持一致。
[root@station39 Heartbeat2]# vim /etc/sysconfig/network //修改主機名稱
HOSTNAME=primary.a.com
[root@station39 Heartbeat2]# hostname primary.a.com
[root@station39 ~]# vim /etc/hosts //修改主機地址映射
192.168.0.39 primary.a.com primary
192.168.0.27 standby.a.com standby
[root@station39 Heartbeat2]# hwclock -s // 同步一下服務器時間
[root@station39 Heartbeat2]# cd /etc/ha.d/
[root@station39 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/ha.cf ./
[root@station39 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/authkeys ./
[root@station39 ha.d ]# cp /usr/share/doc/heartbeat-2.1.4/haresources ./
[root@station39 ha.d]# vim ha.cf //定義各節點之間Heartbeat進程如何通信
keepalive 2 //設定heartbeat之間的時間間隔爲2秒
deadtime 30 //在30秒後宣佈節點死亡
warntime 10 //在日誌中發出“late heartbeat“警告之前等待的時間,單位爲秒
udpport 694 // 使用端口694進行bcast和ucast通信,默認參數
bcast eth1 //在eth1接口上使用廣播heartbeat
node primary.a.com //定義節點
node standby.a.com //定義節點
respawn hacluster /usr/lib/heartbeat/ipfail //使Heartbeat以hacluster的份來執行ipfail進程並監視該進程的執行情況
其他相關參數解釋:
serial /dev/ttyS0 //使用串口來交換心跳信息,如果不使用串口則必須使用其他介質,如以太網等。
watchdog /dev/watchdog //可選,通過Watchdog 功能可以獲得提供最少功能的系統,該系統不提供heartbeat,可以在持續一份鐘的不正常狀態後重新啓動。該功能有助於避免一臺機器在被認定已經死亡 之後恢復heartbeat的情況。如果這種情況發生並且磁盤掛載因故障而遷移,便有可能有兩個節點同時掛載一塊磁盤。如果要使用這項功能,則除了這行之外,也需要加載softdog內核模塊,並創建相應的設備文件。
initdead 120 //在某些配置下,重啓後網絡需要一些時間才能正常工作。這個單獨的deadtime選項可以處理這種情況。取值通常爲deadtime的兩倍。
baud 19200 //波特率,串口通信的速度。
ping ping1.linux-ha.org ping2.linux-ha.org .... //可選,列出ping節點,這些節點不是集羣節點,是用來爲ipfail等模塊檢查網絡連接情況的。
[root@station39 ~]# dd if=/dev/urandom bs=512 count=1 | openssl md5 //生成節點間域共享密鑰
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000305868 seconds, 1.7 MB/s
d0f6e811a30607ec3783826d8d70ba25
[root@station39 ha.d]# vim authkeys //定義心跳探測包使用哪種加密方式
auth 1
1 sha1 d0f6e811a30607ec3783826d8d70ba25
[root@station39 ha.d]# chmod 600 authkeys //僅允許管理員修改文件
[root@station39 ha.d]# cp /etc/init.d/httpd /etc/ha.d/resource.d/
[root@station39 ha.d]# vim resource.d/haresources //定義資源
primary.a.com 192.168.0.100/24/eth0/192.168.0.255 httpd
Standby:
[root@station26 Heartbeat2]# yum localinstall \
heartbeat-2.1.4-9.el5.i386.rpm \
heartbeat-pils-2.1.4-10.el5.i386.rpm \
heartbeat-stonith-2.1.4-10.el5.i386.rpm \
libnet-1.1.4-3.el5.i386.rpm \
perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck
[root@station26 Heartbeat2]# vim /etc/sysconfig/network //修改主機名稱
HOSTNAME=standby.a.com
[root@station26 Heartbeat2]# hostname standby.a.com
[root@station26 Heartbeat2]# hwclock -s
[root@station26 ~]# vim /etc/hosts
192.168.0.39 primary.a.com primary
192.168.0.27 standby.a.com standby
[root@station26 ~]# cd /etc/ha.d/
Standby的配置文件必須與Primary保持一致,因此這裏採用將Primary上的配置文件直接遠程複製過來的方法:
[root@station26 ha.d]# scp 192.168.0.39:/etc/ha.d/ha.cf ./
[root@station26 ha.d]# scp 192.168.0.39:/etc/ha.d/authkeys ./
[root@station26 ha.d]# scp 192.168.0.39:/etc/ha.d/haresources ./
[root@station26 ha.d]# cp /etc/init.d/httpd /etc/ha.d/resource.d/
[root@station26 ha.d]# chmod 600 authkeys
配置完成。此時,使用瀏覽器訪問http://192.168.0.100 ,可以看到圖3.3 web1的界面,說明此時是Primary主機在工作。
圖 3.3
我們使用Heartbeat本身自帶的測試命令使Primary宕機,稍等片刻之後,我們再訪問http://192.168.10.100 就會發現出現如圖3.4 Web2的測試頁面,說明Standby已經在工作了。
[root@station39 ha.d]# cd /usr/lib/heartbeat/
[root@station39 heartbeat]# ./hb_standby
圖 3.4
我們這裏是爲了方便測試故意將兩臺服務器上的Web服務的頁面顯示出不同的內容,真實的環境中兩臺服務器的提供Web服務應該是一模一樣的,因此當服務器發生宕機的情況下用戶能夠正常地訪問網站,絲毫感覺不到服務宕機的情況。
OK!這只是實現了最基礎的架構,需要我們在後續的工作中逐步擴展……