1. 簡介HeartBeat用於搭建雙機熱備環境,可以通過專門的心跳線來串連雙機,也可以通過普通的網線來串連。官方網站:http://www.linux-ha.org/HeartBeat本文所提到實驗環境為:[root@alsme_probe3 tmp]# cat /etc/redhat-releaseRed Hat Enterprise Linux AS release 4 (Nahant Update 6)heartbeat 2.1.3
2.安裝
2.1. 準備
本實驗環境共有2個主機,其IP分別為:主機名稱 IP地址alssme_probe3 172.18.158.23alssme_probe4 172.18.158.24如果/etc/hosts中沒有配置的話, 則需要先配置/etc/hosts檔案
2.2 建立使用者和使用者組heartbeat需要haclient使用者組和hacluster使用者。兩個節點做同樣的操作,並保證haclient和hacluster的ID一樣。groupadd haclient -g 1001useradd -g haclient hacluster -u 1002
2.3. 安裝可以直接下載rpm包,或者自己下載源碼包進行編譯,在這裡,我採用自己編譯源碼的方式。安裝heartbeat前,需要先安裝libnet包。tar zxvf heartbeat-2.1.3.tar.gzrpm -ivh libnet-1.1.2.1-2.2.el4.rf.rpm[root@alsme_probe3 tmp]# cd heartbeat-2.1.3
[root@alsme_probe3 tmp]# ./configure[root@alsme_probe3 tmp]# make[root@alsme_probe3 tmp]# make install同樣地,在另一個主機上也是這麼安裝。libnet包可以在 http://rpmfind.net/linux/rpm2html/search.php 這裡搜尋到。
3. 配置heartbeat有三個設定檔: — ha.cf — authkyes — haresources這些檔案在每台機器都要保持一致.下面將一一介紹. cp /usr/local/share/doc/heartbeat-2.1.3/ha.cf /usr/local/etc/ha.d cp /usr/local/share/doc/heartbeat-2.1.3/haresources /usr/local/etc/ha.d cp /usr/local/share/doc/heartbeat-2.1.3/authkeys /usr/local/etc/ha.d3.1 編輯hertbeat主設定檔ha.cf,2個主機上的內容一樣。以下是需要開啟的配置,ha.cf裡面有詳細說明。[root@alsme_probe3 tmp]# vi /usr/local/etc/ha.d/ha.cf## ha的記錄檔記錄位置。如沒有該目錄,則需要手動添加
logfile /var/log/ha-log #File to write other messages to
logfacility local0 #這個是設定heartbeat的日誌,這裡是用的系統日誌##設定心跳(監測)時間時間為2秒
keepalive 2 #多長時間檢測一次
warntime 5 #連續多長時間聯絡不上後開始警告提示deadtime 20 #連續多長時間聯絡不上後認為對方掛掉了(單位是妙)initdead 120 #這裡主要是給重啟後預留的一段忽略時間段(比如:重啟後啟動網路等,如果在網路還沒有通,keepalive檢測肯定通不過,但這時候並不能切換)#採用bond0的udp廣播用來發送心跳資訊#bcast bond0#採用網卡eth0的udp單播來通知心跳,ip應為對方IP,建議採用單播。當一個網段有多台這樣cluster話,則一定要採用單播,否則每組cluster都會看到對方的節點,從而報錯。ucast eth0 172.18.57.154##使用udp連接埠694 進行心跳監測
udpport 694
auto_failback off #恢複正常後是否需要再自動切換回來,一般都設為off。##節點1的HOSTNAME,必須要與 uname -n 指令得到的結果一致。
node alsme_probe3##節點2的HOSTNAME
node alssme_probe4##通過ping 網關來監測心跳是否正常
ping 172.18.158.254hopfudge 1deadping 5#指定和heartbeat一起啟動、關閉的進程
#respawn hacluster /usr/local/lib64/heartbeat/ipfail
#apiauth ipfail gid=haclient uid=hacluster#是否採用v2 style模式,在三節點以上時一定要開啟#crm on
3.2 編輯雙機互聯驗證檔案:authkeys[root@alsme_probe3 heartbeat-2.1.3]# vi /usr/local/etc/ha.d/authkeys
auth 1
1 crc
[root@alsme_probe3 heartbeat-2.1.3]# chmod 600 /usr/local/etc/ha.d/authkeys注意: authkeys的許可權一定要是600.3.3 編輯叢集資源檔:haresources (切換時備機需要做的事情)[root@alsme_probe3 heartbeat-2.1.3]# vi /usr/local/etc/ha.d/haresources
alssme_probe3 IPaddr::172.18.158.111/24/bond0 mysql#其中,172.18.158.111為VIP如何配置,可以參見haresources,裡面也有詳細的說明。有幾個注意事項:1).資源群組的第一列是我們在ha.cf設定檔中的node之一,而且應該是當前準備作為primary節點的那一個node。2).每一行代表一個資源群組,如果一行寫不下可以用”\ “換行3).資源群組啟動順序是從左往右,關閉的順序是從右往左4).指令碼的參數通過::來分隔和傳遞5).一個資源群組裡面不同資源之間以空格分隔6).不同的資源群組之間沒有必然關係7).每個資源都是一個角本,可以是在/etc/init.d目錄下面的,也可以是/usr/local/etc/ha.d/resource.d目錄下面的角本。這些角本必須要支援xxx start;xxx stop;模式。8).關於service IP的資源設定格式詳見haresources檔案。9).如果mysql是編譯安裝的話, 則需要修改/etc/init.d/mysql檔案中的basedir和datadir兩個參數3.4 資源角本例子—drbd下面是drbd的資源管理角本的例子:[root@alsme_probe3 heartbeat-2.1.3]# vi /usr/local/etc/ha.d/resource.d/drbd
#!/bin/sh
case “$1″ in
start)
#聲明為drbd的primary節點
drbdadm primary db
#掛載檔案系統
mount /dev/drbd0 /data
#啟動相關服務
service mysql start
;;
stop)
#上面操作的反向
service mysql stop
umount /dev/drbd0 /data
drbdadm secondary db
;;esac
exit 0我們測試的mysql是安裝mysql時內建的,在/etc/init.d目錄下面,它可以實現mysql的啟動和關閉。如果我們採用的是heartbeat+雙master模式的話, 則不需要加上mysql資源群組。如果我們採用的是heartbeat+master/slave模式的話,則需要重新mysql角本,在start時將slave變成master。在stop時將master變成slave。建議還是採用heartbeat+雙master模式,這樣將資料丟失降到最低。4. 測試測試切換不外乎以下幾種:
1).手工調用heartbeat的節點切換指令碼2).拔掉網線,測試在primary節點的網路斷開後的切換情況,通過測試,在拔掉網線後,當主節點發現無法和standby節點無法通訊
後,會在log中記錄warn資訊,如果延續時間達到在ha.cf中設定的時間長度後,會開始釋放資源,standby節點發現無法和主節點通訊一段時間
(ha.cf設定)後,開始嘗試啟動資源並將自己active成primary節點。切換過程除ha.cf中設定的時間長度之外的時間段同樣非常短。這裡容易
出現custer腦分裂的問題。如果採用雙master的話,就不存在這個問題。3). shutdown primary主機,測試是否能夠正常切換。
4). 主節點機器掉電,是否能夠正常切換。第一種和第三種測試方法一定要測一下。5.管理啟動和關閉heartbeat的方法:# /etc/init.d/hearbeat start 或 service heartbeat start# /etc/init.d/hearbeat stop 或 service heartbeat stop….. 命令整理6.其他實際測試結果表明:如果採用myisam儲存引擎,則在primary節點當掉的時候,總會遺失資料;而採用innodb儲存引擎時,如果
primary節點本身沒有程式往本機寫資料的話,那麼基本上不會發生資料丟失;而如果primary節點本身有程式在寫資料,則在當機瞬間,本機上的程
序可能還會寫入部分資料,而如果是其他主機程式串連過來的話,基本上不會發生丟資料的情況。建議:在drbd+hb的環境中,最好是採用innodb儲存引擎,並且設定innodb_flush_log_at_trx_commit =
1,這使得幾乎每個提交的事務都能記錄在 ib_logfile* 中,在 secondary 節點上能得到恢複,減小損失。heartbeat有兩種模式,預設的模式只支援兩個節點。如果cluster裡面有2個以上節點的話,則需要採用cib模式,即v2 style:1).把三個節點都加到ha.cf裡,然後在ha.cf裡加上”crm 1″2).然後用/usr/local/lib64/heartbeat/haresources2cib.py
把原來的/usr/local/etc/ha.d/haresources 轉換成
/usr/local/var/lib/heartbeat/crm/cib.xml.“/usr/local/lib64/heartbeat/haresources2cib.py /usr/local/etc/ha.d/haresources /usr/local/var/lib/heartbeat/crm/cib.xml”3).把haresources清空另外如果只起一個節點的話,則service IP地址需要2分鐘才會生效。這個時間不知道是如何控制的。heartbeat預設模式是沒法監控資源的,也就是說其中某個資源要是crash掉了,也不會發生任何動作,它只有當它認為對方機器dead後才會發生動作。也就是機器crashed,網路斷掉了之類。這顯然沒法達到我們的目標。 為了達到我們的目標就要採用crm(cluster resource management)模式了。首先,先按預設模式配置heartbeat(詳見heartbeat新手上路)。預設模式配置成功後,再按下面的步驟操作:1)在ha.cf裡面增加 crm on2)將haresources資源檔轉換成cib.xml檔案,2.1.3內建有轉換指令碼 /usr/local/lib64/heartbeat/haresources2cib.py /usr/local/etc/ha.d/haresources 輸出檔案在/usr/local/var/lib/heartbeat/crm/cib.xml3)如果hacluster和haclient使用者和使用者組是在安裝heartbeat之後建立的話,則需要執行下面命令修改許可權 修改heartbeat目錄許可權,可以用以下命令: find / -type d -name “heartbeat” -exec chown -R hacluster {} \; find / -type d -name “heartbeat” -exec chgrp -R haclient {} \;4)在2.0的版本中ipfail與crm 模式有衝突,所以在ha.cf中不可開啟ipfail。5) cib.xml檔案的修改 如果在IPaddr中有下面兩行,則刪除: <nvpair id=”IPaddr_172_18_57_83_attr_1″ name=”nic” value=”24″/> <nvpair id=”IPaddr_172_18_57_83_attr_2″ name=”cidr_netmask” value=”bond0″/> 2.1.3版本產生的cib.xml檔案中,mysql資源是ocf格式的,而它內建的mysql角本是無法啟動mysql的,所以需要修改,有兩種方法。在修改前先介紹一下ocf和lsb格式的區別:LSB格式的角本必須支援status功能,必須能接收start,stop,status,三個參數;而如果是OCF格式,則必須支援start,stop,monitor三個參數.其中status和monitor參數是用來監控資源的,非常重要.例如LSB風格的指令碼,運行./mysql status時候,傳回值包含OK或則running則表示資源正常傳回值包含stopped或者No則表示資源不正常。假如是OCF風格的指令碼,運行./mysql monitor時候,返回0表示資源是正常的,返回7表示資源出現問題.ocf格式的啟動角本在/usr/lib/ocf/resource.d/heartbeat(也許你的機器上目錄不是這個,可以搜尋ocf來尋找)lsb格式的啟動角本在/usr/lib/lsb/resource.d/heartbeat目錄下。兩種修改方法1.修改cib.xml,將mysql的ocf改成lsb。然後在/usr/lib/lsb/resource.d/heartbeat(如果
該目錄不存在,則手工建立,並將許可權賦給hacluster:haclient)下面執行ln -s /etc/init.d/mysql mysql。# rm /usr/heartbeat/var/lib/heartbeat/crm/cib.xml.* -f
# vi /usr/heartbeat/var/lib/heartbeat/crm/cib.xml2.修改/usr/lib/ocf/resource.d/heartbeat下面的mysql的角本,使之能正常工作。或者將/etc/init.d/mysql拷過來,修改使它支援monitor操作6) 然後啟動heartbeat即可。Service heartbeat start.7)如果mysql採用雙master的話,則在stop資源後,記的將mysql手動起來。
Heartbeat CRM模式管理1)查看所有資源[root@alssme_probe3 sbin]# crm_resource -LResource Group: group_1 IPaddr_172_18_158_111 (heartbeat::ocf:IPaddr) mysql_2 (lsb:mysql)2)查看資源跑在哪個節點上[root@alssme_probe3 sbin]# crm_resource -W -r mysql_2resource mysql_2 is running on: alssme_probe34)啟動/停止資源(cluster不會發生切換,手工停mysql,將會重新啟動或者發生切換)[root@alssme_probe4 crm]# crm_resource -r mysql_2 -p target_role -v started [root@alssme_probe3 sbin]# crm_resource -r mysql_2 -p target_role -v stopped5)查看資源在cib.xml中的定義[root@alssme_probe3 sbin]# crm_resource -x -r mysql_2mysql_2 (lsb:mysql): Started alssme_probe3raw xml: <primitive provider=”heartbeat” type=”mysql” id=”mysql_2″> <operations> <op id=”mysql_2_mon” interval=”60s” name=”monitor” timeout=”30s”/> </operations> <instance_attributes id=”mysql_2″> <attributes> <nvpair name=”target_role” id=”mysql_2-target_role” value=”started”/> </attributes> </instance_attributes> </primitive> 即每60秒檢測資源運行情況,如果發現資源不在,則嘗試啟動資源,如果30s後還未啟動成功,則資源切換向另節點。時間可以修改( mysql一般建議採用這個時間值)。6)將資源移向指定節點 crm_resource -M -r mysql_2 -H alssme_probe4