天天看點

使用Heartbeat和腳本使伺服器服務失效後自動切換

名詞解釋:

簇群(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&gt;</code><code>/dev/null</code> <code>2&gt;&amp;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&gt;</code><code>/dev/null</code> <code>2&gt;&amp;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&gt;</code><code>/dev/null</code> <code>2&gt;&amp;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&gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>done</code> <code>&lt; </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&gt;</code><code>/tmp/log/nc_check</code><code>.log 2&gt;&amp;1</code>

最後進行測試,在用戶端開ping ,并關閉主機端口,觀察備機是否能夠接管:

23

<code>來自 192.168.0.254 的回複: 位元組=32 時間&lt;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

繼續閱讀