1. heartbeat是一個軟體包,實現HA的功能(目前heartbeat只支援雙機的HA)。原理很簡單,設定一個primary server,設定一個需要HA的resource,然後將其他的機器(稱為backup server)和這台server連起來, backup servers不停的接收來自primary server的heartbeat,一旦heartbeat中斷,那麼,backup server接替工作。
2. 為了放置primary server和backup server中間通訊的failure,一般我們推薦用多個physical connection來串連兩台機器。比如,我們可以將兩台機器用乙太網路直連網線連在一起,用一根串口線連在一起等。這裡有張圖,附件1:
3. 使用串口線互聯機器有一個好處,就是如果我們的primary server被hacker攻入了,那麼,hacker無法從primary server以telnet或ssh等方式來登入backup server,這樣就保證了backup server的安全性,從而保證業務的正常運轉。
4. Partitioned Clusters and STONITH. Partitioned Cluster指的是這種情況:如果primary和backup server之間只有一條物理串連,那麼,當這條物理串連失效後,primary和backup server都會認為對方失效了,於是,兩台機器都去搶著獲得resource的控制權,這是十分危險的事情。為了避免這種情況的發生,有兩種解決方案: (1)建立多個物理串連,也就是上面所說的。(2)建立一種機制(通過硬體實現也好,軟體實現也好),可以讓我們非常快的關閉掉一台server,這種機 制就被稱為STONITH-中文就是“爆頭”,HOHO。Heartbeat軟體可以實現一種Stonith配置,從而避免partitioned cluster情況的出現。
5. Heartbeat control messages目前有三種:Heartbeats(有時稱為status messages)、Cluster transition message和Retransmission requests。
Heartbeats這種message可以通過廣播、單一傳播和多播的方式發送,每個message只有150個byte長。我們可以控制多長時間發布一次這種訊息以及多長時間接收一次。
Cluster Transition Message是一種recovery的訊息。這種訊息共兩個:ip-request和ip-request-resp。當primary server修複能正常工作時,他向backup server發送訊息ip-request,backup server得到訊息後,釋放他控制的資源,並回送ip-request-resp,最後primary server重新取回對資源的控制並開始服務。
Retransmission Requests稱為rexmit-request(or ns_rexmit) message,這種訊息發生在這種情況下:每個heartbeat訊息都會帶有一個sequence number,利用這個sequence number,backup server可以判斷heartbeat訊息是否連續和正確。當backup server收到某個heartbeat不正確時,他會要求primary server重新發送一個不帶sequence number的message,以保證primary server是正常工作的(此時不需要sequence number了,因為只需要驗證一下primary server是正常工作的即可),所以,ns_rexmit中的ns是non sequence number的意思。
6. 上述的三種message在乙太網路結構上,heartbeat是通過UDP的方式來發送的。UDP的連接埠可以在/etc/ha.d/ha.cf檔案中定義,多播的地址也可以在該檔案中定義。
7. 目前heartbeat只支援雙機的HA。但是我們可以將多對HA的server接在一個網段內,此時需要注意每對HA Server發送heartbeat的UDP連接埠要不一樣哦。
8. Heartbeat實現雙機切換的原理-Secondary IP Address 或 IP Alias。這兩種方法原理差不多,只不過配置的時候不太一樣,後面會分別講述。這種技術叫IP Address Takeover(IPAT),下面會詳細解釋利用這兩種方法怎麼實現service migration。
9. Secondary IP address 和 ip alias 在實現HA的時候,原理都是一樣的,只不過配置的方法不太一樣而已,一個是通過ip這個命令配置,也只能通過ip命令來查看配置結果;另外一個(ip alias)可以通過ifconfig配置和查看。
10. 現來看看HA實現的原理(通過secondary ip和ip alias)。這裡有兩張圖,一看就明白了,看附件1和附件2:
從圖上可以很明確的看到了,在正常情況下,primary server上配置了四個IP地址,10.1.1.1是用來和backup server作heartbeat的;209.100.100.2是配置在網卡上的真實IP地址;209.100.100.3, 209.100.100.4這兩個是兩個secondary ip(或ip alias),這兩個IP地址其實也是綁定在209.100.100.2這塊網卡上的,這樣一來,我們就可以在這兩個“假”的IP上分別配置 sendmail和http這樣的服務,這樣一台伺服器在外部看來是兩台伺服器,分別是sendmail和http服務,其實在後台是一台伺服器。此 時,backup server配置了兩個IP,10.1.1.2用來做heartbeat,另外一個209.100.100.5是配置在網卡上的真實IP。
現在看第二張圖,可以看到,當primary server down掉的時候,backup server立刻也配置了209.100.100.3, 209.100.100.4這兩個secondary ip(或ip alias),這樣一來,sendmail和http這兩個服務就立刻被接管了過來。這樣就實現了HA。後面會提到,backup server除了將ip地址takover過來了,此外,也會通過一種叫GARP的協議,通知路由器更新ARP table,讓針對這兩個IP的MAC地址也更新到backup server網卡的MAC地址上來。
11. 下面開始分別講解secondary ip和ip alias。通過以下的命令可以查看secondary ip的配置情況:
#ip addr show -- 查看
#ip addr add 209.100.100.3/24 broadcast 209.100.100.255 dev eth0 -- 在eth0上增加一個secondary ip為209.100.100.3/255.255.255.0
#ip addr del 209.100.100.3/24 broadcast 209.100.100.255 dev eth0 -- 刪除eth0上的secondary ip
不過在將來真正使用heartbeat的時候,我們不需要手工來輸入這些命令,因為heartbeat提供了一個叫做IPaddr2的指令碼,我們 只需要在heartbeat的設定檔中配置好secondary ip,那麼,這個IPaddr2的指令碼會自動為我們調上面的命令列。
12. IP alias. 通過以下命令配置:
#ifconfig eth0:0 209.100.100.3 netmask 255.255.255.0 up -- 配置ip alias eth0:0
#ifconfig -- 查看eth0:0的配置,可以看到MAC地址,中斷和資源使用都和eth0一樣
#ifconfig eth0:0 down -- remove ip alias
和secondary ip一樣,我們不需要手動來輸入上面的命令配置,heartbeat提供了一個叫做IPaddr的指令碼來協助我們設定ip alias. 此外,注意,ip alias必須和真實的IP在一個子網,不能跨網段。
13. 注意!!!不要將上述的哪些命令放到Linux系統啟動中去,因為heartbeat會幫我們來配置這些secondary ip或ip alias(配置/etc/hd.d/haresouces這個檔案),所以,只需要確保heartbeat在linux啟動的時候能啟動即可,不需要我 們手動在linux啟動的時候配置他們。千萬注意!!
14. GARP -- Gratuitous ARP。前面已經提到了,backup server光把IP地址接管過來是沒有用的,因為路由器的ARP Table表中還儲存者IP地址和MAC的對應資訊,必須將這些IP地址對應的MAC地址也更新過來。在這種情況下,heartbeat用了一個比較詭異 的做法,使用GARP。他的基本原理是這樣的:heartbeat有一個叫做send_arp的程式,利用這個程式發送一個ARP廣播,這個廣播中將需要 查詢的IP地址和MAC地址,以及響應的IP地址都放進去了,就好比這樣,這個ARP廣播首先在網內詢問“209.100.100.3這個IP地址的 MAC地址是什嗎?”,然後這個廣播自問自答“209.100.100.3這個IP地址的MAC地址是XXXXXX”,通過這種辦法,路由器就會更新 ARP Table了。
15. 書中很不錯,提供了一個實現GARP的指令碼,這個指令碼會利用到send_arp這個程式:
-
Code: Select all
-
#!/bin/bash
#
# iptakeover script
#
# Simple script to take over an IP address.
#
# Usage is "iptakeover {start|stop|status}"
#
# SENDARP is the program included with the Heartbeat program that
# sends out an ARP request. Send_arp usage is:
#
#
SENDARP="/usr/lib/heartbeat/send_arp"
#
# REALIP is the IP address for this NIC on your LAN.
#
REALIP="299.100.100.2"
#
# ROUTERIP is the IP address for your router.
#
ROUTER_IP="299.100.100.1"
#
# SECONDARYIP is the first IP alias for a service/resource.
#
SECONDARYIP1="299.100.100.3"
# or
#IPALIAS1="299.100.100.3"
#
# NETMASK is the netmask of this card.
#
NETMASK="24"
# or
# NETMASK="255.255.255.0"
#
BROADCAST="299.100.100.0"
#
# MACADDR is the hardware address for the NIC card.
# (You'll find it using the command "/sbin/ifconfig")
#
MACADDR="091230910990"
case $1 in
start)
# Make sure our primary IP is up
/sbin/ifconfig eth0 $REALIP up
# Associate the virtual IP address with this NIC
/sbin/ip addr add $SECONDARYIP1/$NETMASK broadcast $BROADCAST dev eth0
# Or, to create an IP alias instead of secondary IP address, use the
command:
# /sbin/ifconfig eth0:0 $IPALIAS1 netmask $NETMASK up
# Create a new default route directly to the router
/sbin/route add default gw $ROUTER_IP
# Now send out 5 Gratuitous ARP broadcasts (ffffffffffff)
# at two second intervals to tell the local computers to update
# their ARP tables.
$SENDARP -i 2000 -r 5 eth0 $SECONDARYIP1 $MACADDR $SECONDARYIP1 ffffffffffff
;;
stop)
# Take down the secondary IP address for the service/resource.
/sbin/ip addr del $SECONDARYIP1/$NETMASK broadcast $BROADCAST dev eth0
# or
/sbin/ifconfig eth0:0 down
;;
status)
# We check to see if we own the IPALIAS.
OWN_ALIAS=`ifconfig | grep $SECONDARYIP1`
if [ "$OWN_ALIAS" != "" ]; then
echo "OK"
else
echo "DOWN"
fi
;;
# End of the case statement.
esac
上面的指令碼很清楚的展示了這個廣播包中包含的內容和如何發送這個廣播。我們可以用這個指令碼來確認我們的網路能否接受這種GARP的廣播。GARP完成後,通過ifconfig命令或是登上路由器,查看其ARP Table的內容可以來確認GARP是否生效了。
16. 前面講述了heartbeat如何?雙機切換的-通過IP地址的takeover。現在來看到heartbeat原理中另外一個非常重要的部分 -Resource Scripts。這個script是我們自己寫的,目的只有一個,就是通過這種方式讓heartbeat確切的知道我們的應用的狀態,從而 heartbeat完成他的功能。比如說我們想讓heartbeat監控我們的http服務(當http服務down掉的時候做雙機切換),那麼,我們就 需要自己寫一個監控http服務的指令碼,通過返回不同的關鍵字,讓heartbeat知道我們http服務的運行狀態。
17.一個典型的resource script是這樣的:
-
Code: Select all
-
#!/bin/bashcase $1 in
start)
commands to start my resource
;;
stop)
commands to stop my resource
;;
status)
commands to test if I own the resource
;;
*)
echo "Syntax incorrect. You need one of {start|stop|status}"
;;
esac
18. heartbeat要求一個resource script至少要能對start, stop和status三種輸入做出響應,其中start和stop用來給heartbeat控制我們的resource;status用來給 heartbeat判斷我們的resource是否active,而且在status的返回資訊中,heartbeat有這樣的要求,即在status的 返回中,必須返回OK/Running/running這樣的字串,這樣heartbeat就會認為這個resource目前是active的,其他的 返回資訊heartbeat都會認為resource處於inactive的狀態,不過千萬注意,不要返回no OK, no Running這樣的字串,如果這樣,heartbeat也會認為resource是active的,因為heartbeat是通過在字串中尋找 OK, running這樣的字串來判別的。此外,我們的resource script的return code也必須是0,以告訴heartbeat,指令碼正常執行。
19. 當我們寫好這樣的一個resource script之後,heartbeat就可以知道我們的resource的情況,同時也可以控制這個resource了(resource的相關邏輯由我 們自己定義在resource script中)。將這個script放在/etc/init.d目錄或/etc/ha.d/resource.d目錄下即可,不過千萬注意哦,不要將這 個script放到啟動中去,因為heartbeat負責幫我們handle這個resource的啟動和關閉的動作。
20. 書中還很體貼的,對resource script的內容給出了一些建議,比如,我們現在要做HA的是sendmail這個service,那麼可以用pidof這個命令(RedHat和 SuSE有這個命令)來查詢sendmail這個進程是否存在,此外,也可以用ip命令或ifconfig命令來確認secondary ip address和ip alias是否正在正常工作。所有這些寫在resource script中的話,都可以協助我們確定我們的resource是否工作正常,從而給status這個關鍵參數的輸入做出響應。
21. 總結一下,我們需要自己寫一個resource script,這個script類似於/etc/init.d中的指令碼,這個指令碼必須能handle start/stop/status 這些輸入參數,從而讓heartbeat來控制我們的resource/service。另外,不要將這個script放到啟動中去,因為在 heartbeat啟動的時候,他會負責調用這個指令碼,從而保證我們的resource/service能正常啟動。
22. OK,heartbeat的原理已經講完了,下面我們就會開始配置一個heartbeat,heartbeat的設定檔主要有三個:
/etc/ha.d/ha.cf
Specifies how the heartbeat daemons on each system communicate with each other.
/etc/ha.d/haresources
Specifies which server should normally act as the primary server for a particular resource and which server should own the IP address that client computers will use to access the resource.
/etc/ha.d/authkeys
Specifies how the Heartbeat packets should be encrypted.
下一章我們就開始具體配置一個heartbeat。