1. Heartbeat介紹
1.1 Heartbeat作用
通過它可以將資源(IP及程序服務等資源)從一臺故障計算機快速轉移到另一臺運轉正常的機器繼續提供服務,在實際生產應用場景中,heartbeat的功能和另一個高可用開源軟件keepalived有很多相同之處
1.2 Heartbeat工作原理
通過修改配置文件,指定哪一臺Heartbeat服務器作爲主服務器,則另一臺將自動成爲備份服務器。然後在指定備份服務器上配置Heartbeat守護進程來監聽來自主服務器的心跳。如果備份服務器在指定時間內未監聽到來自主服務器的心跳,就會啓動故障轉移程序,並取得主服務器上的相關資源服務所有權,接替主服務器繼續不間斷的提供服務,從而達到資源服務高可用性的目的
以上描述的是Heartbeat主備的模式,Heartbeat還支持主主模式,即兩臺服務器互爲主備,這時它們之間會相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內爲收到對方發送的心跳報文,那麼久認爲對方失效或者宕機了,這時就會啓動自身的資源接管模塊來接管運行在對方主機上的資源或者服務,繼續對用戶提供服務。正常情況下,可以較好的實現主機故障後,業務仍不間斷的持續運行。
1.3 Heartbeat的心跳連接
要部署Heartbeat服務至少需要兩臺之際來完成。那麼這兩臺主機之間是如何做到互相通信和互相監測的呢?
1)串行電纜(首選,缺點是距離不能太遠)
2)一根以太網電纜兩網卡(推薦)
3)以太網電纜,通過交換機等網絡設備連接(次選)
次選,增加了交換機故障端,同時,線路不是專用心跳線,容易受其他數據傳輸的 影響。
1.4 Heartbeat裂腦
1)什麼是裂腦?
由於兩臺搞科研服務器對之間在指定時間內,無法互相檢查到對法心跳而各自啓動故障轉移功能,取得了資源及服務的所有權,而此時的兩臺高可用服務器對都還活着並在正常運行,這樣就會導致同一個IP或服務器在兩端同時啓動而發生衝突的嚴重問題,最嚴重的事故兩臺主機佔用一個IP地址,這樣會導致兩端的數據不一致或造成數據丟失,這種情況被稱爲裂腦,也有人稱其爲分區集羣或大腦垂直分割,英文爲spilt brain
2)導致裂腦發生的多種原因
一般來說,裂腦的發生,有以下幾個原因導致
A 高可用服務器對之間心跳鏈路故障,導致無法正常通信
B 高可用服務器對上開啓了防火牆阻擋了心跳消息傳輸
C 高可用服務器對上心跳網卡抵制等信息配置不正確,導致發送心跳失敗
D 其他服務配置不宕機等原因,如心跳方式不同,心跳廣播衝突,軟件BUG等
3)防止裂腦發生的8種祕籍
A.同時使用串行電纜和以太網電纜連接,同時用兩條心跳線路,這樣一條線路壞了,另一條還是好的,依然能傳送心跳消息
B.檢測到裂腦時強行關閉一個心跳節點。相當於程序上備節點發現心跳線故障,發送關機命令到主節點
C.做好裂腦的監控報警(如郵件及手機短信等),在問題發生時人爲第一時間介入仲裁,降低損失
D.啓用磁盤鎖。正在服務一方鎖住共享磁盤,“裂腦”發生時,讓對方完全“搶不走”共享磁盤資源。但使用鎖磁盤也會有一個不小的問題,如果佔用共享盤的一方不主動解鎖,另一方就永遠得不到共享磁盤。現實中假如服務器節點突然死機或崩潰,就不可能執行解鎖命令。後備節點也就接管不了共享資源和應用服務。於是有人在HA中設計了‘智能’鎖。即,正在服務的一方只在發現心跳線全部斷開時才啓用磁盤鎖。平時就不上鎖
E.報警在服務器接管之前,給人員處理留足夠的時間
F.不直接自動服務器接管,而是由人爲人員控制接管‘
G.增加仲裁機制,確定誰該獲得資源
例如:設置參考IP(如網關IP),當心跳線完全斷開時,2個節點都各自ping一下參考IP,不同則表明斷點就處在本端,不僅心跳線、還有對外服務的本地網絡鏈路斷了,這樣就主動放棄競爭,讓能夠ping通參考IP的一段去接管服務。ping不通參考IP的一方可以自我重啓,以徹底釋放有可能還佔用着的那些共享資源。
1.5 Heartbeat消息類型
Heartbeat軟件在工作過程中,一般來說,有三種消息類型,具體爲
1)心跳消息
心跳消息爲約150字節的數據包,可能爲單播、廣播或多播的方式,控制心跳頻率及出現故障要等待多久進行故障轉換
2)集羣轉換消息
ip-request和ip-request-resp
當主服務器恢復在線狀態時,通過ip-request消息要求備機釋放主服務器失敗時備服務器取得的資源,然後備份服務器關閉釋放主服務器失敗時取得的資源及服務
備服務器釋放主服務器失敗時取得的資源及服務後,就會通過ip-request-resp消息通知主服務器它不在擁有該資源及服務,主服務器收到來自備節點的ip-request-resp消息通知後,啓動失敗時釋放的資源及服務,並開始提供正常的訪問服務
3)重傳請求
1.6 Heartbeat IP地址接管和故障轉移
Heartbeat是通過IP地址接管和ARP廣播進行故障轉移的
ARP廣播:在主服務器故障時,備用節點接管資源後,會立即強制更新所有客戶端本地的ARP表(即清除客戶端本地緩存的失敗服務器的vip地址和mac地址的解析記錄)。確保客戶端和新的主服務器對話。
ifconfig eth0:1 192.168.1.181 netmask 255.255.255.224 up (ip alias)
====>heartbeat軟件默認是使用這個命令來添加VIP的
ip addr add 192.168.1.181/24 broadcast 192.168.1.255 dev eth1 (輔助ip)
====>keepalived軟件默認使用這個命令來添加VIP
1.7 Heartbeat腳本的默認目錄
/etc/init.d/
/etc/ha.d/resource.d/
1.8 Heartbeat配置文件
Heartbeat的默認配置文件目錄爲/etc/ha.d。Heartbeat常用的配置文件有三個,ha.cf、authkey、haresource
配置名稱 | 作用 | 備註 |
ha.cf | heartbeat參數配置文件 | 在這裏配置heartbeat的一些基本參數 |
authkey | heartbeat認證文件 | 高可用服務器對之間根據對端的authkey,對對端進行認證 |
haresource | heartbeat資源配置文件 | 如配置IP資源及腳本程序等 |
2. Heartbeat部署
2.1邏輯架構圖
2.3 Heartbeat服務主機資源規劃
名稱 | 接口 | IP | 用途 |
MASTER | eth0 | 192.168.1.81 | 外網管理IP,用於WAN數據轉發 |
eth1 | 192.168.2.81 | 內網管理IP,用於LAN數據轉發 | |
eth2 | 192.168.3.81 | 用於服務器間心跳連接(直連) | |
vip | 192.168.1.181 | 用於提供應用程序A掛載服務 | |
BACKUP | eth0 | 192.168.1.82 | 外網管理IP,用於WAN數據轉發 |
eth1 | 192.168.2.82 | 內網管理IP,用於LAN數據轉發 | |
eth2 | 192.168.3.82 | 用於服務器間心跳連接(直連) | |
vip | 192.168.1.182 | 用於提供應用程序B掛載服務 |
2.4 分別配置hosts文件
MASTER:
echo ‘192.168.2.82 picdata-1-2’ >> /etc/hosts
BACKUP:
echo '192.168.2.81 picdata-1-1' >> /etc/hosts
通過ping ip地址的方法檢查測試,看起返回的IP和hosts文件對應的是否相同
2.5 配置服務器間心跳鏈接
eth2 192.168.3.81 和eth2 192.168.3.82兩塊網卡之間是通過普通網線直連的,即不通過交換機,直接將兩塊網卡通過網線連接在一起,用於做心跳檢測
在兩臺機器分別增加一條主機路由,來實現兩臺機器檢查對端時通過通過這個心跳線路檢查。
picdata-1-1 Server上增加如下路由
route add -host 192.168.3.82 dev eth2
#這個命令的意思是,從picdata-1-1 Server上訪問192.168.3.82,走eth2網卡出去,即使用心跳線路。
echo 'route add -host 192.168.3.82 dev eth2' >> /etc/rc.local
picdata-1-2 Server上增加如下路由:
route add -host 192.168.3.81 dev eth2
#這個命令的意思是,從picdata-1-2 Server上訪問192.168.3.81,走eth2網卡出去,即使用心跳線路。
echo 'route add -host 192.168.3.81 dev eth2' >> /etc/rc.local
3. 開始實施部署
3.1 安裝heartbeat軟件(配置163源)
安裝epel擴展源:yum -y install epel-release
yum -y install heartbeat
3.2 配置ha.cf文件
cd /usr/share/doc/heartbeat-3.0.4/
cp authkeys ha.cf haresources /etc/ha.d/
cat ha.cf
#the start by oldboy
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local1
keepalive 2
deadtime 30
warntime 10
initdead 120
#以上四行爲一些基礎參數,在你配置是一般不需要改動
#bcast eth1
mcast eth2 225.0.0.81 694 1 0 #eth2網卡上用這個頻率在694端口上廣播,頻率必須改,否則會出問題,建議用IP地址最後一位
#此行表示使用多播的方式,需要改動的僅有eth2,改成你的心跳線的那塊網卡
auto_failback on #控制失敗修復後是否自動回來
node picdata-1-1 #兩臺存儲server的主機名
node picdata-1-2 #兩臺存儲server的主機名
crm no
#the end by oldboy
ha.cf文件詳細說明
參數 | 說明 |
debugfile /var/log/ha-debug | heartbeat的調試日誌存放位置 |
logfile /var/log/ha-log | heartbeat的日誌存放位置 |
logfacility local1 | 在syslog服務中配置通過local1設備接收日誌 |
keepalive 2 | 指定心跳間隔爲2秒 |
deadtime 30 | 指定若備用節點在30 秒內沒有收到主節點的心跳信號,則立即接管主節點的服務資源 |
warntime 10 | 指定心跳延遲的時間爲10秒。當秒鐘內備份節點不能接收到主節點的心跳信號時,就會往日誌中寫入一個警告日誌,但此時不會切換服務 |
initdead 120 | 指定在HEARTBEAT首次運行後需要等待120秒才啓動主服務器的任何資源。該選項用於解決這種情況產生的時間間隔。取值至少爲deadtime的兩倍。單機啓動時會遇到vip綁定很慢,爲正常現象 |
#bcast eth1 | 指定心跳使用以太網廣播方式在eth1接口上進行廣播。如使用兩個實際網絡來傳送心跳則#bcast eth0 eth1 |
mcast eth2 225.0.0.181 694 1 0 | 設置廣播通信使用的端口,694爲默認使用的端口號 |
auto_failback on | 用來定義當主節點恢復後,是否將服務自動切回 |
node picdata-1-1 | 主節點名,可以通過命令uname -n 查看 |
node picdata-1-2 | 備節點名,可以通過命令uname -n 查看 |
crm no | 是否開啓Cluster Resource Manager(集羣資源管理)功能 |
3.3 配置authkey文件
cat authkey
auth 1
1 sha1 47e9336850f1db6fa58bc470bc9b7810eb397f04
chmod 600 /etc/ha.d/authkey
注:兩臺機器都需要配置
3.4 配置haresource文件
cat /etc/ha.d/haresource
picdata-1-1 IPaddr::192.168.1.81/24/eth0
配置好從服務器(主從的配置文件除了ha.cf中的mcast eth2 225.0.0.181 694 1 0,其餘的都一樣)
啓動heartbeat服務
/etc/init.d/heartbeat start
此時在MASTER主機上ifconfig命令查看會有eth0:0,當MASTER掛掉後備服務器上會有eth0:0
此時在主heartbeat服務器上執行hb_standby腳本把本地設置成爲standy,即模擬heartbeat服務器宕機(和停止heartbeat的效果差不多),然後看備份機器的接管情況
4. heartbeat實現web服務高可用案例
4.1 部署準備
目的:通過一個web服務高可用案例帶領大家進一步熟悉heartbeat軟件的使用
資源:延用上面的兩臺機器,機器名分別爲picdata-1-1和picdata-1-2
4.2 安裝配置http服務
在兩臺機器上分別安裝http服務
yum -y install httpd
4.3 修改heartbeat配置(主備兩臺都需要修改)
vim /etc/ha.d/haresources
picdata-1-1 IPaddr::192.168.1.81/24/eth0 httpd
/etc/init.d/heartbeat stop
/etc/init.d/heartbeat start
此時會httpd也會隨之heartbeat啓動而啓動(netstat -lnt 檢查80端口已經開啓)
4.4 有關heartbeat調用httpd腳本的說明
1)httpd命令需要放在/etc/init.d/下或者/etc/ha.d/resource.d下
2)httpd命令需要具備可執行權限(x)
3)httpd必須支持如下啓動方式
/etc/init.d/httpd
Usage: httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}
4.5 有關heartbeat調用資源的生產場景應用
在實際工作中有兩種常見方法實現高可用問題:
1)heartbeat可以僅控制vip資源的漂移,不負責服務資源的啓動及停止
2)heartbeat即控制vip資源的漂移,同時又控制服務器資源啓動及停止
VIP正常,httpd服務宕了,這個時候不會做高可用切換,寫個簡單的腳本定時或守護進程判斷httpd服務,如果有問題,則停止heartbeat,主動使其上的業務到另一臺
4.6 擴展,配置mysql高可用
Mysql的高可用實現方式和httpd基本是一樣的,只是httpd後端用了共享存儲,所以,這裏不需要做數據同步了。而mysql後端沒有用存儲,所以,在做高可用之前,要把兩臺機器做成主從同步或者主主同步。
vim /etc/ha.d/haresources (數據庫是內容,所有綁定到eth1網卡)
picdata-1-1 IPaddr::192.168.2.181/24/eth1 mysqld
4.7 heartbeat和keepalived的應用場景區別
1)對於一般的web,db,負載均衡(nginx,haproxy)等等,heartbeat和keepalived都可以實現。
2)lvs負載均衡最好和keepalived結合(heartbeat調用帶有ipvsadm命令的腳本啓動停止lvs,並且heartbeat沒有對rs的健康檢查功能,但是可以通過ldircetord來補足健康檢查的功能)
3)需要數據同步的高可用業務最好用heartbeat,例如:mysql雙主多從,NFS/MFS存儲,他們的特點是選哦數據同步,這樣的業務最好用heartbeat。因爲heartbeat自帶了drdb的腳本。如果解決了數據同步不要drdb,例如:共享存儲或者inotify+rsync,就可以考慮keepalived。
4)運維人員對那個更熟悉就用哪個,其實,就是你要能控制維護你搭建的服務
4.8 heartbeat服務生產環境選維護要點
在我們每天的實戰運維工作中,當有新項目上線或者VIP更改需求是,可能會進行添加修改服務VIP的操作。
1)在修改配置前執行/etc/init.d/heartbeat stop或/usr/lib64/heartbeat/hb_standby(此命令最好),把本機業務推到備節點工作,當query備節點工作正常後,開始修改本地的配置,修改好後可以執行/etc/init.d/heartbeat start把資源服務接管回來。記得在把業務推到備節點時及修改配置接管回服務是都要立即服務是否正常工作,特別是所有的VIP是否啓動OK,URL地址是不是能夠打開,這個檢查過程可以寫成腳本放heartbeat服務啓動腳本的參數裏等。
2)先修改好一段的配置,然後同步到另一端
/etc/init.d/heartbeat stop
/etc/init.d/heartbeat start
ifconfig | egrep “ip1|ip2”
wget url
準備好後,拷貝粘貼同時執行上面3條命令,執行完畢後看看ip是否OK,如果5秒IP不OK,則需要回滾配置或者再次推到備節點
3)通過heartbeat自帶的如下命令臨時增加IP,並修改配置但不重啓,然後在流量低谷或者夜裏重啓服務器
/etc/ha.d/resource.d/IPaddr 192.168.1.200/eth0 start
總結:負載均衡和高可用服務器的位置一般來說都非常重要,因此,操作時一定要謹慎小心,一定要記得事先寫好操作步驟及回滾步驟,然後再去實施操作,不要逞匹夫之勇,直接動手操作,那樣會極容易導致網站宕機影響用戶體驗,特別是涉及到數據庫和存儲高可用的heartbeat的維護更加要小心。
要經常查看heartbeat服務日誌
cat /var/log/ha.log