名詞解釋:
簇群(cluster):所有參與heartbeat檢測,共同接管統一任務的伺服器組
主機(primary):配置時指定接管VIP,提供服務的伺服器
備機(backup):配置時檢測主機heartbeat,在主機失效時接管VIP并提供服務的伺服器
有效(valid):目前接管VIP并提供對外服務的伺服器
失效(invalid):目前有效的伺服器因各種情況無法提供服務,或無法接管VIP
案例:兩台linux伺服器組成簇群,主機設定為A,備機為B。提供服務的接口eth0,IP位址為A:192.168.0.1/B:192.168.0.2,對外提供服務的IP(VIP)為192.168.0.254,為了避免因網絡堵塞等原因導緻heartbeat無法檢測,使用另一對接口eth1,A:10.0.0.1/B:10.0.0.2。eth1通過交叉線直連。伺服器對外提供端口号為TCP 12345。接口配置不詳細列舉,/etc/hosts檔案要有對端主機名對應的IP位址。
<a href="http://s5.51cto.com/wyfs02/M01/7F/B5/wKiom1cpqB-SxpTaAABHBDeENr4684.png" target="_blank"></a>
一、首先是安裝所需要的軟體。網上大部分教材都是使用yum安裝的。由于是内網伺服器,是以隻能進行離線安裝。分别下載下傳heartbeat和libnet:
(萬惡的非法檔案,請把壓縮包改名為heartbeat.zip.001和heartbeat.zip.002,并在windows下面解壓後上傳到伺服器;或則自行到網際網路上下載下傳後上傳)
安裝過程如下:
1、解壓縮heartbeat,這将在本目錄下生成一個heartbeat的目錄:
1
<code>tar</code> <code>-xzf heartbeat-2.0.8.</code><code>tar</code><code>.gz</code>
2、安裝libnet
首先檢查系統是否已經安裝過libnet:
<code>rpm -q libnet</code>
若已經安裝過,需要更新,使用-U參數:
<code>rpm -Uv libnet-1.1.2.1-2.2.el4.rf.i386.rpm</code>
若沒有安裝過,則使用-i參數:
<code>rpm -iv libnet-1.1.2.1-2.2.el4.rf.i386.rpm</code>
安裝成功後檢查是否正常完成:
3、安裝heartbeat:
2
3
4
<code>cd</code> <code>.</code><code>/heartbear-2</code><code>.0.8</code>
<code>.</code><code>/ConfigureMe</code> <code>configure</code>
<code>.</code><code>/make</code>
<code>.</code><code>/make</code> <code>install</code>
4、拷貝配置檔案:
<code>cp</code> <code>/usr/share/doc/heartbeat-2</code><code>.0.8</code><code>/ha</code><code>.cf haresources authkeys </code><code>/etc/ha</code><code>.d/</code>
修改相關檔案
/etc/ha.d/ha.cf配置:
debugfile:heartbeat的debug日志,建議單獨生成
logfile:heartbeat的log日志,建議單獨生成
keepalive:發出heartbeat信号的時間間隔,預設機關s,可使用ms
deadtime:宣告主機失效時間
warntime:發出“heartbeat遲到”警告時間
initdead:網絡延遲生效時間
udpport:廣播、單點傳播通信端口,無沖突預設即可
ucast 端口 IP:使用單點傳播通信,端口為,對端IP位址為:
auto_failback:搶占模式,如果主機恢複正常,則重新掌管資源
watchdog:若heartbeat信号沒有生成,重新開機
node:所有主備機名稱。第一行是主機,第二行以後是備機。該名稱必須與uname -a一緻。且/etc/hosts裡有該名稱對應的IP位址。
ping:目标節點,能ping通目标節點才算是正常節點。否則啟用ipfail
respawn hacluster /usr/lib/heartbeat/ipfail:重點,若上述ping不成功,啟用ipfail,接管VIP。如果被注釋,即使檢測到主節點失效,仍然無法接管VIP。
/etc/ha.d/haresource配置。該配置必須在族群内主備機一緻,
NodeName IPaddr::IP/掩碼/接口:ha生效後所有資源。NodeName是指主機的機器名,IPaddr是生成VIP,後面IP位址、子網路遮罩、生成該VIP的接口。
/etc/ha.d/authkey配置,最簡單的配置:
<code>auth 1</code>
<code>1 crc</code>
最後修改該檔案權限為600:
<code>chmod</code> <code>600 </code><code>/etc/ha</code><code>.d</code><code>/authkeys</code>
配置修改完成後,運作系統指令:
<code>chkconfig --list|</code><code>grep</code> <code>heartbeat</code>
檢查啟動後是否自動加載heartbeat服務。若3、5是off,使其激活
<code>chkconfig --level 35 heartbeat on</code>
二、安裝完成後,使用腳本定時檢查服務是否正常運作。這裡使用nc的端口掃描功能,若TCP 12345端口打開,則判斷服務正常;若端口關閉,則關閉對外服務接口Eth0,由另一伺服器接管。直到TCP 12345端口恢複正常,重新打開Eth0端口。由于主伺服器Eth0接口關閉後,VIP同時消失,備機即可接管VIP并對外提供服務。
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<code>[root@SrvA ~]</code><code># cat nc_check.sh </code>
<code>#!/bin/bash</code>
<code>declare</code> <code>-i EXIT_STATUS=0</code>
<code>while</code> <code>read</code> <code>port</code>
<code>do</code>
<code> </code><code>#IS PARAMETER A NUMBER?</code>
<code> </code><code>expr</code> <code>$port + 0 1></code><code>/dev/null</code> <code>2>&1</code>
<code> </code><code>if</code> <code>[ $? != 0 ];</code><code>then</code>
<code> </code><code>echo</code> <code>"$port Not a Number."</code>
<code> </code><code>exit</code> <code>1</code>
<code> </code><code>fi</code>
<code> </code><code>nc -z localhost $port 1></code><code>/dev/null</code> <code>2>&1</code>
<code> </code><code>EXIT_STATUS=</code><code>"1"</code>
<code> </code><code>echo</code> <code>"$port Failed"</code>
<code> </code><code>/sbin/ifdown</code> <code>eth0 1></code><code>/dev/null</code> <code>2>&1</code>
<code> </code><code>else</code>
<code> </code><code>EXIT_STATUS=</code><code>"0"</code>
<code> </code><code>/sbin/ifup</code> <code>eth0 1></code><code>/dev/null</code> <code>2>&1</code>
<code>done</code> <code>< </code><code>/root/check_port</code>
<code>exit</code> <code>$EXIT_STATUS</code>
并在/root下建立檔案check_port,把需要檢測的端口寫進去,每行寫一個端口:
<code>[root@SrvA ~]</code><code># cat check_port</code>
<code>12345</code>
執行腳本,如果端口能正常檢測,并在失效後關閉,則寫入定時任務:
<code>[root@SrvA ~]</code><code># crontab -l</code>
<code>*</code><code>/1</code> <code>* * * * </code><code>/root/nc_check</code><code>.sh 1></code><code>/tmp/log/nc_check</code><code>.log 2>&1</code>
最後進行測試,在用戶端開ping ,并關閉主機端口,觀察備機是否能夠接管:
23
<code>來自 192.168.0.254 的回複: 位元組=32 時間<1ms TTL=64</code>
<code>請求逾時。</code>
<code>192.168.0.254 的 Ping 統計資訊:</code>
<code> </code><code>資料包: 已發送 = 3376,已接收 = 3367,丢失 = 9 (0% 丢失),</code>
<code>往返行程的估計時間(以毫秒為機關):</code>
<code> </code><code>最短 = 0ms,最長 = 109ms,平均 = 0ms</code>
<code>Control-C</code>
<code>^C</code>
檢查備機配置:
<code>[root@SrvB ~]</code><code># ifconfig|grep 192.168.0.254</code>
<code> </code><code>inet addr:192.168.0.254 Bcast:192.168.0.255 Mask:255.255.255.0</code>
手工打開主機端口,過段時間觀察主機是否能夠重新接管VIP:
<code>[root@SrvA ~]</code><code># ifconfig|grep 192.168.0.254</code>
注意:由于VIP接管時間很短,ping沒有丢失。
測試完成。這個腳本有個缺陷,就是ifdown會把對外服務的接口關閉,管理者無法通過遠端登陸管理服務,比較适合人工值守的場景。以後慢慢優化。
歡迎指教
<a href="http://down.51cto.com/data/2367713" target="_blank">附件:http://down.51cto.com/data/2367713</a>
本文轉自 gole_huang 51CTO部落格,原文連結:http://blog.51cto.com/golehuang/1774550