heartbeat高可用詳解

文章從理論到實戰,內容會比較長,可有選擇的閱讀。

一、heartbeat的概念
   Linux-HA的全稱是High-Availability Linux,它是一個開源項目,這個開源項目的目標是:通過社區開發者的共同努力,提供一個增強linux可靠性(reliability)、可用性(availability)和可服務性(serviceability)(RAS)的羣集解決方案。其中Heartbeat就是Linux-HA項目中的一個組件,也是目前開源HA項目中最成功的一個例子,它提供了所有 HA 軟件所需要的基本功能,比如心跳檢測和資源接管、監測羣集中的系統服務、在羣集中的節點間轉移共享 IP 地址的所有者等,自1999年開始到現在,Heartbeat在行業內得到了廣泛的應用,也發行了很多的版本,可以從Linux-HA的官方網站
www.linux-ha.org下載到Heartbeat的最新版本。


二、HA集羣中的相關術語
1.節點(node)
   運行heartbeat進程的一個獨立主機,稱爲節點,節點是HA的核心組成部分,每個節點上運行着操作系統和heartbeat軟件服務,在heartbeat集羣中,節點有主次之分,分別稱爲主節點和備用/備份節點,每個節點擁有唯一的主機名,並且擁有屬於自己的一組資源,例如,磁盤、文件系統、網絡地址和應用服務等。主節點上一般運行着一個或多個應用服務。而備用節點一般處於監控狀態。


2.資源(resource)
  資源是一個節點可以控制的實體,並且當節點發生故障時,這些資源能夠被其它節點接管,heartbeat中,可以當做資源的實體有:
  磁盤分區、文件系統
  IP地址
  應用程序服務
  NFS文件系統


3.事件(event)
   也就是集羣中可能發生的事情,例如節點系統故障、網絡連通故障、網卡故障、應用程序故障等。這些事件都會導致節點的資源發生轉移,HA的測試也是基於這些事件來進行的。


4.動作(action)
   事件發生時HA的響應方式,動作是由shell腳步控制的,例如,當某個節點發生故障後,備份節點將通過事先設定好的執行腳本進行服務的關閉或啓動。進而接管故障節點的資源。


三、Heartbeat的組成與原理 
1.Heartbeat的組成 
Heartbeat提供了高可用集羣最基本的功能,例如,節點間的內部通信方式、集羣合作管理機制、監控工具和失效切換功能等 
Heartbeat內部組成,主要分爲以下幾大部分:

  • heartbeat: 節點間通信檢測模塊
  • ha-logd: 集羣事件日誌服務
  • CCM(Consensus Cluster Membership):集羣成員一致性管理模塊
  • LRM (Local Resource Manager):本地資源管理模塊
  • Stonith Daemon: 使出現問題的節點從集羣環境中脫離
  • CRM(Cluster Resource Management):集羣資源管理模塊
  • Cluster Policy Engine: 集羣策略引擎
  • Cluster Transition Engine:集羣轉移引擎

下圖顯示了Heartbeat2.0內部結構組成: 
這裏寫圖片描述 
2.Heartbeat的工作原理 
集羣成員一致性管理模塊(CCM用於管理集羣節點成員,同時管理成員之間的關係和節點間資源的分配,heartbeat模塊負責檢測主次節點的運行狀態,以判斷節點是否失效。ha-logd模塊用於記錄集羣中所有模塊和服務的運行信息。

本地資源管理器(LRM)負責本地資源的啓動,停止和監控,一般由LRM守護進程lrmd和節點監控進程(Stonith Daemon)組成,lrmd守護進程負責節點間的通信,Stonith Daemon通常是一個Fence設備,主要用於監控節點狀態,當一個節點出現問題時處於正常狀態的節點會通過Fence設備將其重啓或關機以釋放IP、磁盤等資源,始終保持資源被一個節點擁有,防止資源爭用的發生。

集羣資源管理模塊(CRM)用於處理節點和資源之間的依賴關係,同時,管理節點對資源的使用,一般由CRM守護進程crmd、集羣策略引擎和集羣轉移引擎三個部分組成,集羣策略引擎(Cluster policy engine)具體實施這些管理和依賴,集羣轉移引擎(Cluster transition engine)監控CRM模塊的狀態,當一個節點出現故障時,負責協調另一個節點上的進程進行合理的資源接管。

在Heartbeat集羣中,最核心的是heartbeat模塊的心跳監測部分和集羣資源管理模塊的資源接管部分,心跳監測一般由串行接口通過串口線來實現,兩個節點之間通過串口線相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未受到對方發送的報文,那麼就認爲對方失效,這時資源接管模塊將啓動,用來接管運行在對方主機上的資源或者服務。

Heartbeat僅僅是個HA軟件,它僅能完成心跳監控和資源接管,不會監視它控制的資源或應用程序,要監控資源和應用程序是否運行正常,必須使用第三方的插件,例如ipfail、Mon、Ldirector等。Heartbeat自身包含了幾個插件,分別是ipfail、Stonith和Ldirectord,介紹如下:

  • ipfail的功能直接包含在Heartbeat裏面,主要用於檢測網絡故障,並作出合理的反應,爲了實現這個功能,ipfail使用ping節點或者ping節點組來檢測網絡連接是否出現故障,從而及時的做出轉移措施。
  • Stonith插件可以在一個沒有響應的節點恢復後,合理接管集羣服務資源,防止數據衝突,當一個節點失效後,會從集羣中刪除,如果不使用Stonith插件,那麼失效的節點可能會導致集羣服務在多於一個節點運行,從而造成數據衝突甚至是系統崩潰。因此,使用Stonith插件可以保證共享存儲環境中的數據完整性。
  • Ldirector是一個監控集羣服務節點運行狀態的插件。Ldirector如果監控到集羣節點中某個服務出現故障,就屏蔽此節點的對外連接功能,同時將後續請求轉移到正常的節點提供服務,這個插件經常用在LVS負載均衡集羣中。
四、Heartbeat的配置
 

1、寫在前面

    HA即(high available)高可用,又被叫做雙機熱備,用於關鍵性業務。簡單理解就是,有2臺機器 A 和 B,正常是 A 提供服務,B 待命閒置,當 A 宕機或服務宕掉,會切換至B機器繼續提供服務。常見的實現高可用的開源軟件有 heartbeat 和 keepalived。

    這樣,一臺 web 服務器一天24小時提供web服務,難免會存在 web 服務掛掉或服務器宕機宕機的情況,那麼用戶就訪問不了服務了,這當然不是我們期望的。如果這樣,有2臺服務器,A對外提供 web 服務,B作爲備用,如果A掛掉,那麼B立刻替代A的位置去提供 web 服務,這樣對用戶來說是透明的。但是有個問題,服務器A的 ip 是 1.1.1.1,服務器B的 ip 是 1.1.1.2,顯然向用戶提供A或B的ip地址是不可行的,因爲用戶總不能去切換ip來訪問的吧。這時heartbeat或keepalived可以提供一個虛擬IP:1.1.1.3,用戶只需要訪問 1.1.1.3,當A提供服務時,VIP 會設置在A服務器上,當B提供服務時,VIP會設置在B服務器上,這樣就可以讓用戶通過訪問 1.1.1.3來獲取web服務,即使A或B服務器切換也不影響用戶的正常訪問。

下面我們使用 heartbeat 來做 HA 集羣,並且把 nginx 服務作爲 HA 對應的服務,VIP在哪,nginx就在哪臺啓動,slave那臺nginx服務被關閉。

 

2、準備實驗環境

服務器A:
主機名:master
操作系統:CentOS6.6 64位
eth0網卡地址:172.16.87.148
eth1網卡地址:172.16.254.48

服務器B:
主機名:slave
操作系統:CentOS6.6 64位
eth0網卡地址:172.16.87.168
eth1網卡地址:172.16.254.68

虛擬VIP:
VIP:172.16.87.196

eth0網卡用於管理及對外提供服務,eth1網卡用於節點直接的心跳。

 

3、設置主機名

master節點設置hostname

hostname master vim /etc/sysconfig/network 編輯配置文件: HOSTNAME=master

slave節點設置hostname

# hostname slave # vim /etc/sysconfig/network 編輯配置文件: HOSTNAME=slave

4、關閉防火牆和selinux(2臺節點都要操作)

關閉iptables

# service iptables stop
# chkconfig iptables off 

關閉selinux:

# setenforce 0 # sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

5、配置hosts文件(2臺節點都操作)

# vim /etc/hosts 增加內容如下: 172.16.87.148 master 172.16.87.168 slave

6、安裝epel擴展源 (2臺都操作)

# yum install -y epel-release

7、安裝heartbeat (2臺都操作)

# yum install -y heartbeat* libnet nginx

8、主master節點配置

1、拷貝配置文件:

# cd /usr/share/doc/heartbeat-3.0.4/ # cp authkeys ha.cf haresources /etc/ha.d/ # cd /etc/ha.d

2、修改authkeys(26行代碼)

# vim authkeys 更改或增加如下內容: auth 3
3 md5 Hello! 然後修改其權限 # chmod 600 authkeys

3、編輯haresources文件(149行代碼)

# vim haresources 加入下面一行: master 172.16.87.196/24/eth0:10 nginx

說明:master爲主節點hostname,172.16.87.196爲vip,/24爲掩碼爲24的網段,eth0:10爲vip的設備名,nginx爲heartbeat監控的服務,也是兩臺機器對外提供的核心服務。

4、編輯ha.cf(340行代碼)

複製代碼
# vim ha.cf 文件中都有相關參數的英文解釋,爲了不破壞整體性,建議配置在最後追加,追加如下內容: debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 warntime 10 initdead 60 udpport 694 ucast eth1 172.16.254.68 auto_failback on node master node slave ping 172.16.87.254 respawn root /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=root uid=root
如果ping不通,vip是不會啓用的。
複製代碼

配置說明(更多詳細說明見文章最後部分):

debugfile /var/log/ha-debug:該文件保存heartbeat的調試信息。
logfile /var/log/ha-log:heartbeat的日誌文件。
keepalive 2:心跳的時間間隔,默認時間單位爲秒s。
deadtime 30:超出該時間間隔未收到對方節點的心跳,則認爲對方已經死亡。
warntime 10:超出該時間間隔未收到對方節點的心跳,則發出警告並記錄到日誌中。
initdead 60:在某系統上,系統啓動或重啓之後需要經過一段時間網絡才能正常工作,該選項用於解決這種情況產生的時間間隔,取值至少爲deadtime的2倍。
udpport 694:設置廣播通信使用的端口,694爲默認使用的端口號。
ucast eth1 172.16.254.28:設置對方機器心跳檢測的網卡和IP。
auto_failback on:heartbeat的兩臺主機分別爲主節點和從節點。主節點在正常情況下佔用資源並運行所有的服務,遇到故障時把資源交給從節點由從節點運行服務。在該選項設爲on的情況下,一旦主節點恢復運行,則自動獲取資源並取代從節點,否則不取代從節點。
respawn heartbeat /usr/lib/heartbeat/ipfail:指定與heartbeat一同啓動和關閉的進程,該進程被自動監視,遇到故障則重新啓動。最常用的進程是ipfail,該進程用於檢測和處理網絡故障,需要配合ping語句指定的ping node來檢測網絡連接。如果你的系統是64bit,請注意該文件的路徑。

 

9、把主節點上的三個配置文件拷貝到從節點

# cd /etc/ha.d # scp authkeys ha.cf haresources slave:/etc/ha.d

10、從節點slave編輯ha.cf

# vim /etc/ha.d/ha.cf 只需要更改一個地方如下: ucast eth1 172.16.254.68改爲ucast eth1 172.16.254.48

11、從節點slave修改authkey權限

 
   
chmod 600 authkeys

12、啓動heartbeat服務

配置完畢後,先master啓動,後slave啓動。

# service heartbeat start

13、檢查測試

# ifconfig 看是否有接口 eth0:10 # ps aux | grep nginx 看是否有nginx進程

14、測試方式1

主節點上故意禁ping

# iptables -I INPUT -p icmp -j DROP

15、測試方式2

主節點停止heartbeat服務

# service heartbeat stop

16、測試腦裂

主節點master和從節點slave都down掉eth1網卡

# ifdown eth1

可以利用/usr/share/heartbeat下的hb_standby和hb_takeover命令來模擬資源切換
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Heartbeat配置文件的詳解

1.主配置文件(/etc/ha.d/ha.cf)

下面對ha.cf文件的每個選項進行詳細介紹,其中"#"號後面的內容是對選項的註釋說明。

  1. #debugfile /var/log/ha-debug  
  2. logfile /var/log/ha-log     #指名heartbeat的日誌存放位置。  
  3. #crm yes                    #是否開啓Cluster Resource Manager(集羣資源管理)功能。  
  4. bcast eth1              #指明心跳使用以太網廣播方式,並且是在eth1接口上進行廣播。  
  5. keepalive 2             #指定心跳間隔時間爲2秒(即每2秒鐘在eth1上發送一次廣播)。  
  6. deadtime 30 #指定若備用節點在30秒內沒有收到主節點的心跳信號,則立即接管主節點的服務資源。  
  7. warntime 10 #指定心跳延遲的時間爲10秒。當10秒鐘內備份節點不能接收到主節點的 心跳信號時,就會往日誌中寫入一個警告日誌,但此時不會切換服務。  
  8. initdead 120    #在某些系統上,系統啓動或重啓之後需要經過一段時間網絡才 能正常工作,該選項用於解決這種情況產生的時間間隔。取值至少爲deadtime的兩倍。  
  9. udpport 694             #設置廣播通信使用的端口,694爲默認使用的端口號。  
  10. baud 19200              #設置串行通信的波特率。  
  11. #serial /dev/ttyS0      #選擇串行通信設備,用於雙機使用串口線連接的情況。 如果雙機使用以太網連接,則應該關閉該選項。  
  12. #ucast eth0 192.168.1.2 #採用網卡eth0的udp單播來組織心跳,後面跟的 IP地址應爲雙機對方的IP地址。  
  13. #mcast eth0 225.0.0.1 694 1 0   #採用網卡eth0的Udp多播來組織心跳, 一般在備用節點不止一臺時使用。Bcast、ucast和mcast分別代表廣播、單播 和多播,是組織心跳的三種方式,任選其一即可。  
  14. auto_failback on    #用來定義當主節點恢復後,是否將服務自動切回。 heartbeat的兩臺主機分別爲主節點和備份節點。主節點在正常情況下佔用資源 並運行所有的服務,遇到故障時把資源交給備份節點並由備份節點運行服務。在該 選項設爲on的情況下,一旦主節點恢復運行,則自動獲取資源並取代備份節點; 如果該選項設置爲off,那麼當主節點恢復後,將變爲備份節點,而原來的備份節點成爲主節點。  
  15. #stonith baytech /etc/ha.d/conf/stonith.baytech     # stonith的主 要作用是使出現問題的節點從集羣環境中脫離,進而釋放集羣資源,避免兩個節點爭 用一個資源的情形發生。保證共享數據的安全性和完整性。  
  16. #watchdog /dev/watchdog #該選項是可選配置,是通過Heartbeat來監控系統的運 行狀態。使用該特性,需要在內核中載入"softdog"內核模塊,用來生成實際的設備文件, 如果系統中沒有這個內核模塊,就需要指定此模塊,重新編譯內核。編譯完成輸入 "insmod softdog"加載該模塊。然後輸入"grep misc /proc/devices"(應爲10), 輸入"cat /proc/misc |grep watchdog"(應爲130)。最後,生成設備文件: "mknod /dev/watchdog c 10 130" 。即可使用此功能。  
  17. node node1              #主節點主機名,可以通過命令"uanme -n"查看。  
  18. node node2              #備用節點主機名。  
  19. ping 192.168.60.1   #選擇ping的節點,ping節點選擇的越好,HA集羣就越強壯, 可以選擇固定的路由器作爲ping節點,但是最好不要選擇集羣中的成員作爲ping節點, ping節點僅僅用來測試網絡連接。  
  20. respawn hacluster /usr/lib/heartbeat/ipfail #該選項是可選配置,列出與 heartbeat一起啓動和關閉的進程,該進程一般是和heartbeat集成的插件,這些進程 遇到故障可以自動重新啓動。最常用的進程是ipfail,此進程用於檢測和處理網絡故障, 需要配合ping語句指定的ping node來檢測網絡的連通性。其中hacluster表示啓動ipfail進程的身份。 

2.資源文件(/etc/ha.d/haresources)

Haresources文件用於指定雙機系統的主節點、集羣IP、子網掩碼、廣播地址以及啓動的服務等集羣資源,文件每一行可以包含一個或多個資源腳本名,資源之間使用空格隔開,參數之間使用兩個冒號隔開,在兩個HA節點上該文件必須完全一致,此文件的一般格式爲:

  1. node-name network  <resource-group> 

node-name表示主節點的主機名,必須和ha.cf文件中指定的節點名一致。network用於設定集羣的IP地址、子網掩碼和網絡設備標識 等。需要注意的是,這裏指定的IP地址就是集羣對外服務的IP地址,resource-group用來指定需要Heartbeat託管的服務,也就是這些 服務可以由Heartbeat來啓動和關閉。如果要託管這些服務,就必須將服務寫成可以通過start/stop來啓動和關閉的腳步,然後放到/etc /init.d/或者/etc/ha.d/resource.d/目錄下,Heartbeat會根據腳本的名稱自動去/etc/init.d或者/etc /ha.d/resource.d/目錄下找到相應腳步進行啓動或關閉操作。

下面對配置方法進行具體說明:

  1. node1 IPaddr::192.168.60.200/24/eth0/  Filesystem:: /dev/sdb5::/webdata::ext3  httpd tomcat 

其中,node1是HA集羣的主節點,IPaddr爲heartbeat自帶的一個執行腳 步,Heartbeat首先將行/etc/ha.d/resource.d/IPaddr 192.168.60.200/24 start的操作,也就是虛擬出一個子網掩碼爲255.255.255.0,IP爲192.168.60.200的地址。此IP爲Heartbeat對外 提供服務的網絡地址,同時指定此IP使用的網絡接口爲eth0。接着,Heartbeat將執行共享磁盤分區的掛載操 作,"Filesystem::/dev/sdb5::/webdata::ext3"相當於在命令行下執行mount操作,即"mount -t ext3 /dev/sdb5 /webdata",最後依次啓動httpd和Tomcat服務。

注意 主節點和備份節點中資源文件haresources要完全一樣。

3.認證文件(/etc/ha.d/authkeys)

authkeys文件用於設定Heartbeat的認證方式,共有3種可用的認證方式,即 crc、md5和sha1。3種認證方式的安全性依次提高,但是佔用的系統資源也依次增加。如果Heartbeat集羣運行在安全的網絡上,可以使用 crc方式;如果HA每個節點的硬件配置很高,建議使用sha1,這種認證方式安全級別最高;如果是處於網絡安全和系統資源之間,可以使用md5認證方 式。這裏我們使用crc認證方式,設置如下:

  1. auth 1  
  2. 1 crc  
  3. #2 sha1 sha1_any_password  
  4. #3 md5 md5_any_password 

需要說明的一點是:無論auth後面指定的是什麼數字,在下一行必須作爲關鍵字再次出現,例如指定了"auth 6",下面一定要有一行"6 認證類型"。

最後確保這個文件的權限是600(即-rw——-)。