劉明錦
摘 要: 隨著虛擬化技術(shù)逐漸在數(shù)據(jù)中心環(huán)境中的普及,虛擬化系統(tǒng)的容災(zāi)成效日益成為人們關(guān)注的焦點(diǎn),而虛擬化集群的心跳算法是關(guān)系虛擬化容災(zāi)成效的關(guān)鍵技術(shù)之一。研究了一種虛擬化的心跳算法,該算法通過(guò)利用所有網(wǎng)絡(luò)節(jié)點(diǎn)有序的進(jìn)行網(wǎng)絡(luò)心跳檢測(cè),輸出一個(gè)布爾值,負(fù)責(zé)裁判進(jìn)程的Master主機(jī)根據(jù)該值判斷節(jié)點(diǎn)是否出現(xiàn)故障,可用于快速檢測(cè)出集群環(huán)境中節(jié)點(diǎn)的故障。
關(guān)鍵詞: 虛擬化; 集群; 心跳; 高可用性
中圖分類(lèi)號(hào): TN711?34 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2015)17?0110?04
Heartbeat algorithm for virtualization cluster
LIU Mingjin
(Sichuan Water Conservancy Vocational and Technical College, Chengdu 611231, China)
Abstract: As the gradual popularization of virtualization technology in data centre environment, disaster tolerance effect of the virtualization system has become the focus concerned by people increasingly, and the heartbeat algorithm of virtualization cluster is one of the key technologies to influence the disaster tolerance effect of virtualization. A heartbeat algorithm of virtualization is studied in this paper. The algorithm detects network heartbeats in order by using all network nodes, and then outputs a Boolean value. According to this value, the fault of the node is judged by the Master host which is in charge of progress judgment. It can be used to detect the fault of node in cluster environment rapidly.
Keywords: virtualization; cluster; heartbeat; high availability
0 引 言
現(xiàn)在是云計(jì)算的時(shí)代,而虛擬化是云計(jì)算的基礎(chǔ)。為了保障數(shù)據(jù)的安全性,采用虛擬化技術(shù)之后一般都需要做基于虛擬化的高可用性集群,其中心跳檢測(cè)技術(shù)是高可用性集群中非常關(guān)鍵的技術(shù),能夠在一定的時(shí)間內(nèi)準(zhǔn)確地檢測(cè)出物理服務(wù)器的可用狀態(tài)(存活或者宕機(jī))的心跳檢測(cè)技術(shù)是實(shí)現(xiàn)高可用性的前提和保障。本文提出了一種新的虛擬化的心跳優(yōu)化算法(Method of Virtualization High Availability,MVHHA),該算法通過(guò)集群內(nèi)物理主機(jī)定期發(fā)出代表可用性的[α]值,利用HA預(yù)設(shè)的失效閾值與[α]值進(jìn)行比較判斷數(shù)據(jù)中心內(nèi)節(jié)點(diǎn)的狀況,該算法可用于采用虛擬化技術(shù)的高可用集群中主機(jī)的存活檢測(cè)。
在虛擬化領(lǐng)域,常用的檢測(cè)方法是由一臺(tái)Master主機(jī)(Master由虛擬化集群建立之初由集群選定)在設(shè)定的時(shí)間內(nèi)(5 s為一個(gè)檢測(cè)周期)進(jìn)行HA內(nèi)的主機(jī)存活檢測(cè),檢測(cè)結(jié)果輸出一個(gè)Boolean value布爾值,通過(guò)該值的狀態(tài)判斷主機(jī)是否存活。通常情況下,主機(jī)存活的檢測(cè)往往在HA高可用性過(guò)程(HA高可用性過(guò)程包括主機(jī)存活檢測(cè)、失效后的主機(jī)解鎖、接管以及業(yè)務(wù)恢復(fù)等)中占用時(shí)間最長(zhǎng)。這種方法比較簡(jiǎn)單直觀,但是檢測(cè)效率較低、檢測(cè)時(shí)間過(guò)長(zhǎng),在一些對(duì)于高可用性要求較為嚴(yán)苛的環(huán)境中不利于業(yè)務(wù)的遷移。
1 算法描述
MVHHA算法主要在虛擬化集群的高可用性環(huán)境下通過(guò)心跳信號(hào)檢測(cè)主機(jī)的存活情況。該算法將檢測(cè)進(jìn)程和裁判進(jìn)程分開(kāi)。檢測(cè)進(jìn)程[pi](∑(i=1~n))在集群內(nèi)的節(jié)點(diǎn)(主機(jī))中運(yùn)行,監(jiān)控自身節(jié)點(diǎn)的運(yùn)行狀況,同時(shí)通過(guò)進(jìn)程[pi]檢測(cè)集群內(nèi)的其他節(jié)點(diǎn)狀況。進(jìn)程[pi]定期向其他節(jié)點(diǎn)上的[pi](∑(i=2~n))發(fā)送心跳檢測(cè)包,其他節(jié)點(diǎn)的檢測(cè)進(jìn)程收到該包之后,返回一個(gè)Boolean。如果在規(guī)定時(shí)間內(nèi),該進(jìn)程收到了其他所有檢測(cè)進(jìn)程返回的數(shù)據(jù)包,表示集群可用。如果沒(méi)有收到某一臺(tái)節(jié)點(diǎn)的心跳檢測(cè)包,立刻報(bào)告給負(fù)責(zé)裁判進(jìn)程的Master主機(jī),由Master主機(jī)的裁判進(jìn)程q進(jìn)行記錄,并返回記錄給報(bào)告故障的進(jìn)程[pi。]
為了避免因?yàn)榫W(wǎng)絡(luò)狀況惡化或者主機(jī)問(wèn)題出現(xiàn)的誤報(bào),檢測(cè)進(jìn)程采用單獨(dú)的網(wǎng)絡(luò)進(jìn)行信號(hào)傳輸,同時(shí),該算法要求檢測(cè)進(jìn)程[pi]在收到檢測(cè)請(qǐng)求時(shí),會(huì)比對(duì)檢測(cè)信號(hào)的[pi]進(jìn)程序號(hào),如果是進(jìn)程序號(hào)為[pi-1]的檢測(cè)進(jìn)程發(fā)出的信號(hào),那么在返回Boolean值之后,[pi]會(huì)在預(yù)設(shè)周期[Ti]內(nèi)進(jìn)行下一次的心跳檢測(cè)。
同時(shí),為了防止Master宕機(jī)引起的集群崩塌(單點(diǎn)故障),[pi](i>1)在發(fā)送報(bào)告給Master時(shí),如果在規(guī)定時(shí)間t內(nèi)沒(méi)有收到Master主機(jī)的[pi](i=1)檢測(cè)進(jìn)程的回應(yīng),將報(bào)告發(fā)送給[pi+1](i=1)即可。
該算法使用了集群內(nèi)的所有節(jié)點(diǎn)進(jìn)行多維度的檢測(cè),能夠快速檢測(cè)出集群內(nèi)的節(jié)點(diǎn)故障,便于HA高可用性節(jié)點(diǎn)上的虛擬機(jī)迅速定位和遷移。
2 算法分析
MVHHA算法可以用模型實(shí)現(xiàn),如圖1所示。
其檢測(cè)過(guò)程如下:
(1) 檢測(cè)首先由Master調(diào)用檢測(cè)進(jìn)程[pi](i=1),經(jīng)過(guò)預(yù)設(shè)的間隔時(shí)間[ΔTi]向集群內(nèi)的其他所有節(jié)點(diǎn)[p1n(i+1)]發(fā)送檢測(cè)數(shù)據(jù)包,[?i]表示檢測(cè)數(shù)據(jù)包的發(fā)送時(shí)間。
(2) 其他節(jié)點(diǎn)收到數(shù)據(jù)包之后向請(qǐng)求節(jié)點(diǎn)返回一個(gè)確認(rèn)信息的數(shù)據(jù)包,[δi]表示從數(shù)據(jù)包發(fā)出到得到請(qǐng)求所消耗的時(shí)間。
(3) 如果節(jié)點(diǎn)的檢測(cè)進(jìn)程在規(guī)定的時(shí)間[ΔTi]內(nèi)收到節(jié)點(diǎn)的回復(fù),表示該節(jié)點(diǎn)狀態(tài)正常。
(4) 如果節(jié)點(diǎn)的檢測(cè)進(jìn)程沒(méi)有在規(guī)定的時(shí)間[ΔTi]內(nèi)收到節(jié)點(diǎn)的回復(fù),表示該節(jié)點(diǎn)狀態(tài)不正常,檢測(cè)進(jìn)程啟動(dòng)報(bào)告機(jī)制,向Master進(jìn)行節(jié)點(diǎn)失效匯報(bào)。
(5) 在下一個(gè)間隔時(shí)間[ΔTi],由下一個(gè)節(jié)點(diǎn)的檢測(cè)進(jìn)程[pi+1]向集群內(nèi)的其他所有節(jié)點(diǎn)[p1ni]發(fā)送檢測(cè)數(shù)據(jù)包,[?i+1]表示檢測(cè)數(shù)據(jù)包的發(fā)送時(shí)間。
(6) 在所有節(jié)點(diǎn)的檢測(cè)都完畢之后,又重新從Master節(jié)點(diǎn)的檢測(cè)進(jìn)程開(kāi)始檢測(cè),進(jìn)行循環(huán)操作。
(7) Master在收到2個(gè)以上節(jié)點(diǎn)的失效報(bào)告時(shí),即確定該節(jié)點(diǎn)不可用,隨即啟用高可用性HA的應(yīng)急機(jī)制,進(jìn)行虛擬機(jī)的遷移,保障業(yè)務(wù)的連續(xù)性。
其心跳檢測(cè)過(guò)程總耗時(shí)為[T,]可以表示為:
[T=inΔTi,][ΔTi]為單個(gè)節(jié)點(diǎn)檢測(cè)需要的時(shí)間
由此可以看出,整個(gè)集群進(jìn)行一次心跳檢測(cè)的時(shí)間[T]的多少取決于集群中節(jié)點(diǎn)數(shù)量[n]和[ΔTi]。因此要提高整個(gè)集群的檢測(cè)效率,在不影響工作的情況下,需要計(jì)算[ΔTi]的最佳值。
這里采用[ΔTi]的算法:[ΔTi=max2×nΔTi×bM×β, 1nδin,]推演出:
[ΔTi=max2nbMβ, 1nδin]
式中:[n]表示節(jié)點(diǎn)數(shù)量;[b]表示心跳檢測(cè)包的大小;[M]表示網(wǎng)絡(luò)帶寬;[β]表示網(wǎng)絡(luò)正常運(yùn)行閾值。引入[β]是為了解決在網(wǎng)絡(luò)端,心跳檢測(cè)和返回?cái)?shù)據(jù)不會(huì)因?yàn)榫W(wǎng)絡(luò)擁塞而導(dǎo)致不能夠正確到達(dá)。
3 算法測(cè)試
根據(jù)對(duì)優(yōu)化算法的設(shè)想,結(jié)合Matlab的Simulink工具進(jìn)行了MVHHA算法的仿真,如圖2所示。
圖2 Simulink仿真模型
在圖2中可以看出,系統(tǒng)設(shè)置了3個(gè)sFuncation函數(shù)Process1,Process2和Process3。用這三個(gè)函數(shù)模擬集群環(huán)境下的節(jié)點(diǎn),通過(guò)對(duì)這三個(gè)函數(shù)設(shè)置不同的在線(xiàn)概率值,模擬節(jié)點(diǎn)的ON/OFF狀態(tài),其中對(duì)在線(xiàn)節(jié)點(diǎn)的概率設(shè)置如下:
Function [Broadcast_Master_1,Broadcast_Slave_1,Repaly_Slave_1] = Process1(Receive_replay_1,Receive_broadcast_1)
%#codegen
coder.extrinsic(′rand()′);
Probability=1; %設(shè)定在線(xiàn)概率
Message_length=32; %設(shè)定心跳檢測(cè)數(shù)據(jù)包大小為32 b
Broadcast_Master_1=zeros(Message_length,1);
%初始化對(duì)Master廣播
Broadcast_Slave_1=zeros(Message_length,1);
%初始化本機(jī)詢(xún)問(wèn)廣播
Repaly_Slave_1=zeros(Message_length,1)-1;
%初始化收到的回復(fù)
Broadcast_Slave_1=zeros(Message_length,1)+1;
%發(fā)送廣播給Slave詢(xún)問(wèn)其狀態(tài)
if(sum(Receive_broadcast_1)~=0)
%若收到來(lái)自其他主機(jī)的詢(xún)問(wèn)廣播,則發(fā)送自己的狀態(tài),在
線(xiàn)概率為Probability
if(rand()<=Probability)
Repaly_Slave_1=zeros(Message_length,1)+1;
% 若在線(xiàn),回復(fù)全1的廣播
else
Repaly_Slave_1=zeros(Message_length,1);
%否則,回復(fù)全零不在線(xiàn)
end
else
Repaly_Slave_1=zeros(Message_length,1)?1;
%未收到來(lái)自其他Slave的詢(xún)問(wèn)廣播
end
%Repaly_Slave_1 %測(cè)試數(shù)據(jù)
if(sum(Receive_replay_1)==0)
%如果收到存在宕機(jī)的Slave,報(bào)告該信息給Master
Broadcast_Master_1=zeros(Message_length,1)+1;
End
而Process2設(shè)置如下:
Function [Broadcast_Master_2,Broadcast_Slave_2,Repaly_Slave_2] = Process2(Receive_replay_2,Receive_broadcast_2)
%#codegen
coder.extrinsic(′rand()′);
Probability =0; %在線(xiàn)概率
Message_length=512; %數(shù)據(jù)包大小為512 b
Broadcast_Master_2=zeros(Message_length,1);
%初始化對(duì)Master廣播
Broadcast_Slave_2=zeros(Message_length,1);
%初始化本機(jī)詢(xún)問(wèn)廣播
Repaly_Slave_2=zeros(Message_length,1)-1;
%初始化收到的回復(fù)
Broadcast_Slave_2=zeros(Message_length,1)+1;
%發(fā)送廣播給Slave詢(xún)問(wèn)其狀態(tài)
if(sum(Receive_broadcast_2)~=0)
%若受到來(lái)自其他主機(jī)的詢(xún)問(wèn)廣播,則發(fā)送自己的狀態(tài),在
線(xiàn)概率為Probability
if(rand()<=Probability)
Repaly_Slave_2=zeros(Message_length,1)+1;
%若在線(xiàn),回復(fù)全1的廣播
else
Repaly_Slave_2=zeros(Message_length,1);
%否則,回復(fù)全零不在線(xiàn)
end
else
Repaly_Slave_2=zeros(Message_length,1)?1;
%未收到其他Slave的詢(xún)問(wèn)廣播
end
Repaly_Slave_2 %測(cè)試數(shù)據(jù)
if(sum(Receive_replay_2)==0)
%如果收到存在宕機(jī)的Slave,報(bào)告該信息給Master
Broadcast_Master_2=zeros(Message_length,1)+1;
end
由此可以看到:Process1和Process3的在線(xiàn)概率為1,在線(xiàn)概率的單位是100%,1表示這臺(tái)電腦在線(xiàn),Process2的在線(xiàn)概率為0,表示這臺(tái)電腦宕機(jī)了。
初始數(shù)據(jù)包大小為32位。
Process中的Broadcast_Slave表示對(duì)其他Slave主機(jī)的詢(xún)問(wèn)信息,在發(fā)送這個(gè)詢(xún)問(wèn)信息時(shí),進(jìn)行了時(shí)間延遲處理,對(duì)第二個(gè)和第三個(gè)Process采用了延時(shí)器對(duì)數(shù)據(jù)發(fā)送進(jìn)行延遲,參數(shù)設(shè)置如下:
Delay length:(dialog)=2
Sample time (?1 for inherited)=0.1(抽樣時(shí)間)
Broadcast_Slave發(fā)送的數(shù)據(jù)進(jìn)行了處理,主要是為了避免空值,增加了一個(gè)常數(shù)容器,值為Zero(512,1),還增加了一個(gè)電磁波發(fā)生器。這兩個(gè)容器與輸入的信號(hào)經(jīng)過(guò)一個(gè)開(kāi)關(guān)進(jìn)行處理,開(kāi)關(guān)的取樣時(shí)間也是0.1 s,如圖3所示。
Repaly_Slave表示當(dāng)收到其他Slave發(fā)送的消息時(shí)需要進(jìn)行回復(fù)?;貜?fù)給每臺(tái)主機(jī)時(shí),需要經(jīng)過(guò)Adjust進(jìn)行數(shù)據(jù)的處理,處理過(guò)程如圖4所示。
如果Slave的Broadcast_Slave發(fā)送消息之后, Receive_replay收到有宕機(jī)的事件,那么立即報(bào)告給Master。在Master端為了更加明顯地顯示Master收到的內(nèi)容和波形圖,分別用To Workspace輸出結(jié)果和scope顯示波形圖,To Workspace中的輸出結(jié)果如圖5所示。
從圖5中可以看到,在第2行和第4行時(shí)即0.2 s和0.4 s時(shí),Master分別收到了來(lái)自第一臺(tái)Slave和第3臺(tái)Slave的報(bào)告,至此,關(guān)于心跳優(yōu)化算法的虛擬仿真完成。
原來(lái)的心跳信號(hào)在5 s內(nèi)由Master主機(jī)發(fā)送1次心跳檢測(cè),也就是說(shuō)如果出現(xiàn)主機(jī)宕機(jī)情況,檢測(cè)時(shí)間至少需要5 s以上,在采用了優(yōu)化算法之后,由于采用了類(lèi)似分布式檢測(cè)的優(yōu)化算法,在[ΔTi]的間隔內(nèi)由不同的主機(jī)按照一定的序號(hào)進(jìn)行集群內(nèi)的循環(huán)心跳信號(hào)檢測(cè),如果在[ΔTi]時(shí)間之內(nèi)有主機(jī)宕機(jī),即可檢測(cè)出來(lái)。
該算法相對(duì)于原來(lái)算法有著以下優(yōu)勢(shì):
(1) 快速定位??梢栽诤芏痰臅r(shí)間內(nèi)判定主機(jī)出現(xiàn)故障,快速定位故障主機(jī)。
(2) 時(shí)間減少。原算法需要進(jìn)行檢測(cè)3次(防止誤判),每次5 s,整個(gè)過(guò)程耗時(shí)15 s。而采用集群內(nèi)其他主機(jī)一同參與檢測(cè)過(guò)程,檢測(cè)次數(shù)為2次,耗時(shí)為[2ΔTi]秒(設(shè)定[ΔTi]的時(shí)間小于1 s)。
(3) 增加檢測(cè)正確性。以往都是由Master主機(jī)進(jìn)行心跳檢測(cè),如果出現(xiàn)網(wǎng)絡(luò)掉包等故障時(shí),可能會(huì)出現(xiàn)報(bào)錯(cuò)的情況,而進(jìn)行優(yōu)化后,可以提供一個(gè)所有主機(jī)參與的檢測(cè)結(jié)果,提供了更高的正確性。
(4) 增加了集群的穩(wěn)定性。如果出現(xiàn)故障的主機(jī)是Master,那么Slave主機(jī)會(huì)馬上進(jìn)行Master主機(jī)的選舉,避免了HA過(guò)程出現(xiàn)更長(zhǎng)時(shí)間的等待,增加了集群的穩(wěn)定性。
4 結(jié) 語(yǔ)
本文提出了一種虛擬化集群的心跳算法,通過(guò)該算法對(duì)心跳檢測(cè)流程進(jìn)行改進(jìn),可以極大地減少節(jié)點(diǎn)故障的檢測(cè)時(shí)間,它克服了傳統(tǒng)心跳機(jī)制耗用時(shí)間較長(zhǎng)、效率低下的問(wèn)題,同時(shí)解決了大規(guī)模節(jié)點(diǎn)狀態(tài)下的網(wǎng)絡(luò)擁塞問(wèn)題,具有檢測(cè)效率高、準(zhǔn)確性高,具有伸縮彈性等特點(diǎn)。同時(shí),如何利用子網(wǎng)的劃分提高網(wǎng)絡(luò)心跳檢測(cè)的效率仍然是一個(gè)值得深入研究的課題。
參考文獻(xiàn)
[1] 王欣.VMware軟件虛擬化研究及應(yīng)用[J].數(shù)據(jù)通信,2012(6):30?32.
[2] 何禹,胡宇鴻,王一波.虛擬化技術(shù)在校園網(wǎng)數(shù)據(jù)中心的應(yīng)用[J].電子科技大學(xué)學(xué)報(bào),2007,36(6):1461?1464.
[3] VMware.VMware文檔[DB/OL].[2015?02?23].http://www.vmware.com/cn/support/support? resources/pubs.
[4] GULATI A. VMware distributed resource management: design, implementation, and lessons learned [EB/OL]. [2013?02?15]. http://waldspurger.org/carl/papers/drs?vmtj?mar12.pdf.
[5] 劉媛媛,高慶一,陳陽(yáng).虛擬計(jì)算環(huán)境下虛擬機(jī)資源負(fù)載均衡方法[J].2010,36(16):30?32.
[6] KATSAROS D, PALLIS G. Cloud computing [J]. IEEE Network, 2011, 25(4): 4?5.
[7] KTAMURA K, HOMMA H. Storage virtualization system and methods: US, 6857059 B2 [P]. 2007?12?13.
[8] NICOL II W B, BOKOR B R, HAGGAR P F, et al. Avatar cloning in a virtual world: US, 8584024 B2 [P]. 20013?11?12.
[9] 王德軍,王麗娜.容災(zāi)系統(tǒng)研究[J].計(jì)算機(jī)工程,2005,31(6):43?45.
[10] LOVELAND S, DOW E M, LEFEVRE F, et al. Leve?raging virtualization to optimize high?availability system configurations [J]. Journal of IBM Systems, 2008, 47(4): 591?604.
[11] NATHUJI R, SCHWAN K. Virtual power: coordinated power management in virtualized enterprise systems [C]// Procee?dings of 2007 ACM SIGOPS Symposium on Operating Systems Principles. [S.l.]: ACM, 2007: 265?278.