Heartbeat 項目是 Linux-HA 工程的一個組成部分,它實現了一個高可用集群系統。心跳服務和集群通信是高可用集群的兩個關鍵組件,在 Heartbeat 項目裡,由 heartbeat 模塊實現了這兩個功能。
Heartbeat是Linux-HA工程的一個組件,自1999年開始到現在,發布了眾多版本,是目前開源Linux-HA項目最成功的一個例子,在行業內得到了廣泛的應用.
隨著Linux在關鍵行業應用的逐漸增多,它必將提供一些原來由IBM和SUN這樣的大型商業公司所提供的服務,這些商業公司所提供的服務都有一個關鍵特性,就是高可用集群。
heartbeat (Linux-HA)的工作原理:heartbeat最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過網絡鏈路和串口進行,而且支持冗余鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未收到對方發送的報文,那麼就認為對方失效,這時需啟動資源接管模塊來接管運行在對方主機上的資源或者服務。
高可用集群是指一組通過硬件和軟件連接起來的獨立計算機,它們在用戶面前表現為一個單一系統,在這樣的一組計算機系統內部的一個或者多個節點停止工作,服務會從故障節點切換到正常工作的節點上運行,不會引起服務中斷。從這個定義可以看出,集群必須檢測節點和服務何時失效,何時恢復為可用。這個任務通常由一組被稱為“心跳”的代碼完成。在Linux-HA裡這個功能由一個叫做heartbeat的程序完成。
下面使用hearbeat做高可用集群HA,nginx服務作為高可用集群HA的服務對象,即主服務器的nginx宕機或者無法提供服務,就切換到從服務上對外提供服務。
系統環境:
Master(主服務器):
hostname:masternginx、eth0:192.168.171.50 、eth1:192.168.17.50
Slave(從服務器):
hostname:slavenginx、eth0:192.168.171.51、eth1:192.168.17.51
流動的IP(Virtual IP):192.168.171.100(即對外提供服務的IP)
nginx在系統安裝的時候安裝或者後期自行安裝。
1)、安裝前的准備工作:
(1)分別設置主從服務器的hostname,
主服務器:vim/etc/sysconfig/network 修改:HOSTNAME=masternginx
從服務器:vim/etc/sysconfig/network 修改:HOSTNAME=slavenginx
(2)、分別在主從服務器上關閉SELinux
sed–I ‘s/SELINUXE=enforcing/SELINUX=disabled/’ /etc/selinux/config
(3)、分別在主從的服務器上配置/etc/hosts對應的ip和主機名:
192.168.17.51 slavenginx
192.168.17.50 masternginx
2)、分別在主服務器和從服務器上安裝heartbeat軟件,同時需要安裝libnet。
yum install libnet heartbeat #yum安裝可以解決依賴關系
源碼下載:
libnet:http://libnet.sourceforge.net/
heartbeat:http://www.linux-ha.org/wiki/Downloads
3)、修改heartbeat的配置
(1)首先在主服務器上修改配置,主要是以下三個文件:
(heartbeat的安裝樣例目錄下/usr/share/doc/beartbeat-*)
authkeys:用於驗證通信的,看對方是否還存活
haresources:用於配置流動IP的服務信息和需要做HA的服務
ha.cf:heartbeat的配置文件
(2)在主服務器上,從heartbeat的安裝樣例目錄下/usr/share/doc/beartbeat拷貝三個文件到 /etc/ha.d目錄下
cd /usr/share/doc/heartbeat-3.0.4/
cp authkeys ha.cf haresources /etc/ha.d/
(3)修改配置文件
主服務上修改:
vim/etc/ha.d/authkeys #編輯驗證通信方式
auth3 #默認都是有 # 號注釋,用哪一張認證方式
#1 crc
#2 sha1 HI!
3 md5 Hello! #去掉#號,
保存退出,修改權限:chmod600 /etc/ha.d/authkeys
vim/etc/ha.d/haresources #用於配置流動IP的服務信息和需要做HA的服務,默認是全部注釋
masternginx192.168.171.100/24/eth0:0 nginx
vim/etc/ha.d/ha.cf #heartbeat主配置文件
debugfile /var/log/ha-debug #排查故障的日志
logfile /var/log/ha-log #日志的存放位置
logfacility local0 #日志的級別
keepalive 2 #2秒的周期探測一次
deadtime 30 #.30秒沒有回應,就認為死亡了
warntime 10 #如果超過10秒沒有回應會發生警告
initdead 60 #.重啟的預留時間
udpport 694 #心跳線通信端口
ucast eth1 192.168.17.51 #..心跳線接口和對方IP
auto_failback on #.主切換到從,或者主恢復是,會自動切換
node masternginx #.主服務器的主機名
node slavenginx #.從服務器的主機名
ping 192.168.17.1 #用於仲裁的服務器IP
respawn hacluster/usr/lib64/heartbeat/ipfail #以hacluster運行腳本,檢查網絡的連通性。
把剛剛修改的三個配置文件復制到從服務器上的同一目錄。做一下修改:
cd /etc/ha.d/
scp authkeys haresources ha.cfslavenginx:/etc/ha.d/
從服務器上修改:
authkeys和haresources的配置內容不需要更改,只需要修改ha.cf配置文件
vim/etc/ha.d/ha.cf #heartbeat主配置文件
debugfile /var/log/ha-debug #排查故障的日志
logfile /var/log/ha-log #日志的存放位置
logfacility local0 #日志的級別
keepalive 2 #2秒的周期探測一次
deadtime 30 #.30秒沒有回應,就認為死亡了
warntime 10 #如果超過10秒沒有回應會發生警告
initdead 60 #.重啟的預留時間
udpport 694 #心跳線通信端口
ucast eth1 192.168.17.50 #..心跳線接口和對方IP
auto_failback on #.主切換到從,或者主恢復是,會自動切換
node masternginx #.主服務器的主機名
node slavenginx #.從服務器的主機名
ping 192.168.17.1 #用於仲裁的服務器IP
respawn hacluster/usr/lib64/heartbeat/ipfail #以hacluster運行腳本,檢查網絡的連通性。
裡面的內容基本都不需要更改,只是要修改心跳的IIP地址修改為對方的IP
(ucast eth1 192.168.171.50)
測試:
如果開啟了防火牆需要對udp 694端口放行。
-A INPUT -m state --state NEW -m udp -p udp--dport 694 -j ACCEPT
1)、啟動heartbeat服務,但是必須要先在主服務器上開啟了,然後才能在從服務器上開啟。
service heartbeat start
2)、檢查測試:
ifconfig 查看是否有eth0:0
ps aux |grep nginx 看是否有nginx進程
3)、模擬故障測試
為了測試方便,我們在主服務器和從服務器的nginx服務的默認網站下建立一個測試網頁:
主服務器的內容:
echo “1111111111111master server” >/usr/share/nginx/html/index.html
從服務器的內容:
echo “222222222222 slave server” >/usr/share/nginx/html/index.html
模擬故障
測試1:在主服務器上禁止ping
iptables -I INPUT -p icmp -j DROP #拒絕icmp包,模擬故障
iptables -D INPUT -p icmp -j DROP #解除故障
測試是否主服務器上發生故障,從服務器是否接管服務;主服務器恢復工作了,從服務器是否釋放接管權。
測試2:主服務器直接停止heartbeat服務,模擬heartbeat發生故障
service heartbeat stop
service heartbeat start
測試3:在主從上都模擬心跳線線段了
ifdown eth1