一、簡介
heartbeat最後一個v2版本是2.1.4,可以使用v1版本的haresource和crm,本實驗以haresource爲crm來講解WEB的HA,haresource是不支持資源的監控操作,因此當資源出現了掛起,異常問題時不會導致heartbeat資源的轉移,就存在問題,因此需要切合其他方式來實現資源的健康控制,這邊我使用自己寫得腳本的SHELL腳本來實現。
二、拓撲
三、配置
0、 HA前提:
1.時間同步(心跳信息要時刻一致)
utpdate .....
2.主機名通信(ha當中的心跳信息的傳遞是通過主機名解析得來)
uname -n 與/etc/hosts當中的一致
3.ssh互信 (當heartbeat出現問題的時候,通過ssh來自動完成資源的轉移操作)
1、說明:
rhel5當中的heartbeat軟件包可以從epel當中下載或者源代碼編譯,rhel6開始已自帶
heartbeat的主要文件如下:
/etc/ha.d/authkeys #心跳信息認證 ha.cf #message line心跳信息的配置參數 haresource #v1版本的crm /usr/share/heartbeat/ #很多可執行的程序 hb_standy #當前節點切換爲備份節點 hb_takeover #搶回資源,變爲主節點 hb_delnode #刪除節點
2、配置authkeys,認證信息
#chmod 600 /etc/ha.d/authkeys #openssl rand -base64 16 >> /etc/ha.d/authkeys # tail -5 /etc/ha.d/authkeys
3.配置ha.cf,心跳參數
.............. #debugfile /var/log/ha-debug #調試日誌位置 #logfile /var/log/ha-log #日誌記錄在本地文件位置 #logfacility local0 #通過syslog記錄日誌(同上,2選1即可) #keepalive 2 #每2s發送一次心跳包 #deadtime 30 #死亡時間 #warntime 10 #警告時間 #initdead 120 #初始化死亡時間 udpport 694 #進程監聽udp 694端口 #baud 19200 #波特率19200,使用com口才使用的配置,一般不用 # serial serialportname ... #serial /dev/ttyS0 # Linux #serial /dev/cuaa0 # FreeBSD #serial /dev/cuad0 # FreeBSD 6.x #serial /dev/cua/a # Solaris #--------------------------------------------------- bcast eth1 # Linux #在eth1口使用廣播傳遞心跳信息 #bcast eth1 eth2 # Linux #bcast le0 # Solaris #bcast le1 le2 # Solaris #mcast eth0 225.0.0.1 694 1 0 # #ucast eth0 192.168.1.2 auto_failback off #node ken3 node node1.yu.com #節點1 node node2.yu.com #節點2 ping 192.168.192.1 #pingnode節點爲192.168.192.1 #ping_group group1 10.10.10.254 10.10.10.253 .......
4.配置資源
node1.yu.com 192.168.192.222/24/eth0 httpd #默認在node1節點啓動vip和http服務
5.HA測試
6.添加額外腳本實現資源監控
此時,HA即可實現,關閉heartbeat也能實現切換,但是如果vip 或者httpd進程異常,那麼heartbeat是不會現在資源轉移的,也就是說heartbeat是不會監控vip和httpd的健康狀態,因此爲了實現httpd異常時,也能保證HA,這邊我使用一個簡單地腳本來實現,如下:
[root@node1 html]# cat /etc/ha.d/1.sh #!/bin/bash # vip="192.168.192.222"; while true; do ip addr show | grep $vip > /dev/null ip_num=$? nc 127.0.0.1 80 -z > /dev/null port_return=$? if [ $ip_num -eq 0 ] && [ $port_return -eq 0 ] ;then let num=0 elif [ $ip_num -eq 0 ] && [ $port_return -ne 0 ];then let num++ elif [ $ip_num -ne 0 ] && [ $port_return -eq 0 ];then let num++ elif [ $ip_num -ne 0 ] && [ $port_return -ne 0 ];then let num=0 fi sleep 1 if [ $num -gt 2 ]; then service heartbeat stop > /dev/null fi done ###大致的過程如下,判斷當前的節點是否有vip或者httpd進程,當一個爲0一個非爲0即表示存在問題的資源,這個時候休眠2s,然後再執行一次,如果還是一樣的問題,則關閉當前節點的heartbeat的服務,實現切換和資源的轉移。
將1.sh加入到heartbeat的啓動腳本中,隨着heartbeat啓動和關閉:
編輯/etc/init.d/heartbeat在start和stop處修改爲如下:
start) StartLogd RunStartStop pre-start StartHA RC=$? Echo if [ $RC -eq 0 ] then [ ! -d $LOCKDIR ] && mkdir -p $LOCKDIR touch $LOCKDIR/$SUBSYS fi RunStartStop post-start $RC /etc/ha.d/1.sh & ##讓1.sh也在後臺實時操作 ;; stop) RunStartStop "pre-stop" StopHA RC=$? Echo if [ $RC -eq 0 ] then rm -f $LOCKDIR/$SUBSYS fi RunStartStop post-stop $RC StopLogd pkill 1.sh ##殺掉1.sh的進程 ;; restart) sleeptime=`ha_parameter deadtime` StopHA pkill 1.sh Echo EchoNoNl Waiting to allow resource takeover to complete: sleep $sleeptime sleep 10 # allow resource takeover to complete (hopefully). echo_success Echo StartHA /etc/ha.d/1.sh & Echo ;;
此時vip或者httpd的進程出現問題都可以實現資源的轉移。