王錦
(安徽電子信息職業技術學院 信息與智能工程系,安徽 蚌埠 233000)
云應用程序可以被視為由運行互連軟件組件的一組虛擬機(虛擬機)組成的分布式應用程序。部署這些應用程序后,可能需要進行一些重新配置操作,例如實例化新虛擬機,動態復制其中一些以實現負載平衡(彈性),銷毀或替換虛擬機等。但是,設置、監視和重新配置分布式應用程序在云中是復雜的任務,因為軟件涉及許多依賴關系,這些依賴關系要求以某種順序進行任何更改以保持應用程序的一致性。此外,部分任務可以以時間并行的方式執行,以進一步優化性能,但是這也不能手動實現。因此,需要一種健壯的算法,其在分布于多個虛擬機中運行的應用程序上完全自動化重新配置任務。本文提出了一個完全自動且可靠的算法,旨在重配置運行時云應用程序。
為了便于理解,從幾個實現細節中抽象出來,例如IP地址或配置參數。所考慮的應用程序模型由一組虛擬機組成。從功能的角度來看,每個虛擬機都托管一組組件,其中包含應用程序的功能部分。組件有啟動和停止兩種狀態,可以提供或請求服務。采用符號import表示組件請求的服務,符號export表示組件提供的服務。import可以是可選的,也可以是強制的。當連接到匹配的export并且啟動export的組件時,則認為import被滿足,這個過程也稱為綁定。組件可以從托管在同一虛擬機上的組件import服務,也可以從托管在另一個虛擬機中import服務。當滿足所有強制的import時,可以啟動并運行組件。對于可選的import,即使不完全滿足,組件也可以啟動并運行。

圖1web應用程序模型
將使用典型的三層Web應用程序作為示例,如圖1所示。虛擬機1托管了兩個組件:前端Web服務器(Nginx)[1]和分析組件。虛擬機2托管了應用程序服務器(IIS)[2]和對象緩存組件。虛擬機3則托管了數據庫管理系統(SQLite)[3]。這些組件使用本地或遠程綁定進行連接。這些綁定涉及可選的import或強制import。
重配置算法具有四個主要的重要設計特征,即完全自動化、去中心化、健壯和可靠。每個虛擬機都配有一個虛擬機管理器,負責自動執行虛擬機級別的重配置任務。所有虛擬機管理器均在無人為干預的情況下工作。云管理器發布由云用戶提供或編碼為腳本語言的重配置操作。因此,云管理器也不需要人與運行的系統和應用程序進行操作。虛擬機管理器負責啟動和停止自己的組件。該算法遵循松耦合的設計原則,這是因為每個虛擬機管理器都沒有應用程序當前狀態的全局視圖。然而,虛擬機管理器需要交換信息以便連接遠程組件上的綁定或讓某些組件知道其他組件已經啟動或停止。交換組件啟動/通知信息的唯一方法是通過異步消息傳遞進行交互。每個虛擬機都配有兩個隊列緩沖區,一個用于傳入消息,另一個用于傳出消息。虛擬機以點對點的方式進行交互,以避免網絡通信瓶頸的出現。
重配置算法包括了一個云管理器和一組虛擬機管理器。云管理器通過實例化/銷毀虛擬機以及請求添加/刪除組件/綁定操作來進行應用程序重配置。分布式應用程序中的每個虛擬機均配備有虛擬機管理器,該管理器在云管理器發布的虛擬機實例化/銷毀操作時負責連接綁定和啟動/停止組件。參與者(即云管理器和虛擬機管理器)之間的通信通過FIFO隊列異步實現。當參與者需要發布消息時,它會將該消息放入其輸出隊列中。當它想要讀取消息時,它會在其輸入隊列中獲取消息。消息隨時從輸出隊列傳輸到其收件人的輸入隊列。
云管理器向正在運行的應用程序提交重配置操作,并跟蹤已部署的虛擬機和組件的激活狀態。考慮重配置操作如下:虛擬機的實例化/銷毀、在現有虛擬機上添加/刪除組件以及添加/抑制綁定。為了確保算法的正確執行,云管理器會對操作進行驗證。例如,在銷毀虛擬機前需要驗證該虛擬機是否已經被實例化。重配置機制由云管理器發布的一系列操作觸發。
該算法定義了“上升”和“下降”的階段操作。與上面介紹的原子重構操作相比,階段操作具有更粗的粒度。上升階段對應于用于啟動的一組重配置操作(例如,虛擬實例化或綁定添加)。當云管理器實例化虛擬機時,它會創建該虛擬機的映像,并且虛擬機開始自行執行。當云管理器向正在運行的應用程序添加一組必需的綁定時,它會向受這些更改影響的所有虛擬機提交消息,即托管這些綁定中涉及的組件的所有虛擬機。這些消息附帶了虛擬機管理器為綁定目的所需的一些配置信息。下降階段涉及關閉的操作(例如,虛擬機銷毀或綁定移除)。當云管理器決定銷毀虛擬機時,它會向該虛擬機發送一條消息。虛擬機銷毀消息意味著銷毀該虛擬機上托管的組件上的所有綁定。云管理器還會跟蹤系統中運行的所有虛擬機的當前激活狀態(實例化的虛擬機以及它們是否已啟動)。當虛擬機上的所有組件都啟動時,則該虛擬機已啟動。

圖2上升和下降階段示例
上升和下降階段按順序交替,云管理器負責啟動新階段,階段對于用戶而言是完全透明的。在開始新階段之前,云管理器等待來自前一階段中的確認消息(ACK)。當云管理器收到所有ACK后,它可以啟動新階段。
圖2顯示了云管理器如何通過應用連續的上升和下降階段。首先實例化所有虛擬機并且添加所需的綁定(即圖1中的綁定集)。然后,決定刪除SQLite組件,并采用新版本替換它。最后,在虛擬機3上添加這個新組件,并添加一個將IIS組件連接到新SQLite組件的綁定。
當云管理器實例化其虛擬機時,虛擬機的管理器便啟動了。虛擬機管理器負責在虛擬機中進行綁定、解除綁定、啟動和停止組件的操作。在本節的其余部分中,將介紹兩種最常用的重配置操作,即虛擬機的實例化和銷毀。
綁定和啟動虛擬機中包含了許多組件,在實例化虛擬機時,每個組件都是處于關閉轉態。圖3顯示了新實例化的虛擬機如何綁定端口和啟動組件。在實例化之后,虛擬機管理器可以立即啟動沒有import的組件或僅啟用可選的import。如果組件涉及強制import,則只有在滿足所有強制import時(即所有這些import均綁定到已啟動的組件),才能啟動該組件。啟動組件時,該組件的虛擬機管理器會向遠程使用該組件的虛擬機管理器發送組件啟動消息。如果虛擬機的所有組件都已啟動,則其虛擬機管理器會發送消息通知云管理器,否則它將開始從其輸入隊列讀取消息。

圖3虛擬機管理器的上升階段操作
當虛擬機從云管理器接收到綁定請求(包括本地和遠程綁定),管理器首先建立本地綁定。在export端啟動遠程綁定:當綁定中涉及其中一個組件的export時,虛擬機管理器將export連接信息(例如,IP地址)發送到托管該組件的虛擬機(即組件的import端)。如果虛擬機收到遠程綁定消息,則表示綁定中涉及其某個組件的import。收到該消息后,虛擬機管理器使綁定生效。當收到組件啟動消息時,虛擬機管理器都會檢查是否可以啟動相應的組件。
解除綁定和關閉:虛擬機管理器負責在虛擬機被銷毀時停止一些本地組件或其所有組件。此時,需要停止托管在該虛擬機上的所有組件,并且需要刪除這些組件的所有綁定(到import或export的連接)。如果關閉過程中涉及的組件未提供任何服務(沒有連接組件),則可以立即停止,并且可以刪除這些組件的所有綁定。否則,在強制import上與其連接的所有組件都已經自行解除之前,該組件無法停止。為此,將被銷毀虛擬機的管理器首先將解除綁定所需的消息發送到所有托管組件的虛擬機。然后,將被銷毀虛擬機的管理器收集接觸綁定的確認消息,并在強制import時使用該組件的所有組件已停止和未綁定時停止相應的組件。只要組件停止,就會發送解除綁定的確認消息。當所有組件都停止時,虛擬機被銷毀并通知云管理器。
在銷毀的過程中,其他虛擬機管理器可以從其伙伴虛擬機接收消息。收到解綁請求消息后,虛擬機管理器會停止并取消綁定某些組件,或者為強制imoprt的所有遠程組件發送類似的消息。當虛擬機管理器停止并解除綁定組件時,它可能會向云管理器發送一條消息,提示虛擬機未完全運行。它還向以前向該組件提供服務的所有遠程伙伴組件發送消息,讓他們知道該組件已停止/未綁定。
綁定在可選import上的組件只需要解除綁定,但不需要停止。本地綁定由虛擬機管理器在本地處理,但這些更改可能會影響其他遠程組件,在這種情況下,可能會發出其他未綁定的必需消息。組件關閉意味著非綁定所需消息的向后傳播,并且當第一次傳播結束時(在沒有導出或僅具有可選導入的組件上),解綁確認消息的第二次向前傳播開始讓組件知道斷開已實際實現。這些傳播終止是因為沒有強制導入的綁定循環。
由于人為錯誤或客戶需求激增導致的安全漏洞,許多不同類型的基礎架構故障可能會影響云應用程序的正常運行。重配置操作可能由于許多不同原因(從硬件故障到憑證故障)而失敗。本文主要研究由虛擬機故障導致的失敗。
假設虛擬機在任何時候都可能出現故障,而云管理器能檢測到這樣的故障。當檢測到故障時,云管理器首先通過刪除故障虛擬機來更新活動系統的模型。然后云管理器清除緩沖區,刪除來自或發送到故障虛擬機的所有消息。最后,云管理器警告受影響的虛擬機(連接到故障虛擬機)發送故障警報消息。
在接收到報告鄰居虛擬機故障的故障警報消息后,虛擬機管理器清除緩沖區,并通過解除綁定和停止受影響的組件來更改其本地組件的當前狀態。最后,關閉組件消息發送到包含連接到其關閉組件的虛擬機的所有虛擬機管理器。
當虛擬機管理器收到導致故障傳播的關閉組件消息時,它會停止受影響的本地組件并向本地和遠程發送該關閉消息。值得注意的是,可能發生多個虛擬機故障。當虛擬機已經處理涉及另一個虛擬機的故障(級聯故障)時,也可能發生故障。在最壞的情況下,所有組件都會停止。
在本節中展示了算法如何在圖1所示的Web應用程序的簡單重新配置方案中工作。假設所有虛擬機上的所有組件都已啟動。提供了新版本的SQLite數據庫管理系統,決定將該組件升級到這個新版本。
在接收到移除組件消息時,虛擬機3向虛擬機2發送解除綁定所需的消息,請求從SQLite組件解除綁定IIS組件。當虛擬機2收到此消息時,它無法立即取消綁定,因為遠程組件(Nginx)使用了IIS,因此它也向虛擬機1發送了一個解除綁定的必需消息。收到該消息后,虛擬機1管理器將停止Nginx組件,因為沒有其他組件連接到該組件,然后從IIS組件中取消綁定Nginx組件。虛擬機1向虛擬機2發送確認消息,指示已實現斷開連接。虛擬機1還向云管理器發送虛擬機停止消息,指示其組件不再啟動。當虛擬機2收到解除綁定確認消息時,其管理器將停止IIS并將其與SQLite解除綁定。從虛擬機2向虛擬機3發送確認,并將虛擬機停止消息發送到云管理器。一旦虛擬機3收到確認消息,其管理器就會停止SQLite組件,并向云管理器發送一條確認消息,指示虛擬機也已停止。請注意,需要停止IIS和Nginx以保留體系結構不變量:已啟動的組件無法連接到停止組件。
在刪除SQLite之后,應用程序的組件Nginx和IIS處于關閉狀態,但其分析組件和對象緩存是處于打開的狀態。
現在考慮這樣一個場景:云管理器在虛擬機3上添加新版本的SQLite組件(添加消息)以及添加新版本與IIS組件之間的綁定。虛擬機3可以立即啟動SQLite組件,因為該組件不需要來自其他組件的任何服務(無import)。虛擬機3知道虛擬機2需要將其組件連接到SQLite的組件,因此虛擬機3管理器將帶有連接信息的發送export消息發布到虛擬機2。收到后,虛擬機2管理器可以連接兩個組件。虛擬機3管理器還向虛擬機2指示其SQLite組件已啟動,并向虛擬機指示虛擬機3已啟動。收到發送導出消息后,虛擬機2管理器將啟動IIS組件。虛擬機2向虛擬機1發送export消息和已啟動消息,因為虛擬機2管理器知道Nginx組件與IIS組件之間的依賴關系。同時云管理器會接收到虛擬機2的啟動消息。虛擬機1管理器最終將Nginx綁定到IIS,啟動Nginx組件,并通知云管理器虛擬機1也已啟動。因此,系統恢復運行,所有組件再次處于活動狀態。
假設虛擬機3發生故障,首先,云管理器檢測到此故障,更新應用程序的當前模型,清除其緩沖區,并向虛擬機2發送故障警報消息。收到此消息后,虛擬機2管理器將清除其緩沖區并通過停止和取消綁定IIS組件來恢復其本地一致性。然后,它向虛擬機1發送關閉組件消息。收到此消息后,虛擬機1管理器將停止并取消綁定Nginx組件。兩個虛擬機管理器還向云管理器發送消息,以讓它知道它們不再啟動。
選擇Maude[4]來實現本研究的重配置算法,由于篇幅所限,此處便不展示具體的實現過程。使用Maude的線性時序邏輯(LTL)顯式狀態模型檢查器(Eker等,2002)來分析給定應用程序模型和重配置方案。Maude的模型檢查器允許我們檢查從給定初始模型開始的每個可能行為是否滿足給定的LTL屬性。當初始狀態的可到達狀態集是有限時,它可用于檢查重寫系統的安全性和活躍性。無限狀態系統中不變量的完全驗證可以通過在原始無限狀態系統的有限狀態抽象(Meseguer等,2003)上驗證它們,也就是說,在可達狀態是有限的原始系統商值(system's quotient)上進行驗證。定義了算法需要保持的屬性,如表1所示。

表1 屬性定義
在300個示例上驗證重配置算法,示例是由具有不同大小和連接結構的典型多層Web應用程序組成的。由于篇幅所限,此處僅展示2個示例的實驗結果,這兩個示例詳情如表2所示。表3顯示了驗證屬性R1-R7的實驗結果。對于每個應用程序模型,給出了這個7屬性的驗證時間。在單個執行路徑之后,模擬時間在所有情況下都不到5毫秒。狀態空間的大小取決于應用程序的大小及其復雜性。應用程序模型的大小由其虛擬機的數量、組件、組件數量、每個虛擬機中的本地綁定和遠程綁定的數量。組件由三元組(A-B-C)表示,其中A、B和C分別是強制import,可選import和export的數量。

表2 應用程式模型詳情

表3 實驗結果
表格中沒有顯示應用程序的復雜性,理解為強制/可選進口和出口之間的綁定是多么復雜,盡管它在數字中清楚地反映出來。兩個模型示例的大小非常相似,但它們的綁定非常不同。不同場景中的上升/下降的復雜性可能非常不同。例如,特定虛擬機的銷毀可以通過傳播引起許多(關閉)操作,而另一個虛擬機(例如,托管組件而沒有任何導出的虛擬機)的銷毀將不會產生任何附加操作。
提出了一種用于自動重配置云應用程序的算法,該算法不僅支持虛擬機實例化和組件啟動,還支持虛擬機銷毀和組件關閉。該算法具有可靠性,它檢測虛擬機故障并使應用程序恢復全局一致狀態。使用Maude的基于重寫邏輯的語言實現了它,并使用Maude的統計模型檢查器來分析算法。