如何使用Heartbeat,組建一個高可用性的Apache集群?
譯文Heartbeat提供了諸多集群基礎架構服務,比如集群之間的消息傳遞、節(jié)點成員身份、IP地址分配和遷移,以及服務的開啟和停止。Heartbeat可以用來為Apache、Samba和Squid等企業(yè)應用系統構建幾乎任何一種高可用性的集群。此外,它可以結合負載均衡軟件使用,那樣入站請求就可以由所有集群節(jié)點來分擔。
本文中的示例集群將由三臺運行Heartbeat的服務器組成。我們測試故障切換機制的方法是,手動關閉服務器,檢查它們服務的網站是不是仍然可用。下面是我們的測試拓撲結構:
映射服務所用的IP地址需要一直能夠訪問得到。通常,Heartbeat會為你將指定的IP地址分配給主服務器上的虛擬網絡接口卡(NIC)。如果主服務器出現了故障,集群會自動將IP地址切換到另一臺可用服務器上的虛擬NIC。如果主服務器恢復正常運行,它會再次將IP地址切換回到主服務器。由于具有遷移屬性,這個IP地址被稱為“浮動”地址。
在所有服務器上安裝軟件包
想組建集群,首先要使用yum,在每一個節(jié)點上安裝必要的軟件包:
- yum install PyXML cluster-glue cluster-glue-libs resource-agents
下一步,下載和安裝官方CentOS軟件庫里面沒有的兩個Heartbeat RPM文件。
- wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-3.0.4-2.el6.x86_64.rpm
- wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-libs-3.0.4-2.el6.x86_64.rpm
- rpm -ivh heartbeat-*
另外,你可以將EPEL軟件庫添加到源文件,并使用yum進行安裝。
Heartbeat會管理Apache的httpd服務的開啟和停止,所以停止Apache,并禁止它自動開啟:
- service httpd stop
- chkconfig httpd off
設置主機名稱
現在設置服務器的主機名稱,為此編輯每個系統上的etc/sysconfig/network,并更改HOSTNAME這一行:
- HOSTNAME=serverX.example.com
新的主機名稱會在服務器下一次啟動時激活。你可以使用hostname命令立即激活它,不需要重啟服務器:
- hostname serverX.example.com
你可以在每一臺服務器上運行uname -n,以此證實主機名稱已正確設置好。
配置Heartbeat
想配置Heartbeat,首先要將其默認配置文件從/usr拷貝到/etc/ha.d/:
- cp /usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/
- cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/
- cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/
然后,你還得改動全部集群節(jié)點上的所有三個文件,以便與你的需求相匹配。
authkeys文件含有集群節(jié)點彼此聯系時所使用的預共享密碼。集群里面的每個Heartbeat消息都含有該密碼,節(jié)點只處理擁有正確密碼的那些消息。Heartbeat支持SHA1密碼和MD5密碼。在authkeys文件中,下列指令將驗證方法設置為SHA1,并且定義了所使用的密碼:
auth 2
2 sha1 pre-shared-password
保存該文件,然后使用命令chmod 600 /etc/ha.d/authkeys,為該文件授予r--的權限。
下一步,在ha.cf文件中,定義計時器、集群節(jié)點、消息傳遞機制、第4層端口及其他設置:
- ## 日志##
- logfile /var/log/ha-log
- logfacility local0hea
- ## 計時器##
- ## 所有計時器設成以秒為單位。如果你需要以毫秒為單位設置時間,就使用‘ms’。##
- ## heartbeat間隔時間##
- keepalive 2
- ## 超過這個時間后,節(jié)點被認為已停滯##
- deadtime 15
- ## 一些服務器花更長的時間來啟動。該計時器定義了證實服務器宕機之前所等待的額外時間。##
- ## 該計時器的建議時間是停滯計時器的至少一倍。##
- initdead 120
- ## 消息傳遞參數##
- udpport 694
- bcast eth0
- ## 你還可以使用多播或單播##
- ## 節(jié)點定義##
- ## 確保主機名稱符合uname -n ##
- node server1.example.com
- node server2.example.com
- node server3.example.com
最后,文件haresources含有Heartbeat認為是主節(jié)點的那臺服務器的主機名稱,另外還含有浮動IP地址。該文件在所有服務器上都一模一樣,這點很重要。只要主節(jié)點在正常運行,它就服務所有請求;Heartbeat停止其他所有節(jié)點上的高可用性服務。Heartbeat檢測到該主節(jié)點停機運行后,它會在集群中的下一個可用節(jié)點上自動開啟服務。主節(jié)點恢復正常運行后,Heartbeat會讓它再次接手任務,服務所有請求。最后,該文件含有負責高可用性服務的腳本的名稱:這里是httpd。其他可能出現的值有squid、smb、nmb或postfix,映射到通常位于/etc/init.d/目錄中的服務啟動腳本的名稱。
在haresources中,定義server1.example.com為主服務器,定義192.168.56.200為浮動IP地址,定義 httpd為高可用性服務。你不需要創(chuàng)建任何接口,也不需要為任何接口手動分配浮動IP地址――Heartbeat為你處理這項任務:
- server1.example.com 192.168.56.200 httpd
每一臺服務器上的配置文件準備就緒后,開啟Heartbeat服務,并將它添加到系統啟動項:
- service heartebeat start
- chkconfig heartbeat on
你可以借助命令tailf /var/log/ha-log,密切關注Heartbeat日志。
Heartbeat可用于多項服務。比如說,haresources中的下列指令將讓Heartbeat同時管理Apache服務和Samba服務:
- server1.example.com 192.168.56.200 httpd smb nmb
不過,除非你還在運行Pacemaker之類的集群資源管理器(CRM),否則我不建議使用Heartbeat在單一集群中提供多項服務。要是沒有Pacemaker,Heartbeat使用IP地址監(jiān)測第3層中的集群節(jié)點。只要IP地址可以訪問得到,Heartbeat無視服務在服務器節(jié)點上可能遇到的任何崩潰或困難。
測試
一旦Heartbeat設置并運行起來,不妨對它測試一下。在所有三臺服務器上創(chuàng)建單獨的index.html文件,那樣你就能看清哪臺服務器在服務頁面。瀏覽到192.168.56.200,如果你設置好了DNS,也可以瀏覽到相應域名。頁面應該會從server1.example.com加載,你可以查看服務器1中的Apache日志文件來核實這一點。試著刷新頁面,證實該頁面是否每次都從同一臺服務器加載。
如果這一切進展良好,測試一下故障切換機制:停止server1.example.com上的Heartbeat服務。浮動IP地址應該會遷移到服務器2,頁面應該會從該服務器加載。迅速看一下server2 Apache日志,應該可以證實這一點。如果你同樣停止了服務器2上的服務,網頁會從集群的唯一可用節(jié)點server3.example.com加載。如果你重啟了服務器1和服務器2上的服務,浮動IP地址應該會按照haresources中的設置,從活動節(jié)點遷移到服務器1。
正如你所見,使用Heartbeat,在CentOS下組建一個高可用性的Apache集群是件很容易的事。雖然我們使用了三臺服務器,但Heartbeat在節(jié)點數量更多或更少的環(huán)境下應該同樣沒問題。Heartbeat對節(jié)點數量沒有任何限制,所以你可以根據需要擴展所設置環(huán)境的規(guī)模。