劉錢超,吳 利,鄭禮輝
(江南計算技術(shù)研究所,江蘇 無錫 214083)
隨著大數(shù)據(jù)、云計算等軟件技術(shù)的飛速發(fā)展,基于虛擬機(jī)集群的分布式軟件運(yùn)行環(huán)境構(gòu)建方式資源開銷大、耗時長、可伸縮性差等缺點(diǎn)逐漸顯露,降低了軟件運(yùn)行效率,增加了運(yùn)維成本,而具有高可伸縮性和高資源使用率等優(yōu)勢的容器云環(huán)境為上述問題提供了優(yōu)化方案[1-2]。
容器云是以容器為資源分割和調(diào)度的基本單位,封裝整個軟件運(yùn)行時環(huán)境,為開發(fā)者和系統(tǒng)管理者提供用于構(gòu)建、發(fā)布和運(yùn)行分布式應(yīng)用的平臺[3]?;谌萜髟茦?gòu)建軟件運(yùn)行環(huán)境,與基于虛擬機(jī)集群方式相比,具有簡化軟件部署方式、優(yōu)化管理運(yùn)維模式和降低運(yùn)維成本等優(yōu)勢。然而,容器云作為一種全新的云環(huán)境解決方案,在集群動態(tài)伸縮策略方面仍存在不足。集群的動態(tài)伸縮[4-6]是指集群能夠根據(jù)工作負(fù)載的變化動態(tài)地調(diào)整自身規(guī)模,從而調(diào)整其對外服務(wù)的能力。目前,容器云采用的是基于閾值的響應(yīng)式伸縮策略,該策略只會對系統(tǒng)資源的實時情況進(jìn)行響應(yīng),因而系統(tǒng)的伸縮調(diào)整往往會晚于工作負(fù)載的變化,導(dǎo)致服務(wù)質(zhì)量不佳,用戶體驗較差。
目前,已有很多關(guān)于云環(huán)境下集群動態(tài)伸縮策略的改進(jìn)研究。文獻(xiàn)[7]提出一種基于工作流模型的虛擬機(jī)動態(tài)分配和回收策略,能夠較大程度地提高系統(tǒng)資源利用率,但該策略不能對集群未來工作負(fù)載進(jìn)行預(yù)測。文獻(xiàn)[8]針對基于虛擬機(jī)的資源管理難以實現(xiàn)細(xì)粒度的資源動態(tài)調(diào)整與混合云中跨平臺服務(wù)快速遷移的問題,提出一種基于容器技術(shù)的云計算資源自適應(yīng)管理方法,能夠提高集群自適應(yīng)響應(yīng)速度和集群整體性能,但該方法也不能對集群未來工作負(fù)載進(jìn)行預(yù)測。文獻(xiàn)[9]提出一種基于集群負(fù)載預(yù)測的虛擬機(jī)資源管理框架,能夠?qū)崿F(xiàn)對未來工作負(fù)載預(yù)測并及時做出伸縮響應(yīng),保證服務(wù)質(zhì)量,但該框架底層是基于虛擬機(jī)資源實現(xiàn),由于虛擬機(jī)啟停耗時長,集群伸縮響應(yīng)速度仍然較慢。
針對文獻(xiàn)[7-8]不能對未來工作負(fù)載進(jìn)行預(yù)測和文獻(xiàn)[9]中基于虛擬機(jī)資源響應(yīng)速度慢的不足,提出一種基于二次移動平均法的預(yù)測式容器云伸縮方法。該方法可以對未來工作負(fù)載進(jìn)行預(yù)測并依托容器輕量特點(diǎn)快速做出伸縮響應(yīng),從而降低服務(wù)響應(yīng)時間的波動幅度,提高服務(wù)的質(zhì)量和穩(wěn)定性。
集群動態(tài)伸縮技術(shù)包括響應(yīng)式伸縮[10]和預(yù)測式伸縮[11]兩種。
(1)響應(yīng)式伸縮。
基于閾值的響應(yīng)式伸縮策略因算法實現(xiàn)簡單,對集群突發(fā)式負(fù)載具有較好效果,目前被廣泛應(yīng)用于云平臺伸縮決策中。響應(yīng)式伸縮策略需要對響應(yīng)規(guī)則和閾值進(jìn)行設(shè)定。算法運(yùn)行時,會對系統(tǒng)內(nèi)資源(CPU、網(wǎng)絡(luò)、存儲、內(nèi)存等)進(jìn)行監(jiān)控,一旦監(jiān)測到某些指標(biāo)超過既定閾值,集群會發(fā)出相應(yīng)的擴(kuò)展或收縮命令。具體來說,如圖1(a)所示,t1時刻通過對系統(tǒng)資源進(jìn)行持續(xù)監(jiān)控,當(dāng)t2時刻監(jiān)測到系統(tǒng)資源有較大變化且超過閾值(包括上下限閾值)時,開始進(jìn)行集群伸縮,t5時刻完成伸縮?;陂撝档捻憫?yīng)式伸縮策略存在的不足是無法對未來負(fù)載進(jìn)行預(yù)測,只能對系統(tǒng)資源的實時情況進(jìn)行響應(yīng),因而系統(tǒng)的伸縮調(diào)整往往會晚于工作負(fù)載的變化,導(dǎo)致服務(wù)質(zhì)量不佳,用戶體驗變差。
(2)預(yù)測式伸縮。
預(yù)測式伸縮策略是對過去一段時間內(nèi)系統(tǒng)資源使用情況進(jìn)行分析,然后利用數(shù)學(xué)方法進(jìn)行建模并完成對未來時刻的預(yù)測。它能夠較好克服響應(yīng)式伸縮策略存在時間滯后性的缺點(diǎn)。具體來說,如圖1(b)所示,當(dāng)t1時刻根據(jù)歷史數(shù)據(jù)特點(diǎn)預(yù)測到t6時刻系統(tǒng)資源使用發(fā)生較大改變且超過所設(shè)置的閾值時,系統(tǒng)會在t2時刻發(fā)出伸縮命令,因而系統(tǒng)能在t6時刻負(fù)載發(fā)生大幅變化之前有充足時間完成伸縮操作,從而能夠及時響應(yīng)系統(tǒng)資源變化。
圖1 兩種伸縮方式
根據(jù)上述對兩種伸縮策略的分析,文中結(jié)合使用預(yù)測式伸縮策略與響應(yīng)式伸縮策略,在對集群突發(fā)式負(fù)載具有良好響應(yīng)效果的同時,也可以實現(xiàn)對未來時刻負(fù)載值的預(yù)測,克服響應(yīng)式伸縮策略存在時間滯后性的不足,從而提高集群資源響應(yīng)速度,更好地保障應(yīng)用服務(wù)的質(zhì)量和穩(wěn)定性。
預(yù)測式伸縮策略常采用的分析方法主要有時間序列分析和機(jī)器學(xué)習(xí)[12],但機(jī)器學(xué)習(xí)需要較長模型訓(xùn)練時間,適用性不強(qiáng)。
二次移動平均法(又名二重移動平均法)是一種時間序列分析方法,它是在預(yù)測目標(biāo)時間序列上的一次移動平均值的基礎(chǔ)上再進(jìn)行一次移動平均,并將結(jié)果代入到相關(guān)公式中得到預(yù)測值,目的是解決一次移動平均法存在滯后偏差,使得預(yù)測值總是落后于實際觀測值的問題。它適用于數(shù)據(jù)隨某個變量呈現(xiàn)自相關(guān)特性的場景,考慮到容器云中應(yīng)用的資源使用情況可能隨時間呈現(xiàn)一定規(guī)律,因此文中選取二次移動平均法對未來時刻負(fù)載值進(jìn)行預(yù)測。其數(shù)學(xué)計算公式如下:
假設(shè)xt,xt-1,…,xt-n+1為系統(tǒng)在時刻t的歷史數(shù)據(jù)序列,因此t時刻數(shù)據(jù)序列的一次移動平均值為:
(1)
t時刻的二次移動平均值為:
(2)
(3)
(4)
(5)
因此基于二次移動平均法,對t時刻歷史數(shù)據(jù)序列進(jìn)行分析,可以計算出t+T時刻的預(yù)測值:
(6)
圖2為文中提出的容器云伸縮算法的決策過程。在算法運(yùn)行過程中,系統(tǒng)內(nèi)會維護(hù)一張容器服務(wù)最近L次響應(yīng)時間記錄表H,通過對系統(tǒng)內(nèi)容器服務(wù)(Service_ID)的響應(yīng)時間tres進(jìn)行持續(xù)監(jiān)控并用獲取到的數(shù)據(jù)不斷更新記錄表H。決策模塊會對表H中最近L次響應(yīng)時間進(jìn)行處理、建模、預(yù)測,得到未來時刻的預(yù)測值tpre,根據(jù)實時響應(yīng)時間數(shù)據(jù)以及預(yù)測值,利用基于閾值的響應(yīng)式伸縮策略進(jìn)行系統(tǒng)伸縮決策,并將伸縮命令傳遞給伸縮執(zhí)行模塊執(zhí)行。執(zhí)行完畢后,判斷伸縮算法是否繼續(xù)運(yùn)行,根據(jù)判斷結(jié)果來決定繼續(xù)循環(huán)或終止該算法。
圖2 容器云伸縮決策過程
如圖3所示,伸縮算法包含Monitor、Processor、Commander和Scheduler四個模塊。
圖3 伸縮算法模塊
(1)Monitor模塊。
Monitor模塊負(fù)責(zé)對應(yīng)用服務(wù)響應(yīng)時間tres持續(xù)監(jiān)控,并用獲取到的響應(yīng)時間序列不斷更新表H,使表H始終保持存儲最近L次應(yīng)用服務(wù)響應(yīng)時間。設(shè)定更新表H的策略為每次獲取服務(wù)響應(yīng)時間tres后,將其加入到鏈表尾部,同時將鏈表首元素刪除。在Monitor獲取到服務(wù)響應(yīng)時間后,同時也將采集到的數(shù)據(jù)傳遞給Commander模塊。
(2)Processor模塊。
Processor模塊主要對表H中最近L次服務(wù)響應(yīng)時間數(shù)據(jù)進(jìn)行分析、建模和對未來時刻值的預(yù)測。在具體算法實現(xiàn)時,假設(shè)表H中存儲的最近L次服務(wù)響應(yīng)時間序列為:xt-L+1,xt-L+2,…,xt-1,xt,設(shè)置好二次移動平均法參數(shù)n和預(yù)測間隔T后,基于二次移動平均法,根據(jù)表H中L條數(shù)據(jù)使用式6預(yù)測t+T時刻的服務(wù)響應(yīng)時間值xt+T,并將預(yù)測值傳遞給Commander模塊。
(3)Commander模塊。
Commander模塊會對Monitor模塊采集到的實時服務(wù)響應(yīng)時間tres和Processor模塊利用二次移動平均法計算出的響應(yīng)時間預(yù)測值tpre依據(jù)基于閾值的響應(yīng)式伸縮策略進(jìn)行判斷,如果tres>Tu‖tpre>Tu(Tu為響應(yīng)時間閾值上限)關(guān)系成立,說明系統(tǒng)內(nèi)服務(wù)響應(yīng)時間過長,質(zhì)量較差,因此Commander模塊會向Sch-eduler模塊發(fā)出擴(kuò)展命令,由Scheduler模塊完成容器服務(wù)擴(kuò)展(算法1中4~6行))。如果tres
算法1:伸縮決策算法。
Input:tres,H,Tu,Td,Service_ID
Output:Scale_Dec
1 Begin
2 While(algorithm is running)
3 Monitor and Collecttres,Maintain the tableH,calculate the valuetpre
4 iftres>Tu||tpre>Tu
5 send(Extension,E,Service_ID) command to Scheduler
6 end if
7 iftres
8 send(Contraction,E,Service_ID) command to Scheduler
9 end if
10 end While
11 End
(4)Scheduler模塊。
Scheduler模塊保存了一份對所有主機(jī)的評分表。集群中所有備選主機(jī)的CPU使用率、內(nèi)存占用率以及網(wǎng)絡(luò)帶寬占用率每隔一段時間就會被Scheduler模塊收集,并依據(jù)式7進(jìn)行評分和記錄到評分表中,通過評分高低來決定在哪臺主機(jī)上進(jìn)行容器服務(wù)的伸縮。
Scorei=(3-CPU_use-Mem_use-Net_use),Scorei∈(0,3)
(7)
其中,CPU_use為CPU使用率;Mem_use為內(nèi)存占用率;Net_use為網(wǎng)絡(luò)帶寬占用率。
同時,擴(kuò)展時需要計算擴(kuò)展容器服務(wù)個數(shù)N。假設(shè)需要擴(kuò)展的資源為E,單個容器持有資源為E0,因此可得N=E/E0。當(dāng)需要進(jìn)行收縮資源時,為防止因系統(tǒng)突然減少大量資源造成系統(tǒng)運(yùn)行異常,設(shè)定收縮資源時,每次釋放1個容器服務(wù)。
Scheduler模塊在運(yùn)行過程中,需要接收由Commander模塊發(fā)出的命令,如果收到的是擴(kuò)展命令,選擇當(dāng)前打分表中分?jǐn)?shù)最高的主機(jī),根據(jù)服務(wù)ID及新建容器命令,在指定主機(jī)上部署N個指定ID的容器,對外提供服務(wù)并將其記錄到Service記錄表S中,擴(kuò)展工作結(jié)束。此時為了避免因頻繁伸縮導(dǎo)致系統(tǒng)劇烈“抖動”,伸縮算法進(jìn)入一小段時間的休眠期(算法2中3~8行);如果收到的是收縮命令,選擇當(dāng)前打分表中分?jǐn)?shù)最低且其上運(yùn)行著相關(guān)服務(wù)的主機(jī)。分?jǐn)?shù)低意味著其上負(fù)載較重,因此在釋放資源時,為了維持負(fù)載均衡,首先移除負(fù)載較重主機(jī)上的服務(wù),減輕其上負(fù)載壓力。主機(jī)選定后,根據(jù)容器服務(wù)的ID,使用相關(guān)命令移除1個容器服務(wù),回收資源并更新Service記錄表S的內(nèi)容,收縮工作結(jié)束。同樣,為了避免因頻繁伸縮導(dǎo)致系統(tǒng)劇烈“抖動”,伸縮算法進(jìn)入一小段時間的休眠期(算法2中9~14行)。
算法2:伸縮執(zhí)行算法。
Input:(COMMAND,E,Service_ID)
Output:UpdatedS
1Begin
2 While(algorithm is running)
3 if “COMMAND” equals “Extension”
4 calculateN=E/E0;
5 Select the highest Score of the physical machine and deployN
6 Service_ID container service,updateS;
7 Sleep(a period of time);
8 end if
9 if “COMMAND” equals “Contraction”
10N=1;
11 Select the lowestScoreof the physical machine and removeN
12 Service_ID container service,updateS;
13 Sleep(a period of time);
14 end if
15 end While
16 End
實驗搭建了兩個四節(jié)點(diǎn)的Docker swarm[13]集群,分別為集群1和集群2。集群1為無任何修改的Docker swarm集群,即原生集群,采用的是響應(yīng)式伸縮策略。集群2為依據(jù)文中提出的伸縮策略改進(jìn)后的Docker swarm集群。實驗需要使用的工具包括并發(fā)測試執(zhí)行工具Jmeter以及反向代理器Nginx。實驗硬件包含6臺PC機(jī),各節(jié)點(diǎn)配置及安裝環(huán)境如表1所示。
表1 集群信息
續(xù)表1
圖4為實驗過程中主機(jī)之間的訪問順序。測試機(jī)通過其上安裝的Jmeter測試軟件以并發(fā)方式訪問swarm集群中容器Web認(rèn)證服務(wù)(實驗條件下只生成一類服務(wù)),并記錄服務(wù)響應(yīng)時間的變化情況。同時為了更好地驗證提出的伸縮方法,在訪問鏈路中加入了Nginx服務(wù)器來進(jìn)行消息轉(zhuǎn)發(fā)。
圖4 實驗過程中主機(jī)之間的訪問順序
文中提出的伸縮策略在具體算法實現(xiàn)時,L值設(shè)置為10,容器擴(kuò)展和收縮個數(shù)N設(shè)置為1,響應(yīng)時間閾值上限設(shè)置為0.9 s,閾值下限設(shè)置為0.2 s。二次移動平均法中n設(shè)置為2,預(yù)測時刻間隔T設(shè)置為1,也即根據(jù)t時刻的3個響應(yīng)時間值,使用二次移動平均法可以預(yù)測t+1時刻的響應(yīng)時間值。
表2為實驗負(fù)載數(shù)據(jù)。實驗負(fù)載數(shù)據(jù)分為兩類:周期性負(fù)載數(shù)據(jù)和突發(fā)式負(fù)載數(shù)據(jù)。
表2 實驗負(fù)載數(shù)據(jù)
續(xù)表2
圖5為施加周期性負(fù)載的實驗結(jié)果。
圖5 周期性負(fù)載實驗結(jié)果
當(dāng)請求數(shù)為50、120時,文中提出的算法和純響應(yīng)式伸縮算法效果一致,兩條曲線在圖中完全重合。原因是此時服務(wù)的實時響應(yīng)時間和響應(yīng)時間的預(yù)測值均未超過響應(yīng)時間的閾值上限,沒有觸發(fā)容器云集群的伸縮機(jī)制。當(dāng)請求數(shù)增長至230時,文中算法下個時刻的服務(wù)響應(yīng)時間預(yù)測值已經(jīng)超出了閾值上限,因此會選擇一臺分?jǐn)?shù)最高的主機(jī)新建一個對應(yīng)容器并提供服務(wù)。當(dāng)請求數(shù)繼續(xù)增長至320時,由于文中算法已提前擴(kuò)展了容器服務(wù),服務(wù)的響應(yīng)時間減至約為純響應(yīng)式伸縮算法的一半,而此時純響應(yīng)式伸縮算法才判定響應(yīng)時間超過閾值上限并開始擴(kuò)展。直到請求數(shù)為410時,純響應(yīng)式算法擴(kuò)展效果開始顯現(xiàn),與文中算法效果一致。收縮過程與上述擴(kuò)展過程類似。
從圖5可以看出,對純響應(yīng)式伸縮策略,容器服務(wù)響應(yīng)時間波峰為0.9 s,波谷為0.2 s,波動幅度為0.7;而文中提出的優(yōu)化算法服務(wù)響應(yīng)時間波峰為0.7 s,波谷為0.3 s,波動幅度為0.4。與純響應(yīng)式伸縮策略相比,文中算法的服務(wù)響應(yīng)時間的波動幅度降低了約42.9%,有效減弱了由負(fù)載變化引起的服務(wù)響應(yīng)時間波動。
圖6為施加突發(fā)式負(fù)載的實驗結(jié)果。
圖6 突發(fā)式負(fù)載實驗結(jié)果
從圖中可以看出,文中算法與純響應(yīng)式伸縮算法結(jié)果始終保持一致,兩條曲線完全重合。原因為對改進(jìn)伸縮策略后的Docker swarm集群施加突發(fā)式負(fù)載時,二次移動平均法無法對未來時刻值進(jìn)行準(zhǔn)確預(yù)測,導(dǎo)致預(yù)測效果喪失,集群伸縮決策只由服務(wù)的實時響應(yīng)時間和響應(yīng)時間閾值之間大小關(guān)系決定。因此,對于突發(fā)式負(fù)載,文中算法與純響應(yīng)式伸縮算法表現(xiàn)一致。
文中提出的基于二次移動平均法的預(yù)測式容器云伸縮策略,在保留基于閾值的響應(yīng)式伸縮策略對突發(fā)式負(fù)載具有良好響應(yīng)效果的同時,在周期性負(fù)載條件下還能對未來負(fù)載值進(jìn)行準(zhǔn)確預(yù)測,提高了容器云對應(yīng)用資源請求的響應(yīng)能力,降低了服務(wù)響應(yīng)時間波動幅度,保證了服務(wù)響應(yīng)時間的穩(wěn)定性。
針對容器云目前基于閾值的響應(yīng)式伸縮策略存在時間滯后性、難以及時響應(yīng)服務(wù)資源請求的問題,提出一種基于二次移動平均法的預(yù)測式容器云伸縮方法。該方法可以對未來工作負(fù)載進(jìn)行預(yù)測并依托容器輕量特點(diǎn)快速做出伸縮響應(yīng)。通過設(shè)計兩種不同的工作負(fù)載場景對改進(jìn)后容器集群伸縮方法進(jìn)行了測試,驗證了該方法的可行性和有效性。但該方法也存在不足,即對周期性工作負(fù)載具有較好的預(yù)測效果,而對其他類型工作負(fù)載的預(yù)測效果并不理想。后續(xù)研究可以考慮結(jié)合機(jī)器學(xué)習(xí)方法來建立預(yù)測模型,提高預(yù)測模型在各種工作負(fù)載場景下的預(yù)測準(zhǔn)確性。