文章從理論到實戰,內容會比較長,可有選擇的閱讀。
一、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內部組成,主要分爲以下幾大部分:
下圖顯示了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,介紹如下:
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
1.主配置文件(/etc/ha.d/ha.cf)
下面對ha.cf文件的每個選項進行詳細介紹,其中"#"號後面的內容是對選項的註釋說明。
2.資源文件(/etc/ha.d/haresources)
Haresources文件用於指定雙機系統的主節點、集羣IP、子網掩碼、廣播地址以及啓動的服務等集羣資源,文件每一行可以包含一個或多個資源腳本名,資源之間使用空格隔開,參數之間使用兩個冒號隔開,在兩個HA節點上該文件必須完全一致,此文件的一般格式爲:
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/目錄下找到相應腳步進行啓動或關閉操作。
下面對配置方法進行具體說明:
其中,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認證方式,設置如下:
需要說明的一點是:無論auth後面指定的是什麼數字,在下一行必須作爲關鍵字再次出現,例如指定了"auth 6",下面一定要有一行"6 認證類型"。
最後確保這個文件的權限是600(即-rw——-)。