盛樂標(biāo) 周慶林
摘要??? 隨著云計(jì)算的發(fā)展,各行各業(yè)的業(yè)務(wù)也開始云化。隨著云端業(yè)務(wù)的增長(zhǎng),以虛擬機(jī)為基礎(chǔ)搭建的虛擬機(jī)集群也迅速增多。但是,某些軟件在虛擬機(jī)上的行為與在裸機(jī)上的行為卻存在差異。本文研究的Keepalived在虛擬機(jī)環(huán)境中的某些場(chǎng)景,會(huì)因?yàn)樘摂MIP不能正常漂移而導(dǎo)致故障轉(zhuǎn)移失效。本文將詳細(xì)分析Keepalived虛擬IP漂移異常的原因,并提出一套可行的解決方案。
【關(guān)鍵詞】虛擬機(jī) 集群 高可用 Keepalived
在生產(chǎn)環(huán)境和對(duì)集群運(yùn)行穩(wěn)定性要求較高的環(huán)境里,一般都需要進(jìn)行集群的高可用和負(fù)載均衡配置。實(shí)現(xiàn)負(fù)載均衡既有硬件方案也有軟件方案。硬件方案的成本較高,很多集群都采用了軟件方案。在軟件方案中,很多人選擇使用Keepalived與負(fù)載均衡軟件配合使用以達(dá)到集群的高可用和負(fù)載均衡。隨著虛擬化技術(shù)和云計(jì)算的發(fā)展,集群的構(gòu)成也發(fā)生了變化,以前的集群一般是以服務(wù)器裸機(jī)來(lái)構(gòu)建,但現(xiàn)在隨著業(yè)務(wù)的云化,很多集群實(shí)際上構(gòu)建于虛擬機(jī)之上,也稱虛擬機(jī)集群。由于虛擬機(jī)不像裸機(jī)直接運(yùn)行于服務(wù)器硬件之上,它的工作必須依賴hypervisor,因此在虛擬機(jī)環(huán)境中,某些軟件的行為也發(fā)生了變化。本文將主要研究Keepalived在部分虛擬機(jī)環(huán)境中虛擬IP不能自動(dòng)漂移的問題。
1 研究虛擬機(jī)環(huán)境中Keepalived虛擬IP自動(dòng)漂移的背景
在采用軟件方案建設(shè)高可用負(fù)載均衡集群時(shí),我們一般會(huì)考慮Keepalived或Heartbeat與LVS、HAProxy、NGNIX等負(fù)載均衡軟件配合使用,以實(shí)現(xiàn)集群的高可用和負(fù)載均衡。以Keepalived為例,Keepalived負(fù)責(zé)負(fù)載均衡服務(wù)器的高可用,而負(fù)載均衡服務(wù)器上的負(fù)載均衡軟件則根據(jù)具體的負(fù)載均衡算法將訪問流量轉(zhuǎn)發(fā)至后端服務(wù)器。可以看出,Keepalived是訪問數(shù)據(jù)鏈中非常關(guān)鍵的一環(huán),一旦Keepalived不能正常工作,即使負(fù)載均衡服務(wù)器和后端服務(wù)器工作正常,整個(gè)集群也無(wú)法正常提供服務(wù)。我們研究發(fā)現(xiàn),在部分虛擬機(jī)集群中,Keepalived的虛擬IP自動(dòng)漂移功能在某些情況下并不能正常工作。如今公有云得到了大力發(fā)展,很多在公有云平臺(tái)上建立的集群實(shí)際上都是基于虛擬機(jī)的虛擬機(jī)集群。該功能的失常,給虛擬機(jī)集群的正常運(yùn)行帶來(lái)了很大的隱患。本文將分析該功能失常的原因,并給出具體的解決方案。
2 虛擬機(jī)環(huán)境中Keepalived虛擬IP漂移的行為分析
2.1 Keepalived工作原理
Keepalived是以虛擬路由冗余協(xié)議(Virtual Router Redundancy Protocol,VRRP)為基礎(chǔ)實(shí)現(xiàn)集群或多臺(tái)服務(wù)器高可用的軟件。Keepalived將一組服務(wù)器組成一個(gè)服務(wù)器組,在這組服務(wù)器里有一個(gè)Master節(jié)點(diǎn),其它均為Backup節(jié)點(diǎn)。Master節(jié)點(diǎn)會(huì)獲得一個(gè)虛擬IP(VirtualIP,VIP),Backup節(jié)點(diǎn)沒有虛擬IP。Master節(jié)點(diǎn)正常工作時(shí),會(huì)周期性地在同網(wǎng)段內(nèi)發(fā)送VRRP組播(心跳包)。當(dāng)Backup節(jié)點(diǎn)接收不到VRRP心跳包時(shí),則認(rèn)為Master節(jié)點(diǎn)發(fā)生故障,此時(shí)故障轉(zhuǎn)移機(jī)制開始工作。所有的Backup節(jié)點(diǎn)根據(jù)它們的優(yōu)先級(jí)選出一個(gè)新的Master節(jié)點(diǎn),原Master節(jié)點(diǎn)的虛擬IP漂移至新的Master節(jié)點(diǎn)繼續(xù)對(duì)外提供服務(wù)。Keepalived服務(wù)器上如果安裝了負(fù)載均衡軟件,還可以將來(lái)訪的流量分流至各個(gè)后端服務(wù)器。Keepalived的工作原理圖詳見圖1。
2.2 Keepalived節(jié)點(diǎn)環(huán)境
在我們的測(cè)試環(huán)境中,所有虛擬機(jī)的hypervisor均為VMwareESXi6.5。虛擬機(jī)中安裝的操作系統(tǒng)為CentOS7.4。Master節(jié)點(diǎn)的IP地址為192.168.2.6,Backup節(jié)點(diǎn)的IP地址為192.168.2.7,虛擬IP地址為192.168.2.5。Keepalived使用的網(wǎng)絡(luò)接口名稱為ens192。兩臺(tái)Keepalived節(jié)點(diǎn)的Keepalived軟件版本均為v1.3.5,另外還安裝了負(fù)載均衡軟件HAProxy,軟件版本均為1.5.18。Keepalived安裝完以后,進(jìn)行相關(guān)配置,步驟如下:
(1)關(guān)閉CentOS的SELinux功能。
(2)將系統(tǒng)參數(shù)net.ipv4.ip_forward設(shè)置為1,以允許數(shù)據(jù)包轉(zhuǎn)發(fā)。
(3)由于Keepalived需要發(fā)送目的地為224.0.0.18的VRRP組播信息,因此在Keepalived節(jié)點(diǎn)添加相應(yīng)的防火墻規(guī)則:
firewall-cmd --direct --permanent --add- rule ipv4 filter INPUT 0 --in-interface ens192 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add- rule ipv4 filter OUTPUT 0 --out-interface ens192 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
(4)進(jìn)行Keepalived的配置,配置文件如下:
! Configuration File for keepalived global_defs {
router_id main_router vrrp_lower_prio_no_advert true }vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh" interval 3weight -2fall 10
rise 2
}vrrp_instance VI_1 { state MASTER interface ens192 virtual_router_id 51 advert_int 2 priority 101 authentication {
auth_type PASSauth_pass 6be37dc3b2c96197d1600c58 3e10ad1f
}
virtual_ipaddress { 192.168.2.5
}
track_script { check_haproxy
}
}
上述配置文件主要需要注意兩點(diǎn),vrrp_instanceVI_1的state參數(shù)主節(jié)點(diǎn)設(shè)置為MASTER,備份節(jié)點(diǎn)設(shè)置為BACKUP,優(yōu)先級(jí)參數(shù)priority主節(jié)點(diǎn)要高于備份節(jié)點(diǎn),本文中主節(jié)點(diǎn)優(yōu)先級(jí)為101,備份節(jié)點(diǎn)優(yōu)先級(jí)為100。除了上述參數(shù)和router_id各自命名外,兩臺(tái)Keepalived節(jié)點(diǎn)其它參數(shù)的設(shè)置均一致。check_haproxy.sh是Keepalived的健康檢查腳本,主要用于檢測(cè)節(jié)點(diǎn)上HAProxy工作是否正常。
(5)啟動(dòng)Keepalived服務(wù)。
2.3 虛擬IP不能自動(dòng)漂移的故障特征
在兩臺(tái)Keepalived節(jié)點(diǎn)部署完成以后,我們進(jìn)行了四組測(cè)試,測(cè)試結(jié)果如下:
(1)停止、啟動(dòng)、重啟Keepalived服務(wù),Keepalived故障轉(zhuǎn)移成功。
(2)重啟Network服務(wù),Keepalived故障轉(zhuǎn)移成功。
(3)關(guān)閉或重啟其中一臺(tái)節(jié)點(diǎn),Keepalived故障轉(zhuǎn)移成功。
(4)通過(guò)ifdown、ifup命令關(guān)閉和打開網(wǎng)絡(luò)接口(ifdownens192和ifupens192),Keepalived故障轉(zhuǎn)移失敗。
四組測(cè)試中,前三組Keepalived均成功地進(jìn)行了故障轉(zhuǎn)移,將原Master節(jié)點(diǎn)的虛擬IP轉(zhuǎn)移至Backup節(jié)點(diǎn),但是在第四組測(cè)試中,我們相繼使用ifdown和ifup命令關(guān)閉和打開網(wǎng)絡(luò)接口,Keepalived均不能進(jìn)行故障轉(zhuǎn)移。
因?yàn)镵eepalived通過(guò)VRRP協(xié)議實(shí)現(xiàn)故障轉(zhuǎn)移,我們通過(guò)在BACKUP節(jié)點(diǎn)運(yùn)行tcpdump–iens192–nvrrp命令來(lái)查看成功進(jìn)行故障轉(zhuǎn)移時(shí)VRRP心跳包的變化。下面是運(yùn)行systemctlstopkeepalived.service命令前后tcpdump命令輸出的三條VRRP心跳包內(nèi)容:
11:51:11.137727 IP 192.168.2.6 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 101, authtype simple, intvl 2s, length 20
11:51:12.023422 IP 192.168.2.6 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 0, authtype simple, intvl 2s, length 20
11:51:12.633406 IP 192.168.2.7 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 2s, length 20
我們發(fā)現(xiàn)在Keepalived服務(wù)被停止時(shí),Master節(jié)點(diǎn)會(huì)發(fā)送一條含有信息prio0的VRRP心跳包,Backup節(jié)點(diǎn)收到該心跳包后隨即進(jìn)行故障轉(zhuǎn)移。我們又嘗試了servicenetworkrestart命令,也可以正常收到包含prio0的VRRP心跳包。但是當(dāng)我們使用ifdownens192命令關(guān)閉網(wǎng)絡(luò)接口時(shí),異常情況發(fā)生了:ens192接口被禁用后,在Backup節(jié)點(diǎn)仍然可以正常、持續(xù)收到Master節(jié)點(diǎn)發(fā)送的VRRP心跳包(prio值非0),但此時(shí)Master節(jié)點(diǎn)的IP地址已經(jīng)不可用(ens192上的兩條IP192.168.2.5、192.168.2.6均已丟失),而Master節(jié)點(diǎn)的Keepalived服務(wù)也因?yàn)楂@取不到IP信息進(jìn)入inactive(dead)狀態(tài)。由于Backup節(jié)點(diǎn)仍能持續(xù)收到Master節(jié)點(diǎn)發(fā)來(lái)的VRRP心跳包,因此Backup節(jié)點(diǎn)此時(shí)仍認(rèn)為Master節(jié)點(diǎn)工作正常,導(dǎo)致虛擬IP不能漂移至Backup節(jié)點(diǎn),故障轉(zhuǎn)移失效。
3 恢復(fù)虛擬IP自動(dòng)漂移的解決方案
經(jīng)過(guò)四組不同行為的測(cè)試,我們找到了虛擬機(jī)環(huán)境中虛擬IP不能完成自動(dòng)漂移的根源,即Master節(jié)點(diǎn)的網(wǎng)絡(luò)接口被禁用后,該節(jié)點(diǎn)仍然持續(xù)向外廣播正常的VRRP心跳包。要解決這個(gè)問題,我們首先必須找出讓Master節(jié)點(diǎn)在網(wǎng)口被禁用后停止發(fā)送VRRP心跳包的方法。經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)如果在此時(shí)重啟Keepalived服務(wù),Keepalived在幾秒鐘后會(huì)從active(running)狀態(tài)進(jìn)入inactive(dead)狀態(tài),但是在此間隙,它會(huì)向外廣播一條含有prio0的VRRP心跳包,Backup節(jié)點(diǎn)接收到該心跳包后成功獲取了Keepalived虛擬IP,故障轉(zhuǎn)移成功。
有了上面的發(fā)現(xiàn),我們就比較容易通過(guò)Shell腳本自動(dòng)化地恢復(fù)虛擬IP的漂移,完成故障轉(zhuǎn)移。其基本思路為:編寫一個(gè)周期性執(zhí)行的Shell腳本放入cron定時(shí)任務(wù),持續(xù)監(jiān)控網(wǎng)絡(luò)接口ens192的狀態(tài),如果發(fā)現(xiàn)該接口不可用,則重啟一次Keepalived服務(wù);如果該接口恢復(fù)正常,再重啟一次Keepalived服務(wù)。該腳本的主要內(nèi)容如下:
#!/bin/bash
source /root/.bashrc IP=192.168.2.6
step=2
for (( i = 0; i < 60; i=(i+step) )); do
date="`date '+%Y-%m-%d %H:%M:%S'`"
lost2=`ping -c 1 -w 1 $IP 2>&1` networkstate=`cat /etc/keepalived/
networkstate`
if [[ $lost2 == "connect: Network is
unreachable" ]]; thenif [[ $networkstate == "0" ]]; then
systemctl restart keepalived > / dev/null 2>&1
echo "1" > /etc/keepalived/ networkstate
fi
else
if [[ $networkstate == "1" ]]; then
systemctl restart keepalived > / dev/null 2>&1
echo "0" > /etc/keepalived/ networkstate
fi
fi
sleep $step done
exit 0
在該腳本按計(jì)劃(每?jī)擅雸?zhí)行一次)運(yùn)行以后,我們?cè)俅螠y(cè)試了虛擬IP的漂移行為,發(fā)現(xiàn)虛擬IP的自動(dòng)漂移恢復(fù)正常,Master節(jié)點(diǎn)與Backup節(jié)點(diǎn)間的故障轉(zhuǎn)移得到了完美解決。
4 結(jié)束語(yǔ)
很多集群采用了Keepalived的高可用方案。然而,在虛擬機(jī)集群環(huán)境中,在某些場(chǎng)景Keepalived的虛擬IP并不能正常漂移,從而導(dǎo)致了集群的高可用特性失效。本文通過(guò)研究虛擬機(jī)環(huán)境中Keepalived虛擬IP漂移異常的行為,找出了具體的解決方案,可以為高可用虛擬機(jī)集群的建設(shè)提供參考。
參考文獻(xiàn)
[1]祁偉.云計(jì)算:從基礎(chǔ)架構(gòu)到最佳時(shí)間[M].清華大學(xué)出版社,2013.
[2]王理,姜新超.云計(jì)算環(huán)境下的基礎(chǔ)架構(gòu)融合[J].信息系統(tǒng)工程,2013(11):32-35.
[3]ScottCarey.云計(jì)算2018年發(fā)展趨勢(shì):無(wú)服務(wù)器計(jì)算、Kubernetes和供應(yīng)商壟斷[N].計(jì)算機(jī)世界,2018-01-22(010).
[4]Hwang, Kai, Geoffrey C Fox, J. J Dongarra. Distributed and Cloud Computing: From Parallel Processing to the Internet of Things. Amsterdam: Morgan Kaufmann, 2012.
[5]汪海洋,凌永興,包麗紅,姚萌萌.基于keepalived的高可用性應(yīng)用研究[J].電子技術(shù),2014,43(07):21-24.