王錦
(安徽電子信息職業(yè)技術(shù)學(xué)院 信息與智能工程系,安徽 蚌埠 233000)
云應(yīng)用程序可以被視為由運(yùn)行互連軟件組件的一組虛擬機(jī)(虛擬機(jī))組成的分布式應(yīng)用程序。部署這些應(yīng)用程序后,可能需要進(jìn)行一些重新配置操作,例如實(shí)例化新虛擬機(jī),動(dòng)態(tài)復(fù)制其中一些以實(shí)現(xiàn)負(fù)載平衡(彈性),銷(xiāo)毀或替換虛擬機(jī)等。但是,設(shè)置、監(jiān)視和重新配置分布式應(yīng)用程序在云中是復(fù)雜的任務(wù),因?yàn)檐浖婕霸S多依賴(lài)關(guān)系,這些依賴(lài)關(guān)系要求以某種順序進(jìn)行任何更改以保持應(yīng)用程序的一致性。此外,部分任務(wù)可以以時(shí)間并行的方式執(zhí)行,以進(jìn)一步優(yōu)化性能,但是這也不能手動(dòng)實(shí)現(xiàn)。因此,需要一種健壯的算法,其在分布于多個(gè)虛擬機(jī)中運(yùn)行的應(yīng)用程序上完全自動(dòng)化重新配置任務(wù)。本文提出了一個(gè)完全自動(dòng)且可靠的算法,旨在重配置運(yùn)行時(shí)云應(yīng)用程序。
為了便于理解,從幾個(gè)實(shí)現(xiàn)細(xì)節(jié)中抽象出來(lái),例如IP地址或配置參數(shù)。所考慮的應(yīng)用程序模型由一組虛擬機(jī)組成。從功能的角度來(lái)看,每個(gè)虛擬機(jī)都托管一組組件,其中包含應(yīng)用程序的功能部分。組件有啟動(dòng)和停止兩種狀態(tài),可以提供或請(qǐng)求服務(wù)。采用符號(hào)import表示組件請(qǐng)求的服務(wù),符號(hào)export表示組件提供的服務(wù)。import可以是可選的,也可以是強(qiáng)制的。當(dāng)連接到匹配的export并且啟動(dòng)export的組件時(shí),則認(rèn)為import被滿足,這個(gè)過(guò)程也稱(chēng)為綁定。組件可以從托管在同一虛擬機(jī)上的組件import服務(wù),也可以從托管在另一個(gè)虛擬機(jī)中import服務(wù)。當(dāng)滿足所有強(qiáng)制的import時(shí),可以啟動(dòng)并運(yùn)行組件。對(duì)于可選的import,即使不完全滿足,組件也可以啟動(dòng)并運(yùn)行。
圖1web應(yīng)用程序模型
將使用典型的三層Web應(yīng)用程序作為示例,如圖1所示。虛擬機(jī)1托管了兩個(gè)組件:前端Web服務(wù)器(Nginx)[1]和分析組件。虛擬機(jī)2托管了應(yīng)用程序服務(wù)器(IIS)[2]和對(duì)象緩存組件。虛擬機(jī)3則托管了數(shù)據(jù)庫(kù)管理系統(tǒng)(SQLite)[3]。這些組件使用本地或遠(yuǎn)程綁定進(jìn)行連接。這些綁定涉及可選的import或強(qiáng)制import。
重配置算法具有四個(gè)主要的重要設(shè)計(jì)特征,即完全自動(dòng)化、去中心化、健壯和可靠。每個(gè)虛擬機(jī)都配有一個(gè)虛擬機(jī)管理器,負(fù)責(zé)自動(dòng)執(zhí)行虛擬機(jī)級(jí)別的重配置任務(wù)。所有虛擬機(jī)管理器均在無(wú)人為干預(yù)的情況下工作。云管理器發(fā)布由云用戶提供或編碼為腳本語(yǔ)言的重配置操作。因此,云管理器也不需要人與運(yùn)行的系統(tǒng)和應(yīng)用程序進(jìn)行操作。虛擬機(jī)管理器負(fù)責(zé)啟動(dòng)和停止自己的組件。該算法遵循松耦合的設(shè)計(jì)原則,這是因?yàn)槊總€(gè)虛擬機(jī)管理器都沒(méi)有應(yīng)用程序當(dāng)前狀態(tài)的全局視圖。然而,虛擬機(jī)管理器需要交換信息以便連接遠(yuǎn)程組件上的綁定或讓某些組件知道其他組件已經(jīng)啟動(dòng)或停止。交換組件啟動(dòng)/通知信息的唯一方法是通過(guò)異步消息傳遞進(jìn)行交互。每個(gè)虛擬機(jī)都配有兩個(gè)隊(duì)列緩沖區(qū),一個(gè)用于傳入消息,另一個(gè)用于傳出消息。虛擬機(jī)以點(diǎn)對(duì)點(diǎn)的方式進(jìn)行交互,以避免網(wǎng)絡(luò)通信瓶頸的出現(xiàn)。
重配置算法包括了一個(gè)云管理器和一組虛擬機(jī)管理器。云管理器通過(guò)實(shí)例化/銷(xiāo)毀虛擬機(jī)以及請(qǐng)求添加/刪除組件/綁定操作來(lái)進(jìn)行應(yīng)用程序重配置。分布式應(yīng)用程序中的每個(gè)虛擬機(jī)均配備有虛擬機(jī)管理器,該管理器在云管理器發(fā)布的虛擬機(jī)實(shí)例化/銷(xiāo)毀操作時(shí)負(fù)責(zé)連接綁定和啟動(dòng)/停止組件。參與者(即云管理器和虛擬機(jī)管理器)之間的通信通過(guò)FIFO隊(duì)列異步實(shí)現(xiàn)。當(dāng)參與者需要發(fā)布消息時(shí),它會(huì)將該消息放入其輸出隊(duì)列中。當(dāng)它想要讀取消息時(shí),它會(huì)在其輸入隊(duì)列中獲取消息。消息隨時(shí)從輸出隊(duì)列傳輸?shù)狡涫占说妮斎腙?duì)列。
云管理器向正在運(yùn)行的應(yīng)用程序提交重配置操作,并跟蹤已部署的虛擬機(jī)和組件的激活狀態(tài)??紤]重配置操作如下:虛擬機(jī)的實(shí)例化/銷(xiāo)毀、在現(xiàn)有虛擬機(jī)上添加/刪除組件以及添加/抑制綁定。為了確保算法的正確執(zhí)行,云管理器會(huì)對(duì)操作進(jìn)行驗(yàn)證。例如,在銷(xiāo)毀虛擬機(jī)前需要驗(yàn)證該虛擬機(jī)是否已經(jīng)被實(shí)例化。重配置機(jī)制由云管理器發(fā)布的一系列操作觸發(fā)。
該算法定義了“上升”和“下降”的階段操作。與上面介紹的原子重構(gòu)操作相比,階段操作具有更粗的粒度。上升階段對(duì)應(yīng)于用于啟動(dòng)的一組重配置操作(例如,虛擬實(shí)例化或綁定添加)。當(dāng)云管理器實(shí)例化虛擬機(jī)時(shí),它會(huì)創(chuàng)建該虛擬機(jī)的映像,并且虛擬機(jī)開(kāi)始自行執(zhí)行。當(dāng)云管理器向正在運(yùn)行的應(yīng)用程序添加一組必需的綁定時(shí),它會(huì)向受這些更改影響的所有虛擬機(jī)提交消息,即托管這些綁定中涉及的組件的所有虛擬機(jī)。這些消息附帶了虛擬機(jī)管理器為綁定目的所需的一些配置信息。下降階段涉及關(guān)閉的操作(例如,虛擬機(jī)銷(xiāo)毀或綁定移除)。當(dāng)云管理器決定銷(xiāo)毀虛擬機(jī)時(shí),它會(huì)向該虛擬機(jī)發(fā)送一條消息。虛擬機(jī)銷(xiāo)毀消息意味著銷(xiāo)毀該虛擬機(jī)上托管的組件上的所有綁定。云管理器還會(huì)跟蹤系統(tǒng)中運(yùn)行的所有虛擬機(jī)的當(dāng)前激活狀態(tài)(實(shí)例化的虛擬機(jī)以及它們是否已啟動(dòng))。當(dāng)虛擬機(jī)上的所有組件都啟動(dòng)時(shí),則該虛擬機(jī)已啟動(dòng)。
圖2上升和下降階段示例
上升和下降階段按順序交替,云管理器負(fù)責(zé)啟動(dòng)新階段,階段對(duì)于用戶而言是完全透明的。在開(kāi)始新階段之前,云管理器等待來(lái)自前一階段中的確認(rèn)消息(ACK)。當(dāng)云管理器收到所有ACK后,它可以啟動(dòng)新階段。
圖2顯示了云管理器如何通過(guò)應(yīng)用連續(xù)的上升和下降階段。首先實(shí)例化所有虛擬機(jī)并且添加所需的綁定(即圖1中的綁定集)。然后,決定刪除SQLite組件,并采用新版本替換它。最后,在虛擬機(jī)3上添加這個(gè)新組件,并添加一個(gè)將IIS組件連接到新SQLite組件的綁定。
當(dāng)云管理器實(shí)例化其虛擬機(jī)時(shí),虛擬機(jī)的管理器便啟動(dòng)了。虛擬機(jī)管理器負(fù)責(zé)在虛擬機(jī)中進(jìn)行綁定、解除綁定、啟動(dòng)和停止組件的操作。在本節(jié)的其余部分中,將介紹兩種最常用的重配置操作,即虛擬機(jī)的實(shí)例化和銷(xiāo)毀。
綁定和啟動(dòng)虛擬機(jī)中包含了許多組件,在實(shí)例化虛擬機(jī)時(shí),每個(gè)組件都是處于關(guān)閉轉(zhuǎn)態(tài)。圖3顯示了新實(shí)例化的虛擬機(jī)如何綁定端口和啟動(dòng)組件。在實(shí)例化之后,虛擬機(jī)管理器可以立即啟動(dòng)沒(méi)有import的組件或僅啟用可選的import。如果組件涉及強(qiáng)制import,則只有在滿足所有強(qiáng)制import時(shí)(即所有這些import均綁定到已啟動(dòng)的組件),才能啟動(dòng)該組件。啟動(dòng)組件時(shí),該組件的虛擬機(jī)管理器會(huì)向遠(yuǎn)程使用該組件的虛擬機(jī)管理器發(fā)送組件啟動(dòng)消息。如果虛擬機(jī)的所有組件都已啟動(dòng),則其虛擬機(jī)管理器會(huì)發(fā)送消息通知云管理器,否則它將開(kāi)始從其輸入隊(duì)列讀取消息。
圖3虛擬機(jī)管理器的上升階段操作
當(dāng)虛擬機(jī)從云管理器接收到綁定請(qǐng)求(包括本地和遠(yuǎn)程綁定),管理器首先建立本地綁定。在export端啟動(dòng)遠(yuǎn)程綁定:當(dāng)綁定中涉及其中一個(gè)組件的export時(shí),虛擬機(jī)管理器將export連接信息(例如,IP地址)發(fā)送到托管該組件的虛擬機(jī)(即組件的import端)。如果虛擬機(jī)收到遠(yuǎn)程綁定消息,則表示綁定中涉及其某個(gè)組件的import。收到該消息后,虛擬機(jī)管理器使綁定生效。當(dāng)收到組件啟動(dòng)消息時(shí),虛擬機(jī)管理器都會(huì)檢查是否可以啟動(dòng)相應(yīng)的組件。
解除綁定和關(guān)閉:虛擬機(jī)管理器負(fù)責(zé)在虛擬機(jī)被銷(xiāo)毀時(shí)停止一些本地組件或其所有組件。此時(shí),需要停止托管在該虛擬機(jī)上的所有組件,并且需要?jiǎng)h除這些組件的所有綁定(到import或export的連接)。如果關(guān)閉過(guò)程中涉及的組件未提供任何服務(wù)(沒(méi)有連接組件),則可以立即停止,并且可以刪除這些組件的所有綁定。否則,在強(qiáng)制import上與其連接的所有組件都已經(jīng)自行解除之前,該組件無(wú)法停止。為此,將被銷(xiāo)毀虛擬機(jī)的管理器首先將解除綁定所需的消息發(fā)送到所有托管組件的虛擬機(jī)。然后,將被銷(xiāo)毀虛擬機(jī)的管理器收集接觸綁定的確認(rèn)消息,并在強(qiáng)制import時(shí)使用該組件的所有組件已停止和未綁定時(shí)停止相應(yīng)的組件。只要組件停止,就會(huì)發(fā)送解除綁定的確認(rèn)消息。當(dāng)所有組件都停止時(shí),虛擬機(jī)被銷(xiāo)毀并通知云管理器。
在銷(xiāo)毀的過(guò)程中,其他虛擬機(jī)管理器可以從其伙伴虛擬機(jī)接收消息。收到解綁請(qǐng)求消息后,虛擬機(jī)管理器會(huì)停止并取消綁定某些組件,或者為強(qiáng)制imoprt的所有遠(yuǎn)程組件發(fā)送類(lèi)似的消息。當(dāng)虛擬機(jī)管理器停止并解除綁定組件時(shí),它可能會(huì)向云管理器發(fā)送一條消息,提示虛擬機(jī)未完全運(yùn)行。它還向以前向該組件提供服務(wù)的所有遠(yuǎn)程伙伴組件發(fā)送消息,讓他們知道該組件已停止/未綁定。
綁定在可選import上的組件只需要解除綁定,但不需要停止。本地綁定由虛擬機(jī)管理器在本地處理,但這些更改可能會(huì)影響其他遠(yuǎn)程組件,在這種情況下,可能會(huì)發(fā)出其他未綁定的必需消息。組件關(guān)閉意味著非綁定所需消息的向后傳播,并且當(dāng)?shù)谝淮蝹鞑ソY(jié)束時(shí)(在沒(méi)有導(dǎo)出或僅具有可選導(dǎo)入的組件上),解綁確認(rèn)消息的第二次向前傳播開(kāi)始讓組件知道斷開(kāi)已實(shí)際實(shí)現(xiàn)。這些傳播終止是因?yàn)闆](méi)有強(qiáng)制導(dǎo)入的綁定循環(huán)。
由于人為錯(cuò)誤或客戶需求激增導(dǎo)致的安全漏洞,許多不同類(lèi)型的基礎(chǔ)架構(gòu)故障可能會(huì)影響云應(yīng)用程序的正常運(yùn)行。重配置操作可能由于許多不同原因(從硬件故障到憑證故障)而失敗。本文主要研究由虛擬機(jī)故障導(dǎo)致的失敗。
假設(shè)虛擬機(jī)在任何時(shí)候都可能出現(xiàn)故障,而云管理器能檢測(cè)到這樣的故障。當(dāng)檢測(cè)到故障時(shí),云管理器首先通過(guò)刪除故障虛擬機(jī)來(lái)更新活動(dòng)系統(tǒng)的模型。然后云管理器清除緩沖區(qū),刪除來(lái)自或發(fā)送到故障虛擬機(jī)的所有消息。最后,云管理器警告受影響的虛擬機(jī)(連接到故障虛擬機(jī))發(fā)送故障警報(bào)消息。
在接收到報(bào)告鄰居虛擬機(jī)故障的故障警報(bào)消息后,虛擬機(jī)管理器清除緩沖區(qū),并通過(guò)解除綁定和停止受影響的組件來(lái)更改其本地組件的當(dāng)前狀態(tài)。最后,關(guān)閉組件消息發(fā)送到包含連接到其關(guān)閉組件的虛擬機(jī)的所有虛擬機(jī)管理器。
當(dāng)虛擬機(jī)管理器收到導(dǎo)致故障傳播的關(guān)閉組件消息時(shí),它會(huì)停止受影響的本地組件并向本地和遠(yuǎn)程發(fā)送該關(guān)閉消息。值得注意的是,可能發(fā)生多個(gè)虛擬機(jī)故障。當(dāng)虛擬機(jī)已經(jīng)處理涉及另一個(gè)虛擬機(jī)的故障(級(jí)聯(lián)故障)時(shí),也可能發(fā)生故障。在最壞的情況下,所有組件都會(huì)停止。
在本節(jié)中展示了算法如何在圖1所示的Web應(yīng)用程序的簡(jiǎn)單重新配置方案中工作。假設(shè)所有虛擬機(jī)上的所有組件都已啟動(dòng)。提供了新版本的SQLite數(shù)據(jù)庫(kù)管理系統(tǒng),決定將該組件升級(jí)到這個(gè)新版本。
在接收到移除組件消息時(shí),虛擬機(jī)3向虛擬機(jī)2發(fā)送解除綁定所需的消息,請(qǐng)求從SQLite組件解除綁定IIS組件。當(dāng)虛擬機(jī)2收到此消息時(shí),它無(wú)法立即取消綁定,因?yàn)檫h(yuǎn)程組件(Nginx)使用了IIS,因此它也向虛擬機(jī)1發(fā)送了一個(gè)解除綁定的必需消息。收到該消息后,虛擬機(jī)1管理器將停止Nginx組件,因?yàn)闆](méi)有其他組件連接到該組件,然后從IIS組件中取消綁定Nginx組件。虛擬機(jī)1向虛擬機(jī)2發(fā)送確認(rèn)消息,指示已實(shí)現(xiàn)斷開(kāi)連接。虛擬機(jī)1還向云管理器發(fā)送虛擬機(jī)停止消息,指示其組件不再啟動(dòng)。當(dāng)虛擬機(jī)2收到解除綁定確認(rèn)消息時(shí),其管理器將停止IIS并將其與SQLite解除綁定。從虛擬機(jī)2向虛擬機(jī)3發(fā)送確認(rèn),并將虛擬機(jī)停止消息發(fā)送到云管理器。一旦虛擬機(jī)3收到確認(rèn)消息,其管理器就會(huì)停止SQLite組件,并向云管理器發(fā)送一條確認(rèn)消息,指示虛擬機(jī)也已停止。請(qǐng)注意,需要停止IIS和Nginx以保留體系結(jié)構(gòu)不變量:已啟動(dòng)的組件無(wú)法連接到停止組件。
在刪除SQLite之后,應(yīng)用程序的組件Nginx和IIS處于關(guān)閉狀態(tài),但其分析組件和對(duì)象緩存是處于打開(kāi)的狀態(tài)。
現(xiàn)在考慮這樣一個(gè)場(chǎng)景:云管理器在虛擬機(jī)3上添加新版本的SQLite組件(添加消息)以及添加新版本與IIS組件之間的綁定。虛擬機(jī)3可以立即啟動(dòng)SQLite組件,因?yàn)樵摻M件不需要來(lái)自其他組件的任何服務(wù)(無(wú)import)。虛擬機(jī)3知道虛擬機(jī)2需要將其組件連接到SQLite的組件,因此虛擬機(jī)3管理器將帶有連接信息的發(fā)送export消息發(fā)布到虛擬機(jī)2。收到后,虛擬機(jī)2管理器可以連接兩個(gè)組件。虛擬機(jī)3管理器還向虛擬機(jī)2指示其SQLite組件已啟動(dòng),并向虛擬機(jī)指示虛擬機(jī)3已啟動(dòng)。收到發(fā)送導(dǎo)出消息后,虛擬機(jī)2管理器將啟動(dòng)IIS組件。虛擬機(jī)2向虛擬機(jī)1發(fā)送export消息和已啟動(dòng)消息,因?yàn)樘摂M機(jī)2管理器知道Nginx組件與IIS組件之間的依賴(lài)關(guān)系。同時(shí)云管理器會(huì)接收到虛擬機(jī)2的啟動(dòng)消息。虛擬機(jī)1管理器最終將Nginx綁定到IIS,啟動(dòng)Nginx組件,并通知云管理器虛擬機(jī)1也已啟動(dòng)。因此,系統(tǒng)恢復(fù)運(yùn)行,所有組件再次處于活動(dòng)狀態(tài)。
假設(shè)虛擬機(jī)3發(fā)生故障,首先,云管理器檢測(cè)到此故障,更新應(yīng)用程序的當(dāng)前模型,清除其緩沖區(qū),并向虛擬機(jī)2發(fā)送故障警報(bào)消息。收到此消息后,虛擬機(jī)2管理器將清除其緩沖區(qū)并通過(guò)停止和取消綁定IIS組件來(lái)恢復(fù)其本地一致性。然后,它向虛擬機(jī)1發(fā)送關(guān)閉組件消息。收到此消息后,虛擬機(jī)1管理器將停止并取消綁定Nginx組件。兩個(gè)虛擬機(jī)管理器還向云管理器發(fā)送消息,以讓它知道它們不再啟動(dòng)。
選擇Maude[4]來(lái)實(shí)現(xiàn)本研究的重配置算法,由于篇幅所限,此處便不展示具體的實(shí)現(xiàn)過(guò)程。使用Maude的線性時(shí)序邏輯(LTL)顯式狀態(tài)模型檢查器(Eker等,2002)來(lái)分析給定應(yīng)用程序模型和重配置方案。Maude的模型檢查器允許我們檢查從給定初始模型開(kāi)始的每個(gè)可能行為是否滿足給定的LTL屬性。當(dāng)初始狀態(tài)的可到達(dá)狀態(tài)集是有限時(shí),它可用于檢查重寫(xiě)系統(tǒng)的安全性和活躍性。無(wú)限狀態(tài)系統(tǒng)中不變量的完全驗(yàn)證可以通過(guò)在原始無(wú)限狀態(tài)系統(tǒng)的有限狀態(tài)抽象(Meseguer等,2003)上驗(yàn)證它們,也就是說(shuō),在可達(dá)狀態(tài)是有限的原始系統(tǒng)商值(system's quotient)上進(jìn)行驗(yàn)證。定義了算法需要保持的屬性,如表1所示。
表1 屬性定義
在300個(gè)示例上驗(yàn)證重配置算法,示例是由具有不同大小和連接結(jié)構(gòu)的典型多層Web應(yīng)用程序組成的。由于篇幅所限,此處僅展示2個(gè)示例的實(shí)驗(yàn)結(jié)果,這兩個(gè)示例詳情如表2所示。表3顯示了驗(yàn)證屬性R1-R7的實(shí)驗(yàn)結(jié)果。對(duì)于每個(gè)應(yīng)用程序模型,給出了這個(gè)7屬性的驗(yàn)證時(shí)間。在單個(gè)執(zhí)行路徑之后,模擬時(shí)間在所有情況下都不到5毫秒。狀態(tài)空間的大小取決于應(yīng)用程序的大小及其復(fù)雜性。應(yīng)用程序模型的大小由其虛擬機(jī)的數(shù)量、組件、組件數(shù)量、每個(gè)虛擬機(jī)中的本地綁定和遠(yuǎn)程綁定的數(shù)量。組件由三元組(A-B-C)表示,其中A、B和C分別是強(qiáng)制import,可選import和export的數(shù)量。
表2 應(yīng)用程式模型詳情
表3 實(shí)驗(yàn)結(jié)果
表格中沒(méi)有顯示應(yīng)用程序的復(fù)雜性,理解為強(qiáng)制/可選進(jìn)口和出口之間的綁定是多么復(fù)雜,盡管它在數(shù)字中清楚地反映出來(lái)。兩個(gè)模型示例的大小非常相似,但它們的綁定非常不同。不同場(chǎng)景中的上升/下降的復(fù)雜性可能非常不同。例如,特定虛擬機(jī)的銷(xiāo)毀可以通過(guò)傳播引起許多(關(guān)閉)操作,而另一個(gè)虛擬機(jī)(例如,托管組件而沒(méi)有任何導(dǎo)出的虛擬機(jī))的銷(xiāo)毀將不會(huì)產(chǎn)生任何附加操作。
提出了一種用于自動(dòng)重配置云應(yīng)用程序的算法,該算法不僅支持虛擬機(jī)實(shí)例化和組件啟動(dòng),還支持虛擬機(jī)銷(xiāo)毀和組件關(guān)閉。該算法具有可靠性,它檢測(cè)虛擬機(jī)故障并使應(yīng)用程序恢復(fù)全局一致?tīng)顟B(tài)。使用Maude的基于重寫(xiě)邏輯的語(yǔ)言實(shí)現(xiàn)了它,并使用Maude的統(tǒng)計(jì)模型檢查器來(lái)分析算法。