周 磊 孟利民 周立鵬 蔣 維
(*浙江工業(yè)大學(xué)信息工程學(xué)院 杭州 310023) (**浙江樹人大學(xué)信息科技學(xué)院 杭州 310015)
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,互聯(lián)網(wǎng)服務(wù)已經(jīng)成為日常生活中不可或缺的部分。由于互聯(lián)網(wǎng)用戶的爆發(fā)式增長,服務(wù)器常常在短時(shí)間內(nèi)收到大量并發(fā)的用戶請(qǐng)求,若不能及時(shí)處理這些請(qǐng)求將影響用戶體驗(yàn),降低服務(wù)質(zhì)量。因此,單個(gè)服務(wù)器遠(yuǎn)遠(yuǎn)無法滿足大量的服務(wù)請(qǐng)求,聯(lián)合多個(gè)服務(wù)器的服務(wù)器集群應(yīng)運(yùn)而生。如何合理地分配集群服務(wù)器的任務(wù)并滿足最大的服務(wù)需求是服務(wù)器集群需要解決的關(guān)鍵技術(shù)問題,而負(fù)載均衡是解決服務(wù)器集群難點(diǎn)的核心技術(shù)之一,能夠平衡集群中各個(gè)服務(wù)節(jié)點(diǎn)的負(fù)載,充分發(fā)揮服務(wù)器集群的性能。目前國內(nèi)外已經(jīng)提出了各種負(fù)載均衡算法[1]。其中有靜態(tài)負(fù)載均衡算法,如輪詢調(diào)度算法、加權(quán)輪詢調(diào)度算法[2]、目標(biāo)地址散列調(diào)度算法等,這類算法易于實(shí)現(xiàn),但不考慮各個(gè)服務(wù)器節(jié)點(diǎn)的負(fù)載狀態(tài),容易導(dǎo)致負(fù)載不均衡;有動(dòng)態(tài)負(fù)載均衡算法[3,4],如最小連接數(shù)算法、一致性哈希算法[5]、動(dòng)態(tài)反饋算法[6]等,這類算法沒有考慮服務(wù)器間的性能差異和任務(wù)請(qǐng)求的大小,不能準(zhǔn)確地判斷服務(wù)器真實(shí)的負(fù)載狀態(tài)。動(dòng)態(tài)負(fù)載均衡算法注重于服務(wù)器負(fù)載狀態(tài)的計(jì)算和反饋,文獻(xiàn)[7]提出一種基于排隊(duì)論綜合指標(biāo)評(píng)估的動(dòng)態(tài)負(fù)載均衡算法,采用服務(wù)器M/M/1排隊(duì)模型,以任務(wù)的平均排隊(duì)時(shí)長和平均等待時(shí)長來計(jì)算負(fù)載,但其計(jì)算需花費(fèi)較多時(shí)間,具有一定的延后性。文獻(xiàn)[8]提出了一種改進(jìn)的流媒體集群動(dòng)態(tài)負(fù)載均衡調(diào)度算法,通過集群節(jié)點(diǎn)任務(wù)數(shù)變化量動(dòng)態(tài)修改服務(wù)器負(fù)載的反饋周期,并按服務(wù)器負(fù)載狀況進(jìn)行分類,但當(dāng)反饋周期過小時(shí),服務(wù)器將頻繁計(jì)算負(fù)載,增加服務(wù)器壓力。在異構(gòu)網(wǎng)絡(luò)應(yīng)用中,文獻(xiàn)[9]提出了一種基于模糊控制的負(fù)載均衡決策機(jī)制,用于避免異構(gòu)網(wǎng)絡(luò)中頻繁切換。文獻(xiàn)[10]提出了一種基于接入選擇和業(yè)務(wù)轉(zhuǎn)移的異構(gòu)網(wǎng)絡(luò)動(dòng)態(tài)負(fù)載均衡機(jī)制,同時(shí)提高系統(tǒng)利用率和負(fù)載均衡性。還有注重任務(wù)調(diào)度的遺傳算法、模擬退火算法[11]、粒子群算法[12]等,這類算法實(shí)現(xiàn)較為復(fù)雜,且容易陷入局部最優(yōu)解。文獻(xiàn)[13]提出一種基于遺傳算法的負(fù)載均衡機(jī)制,引入了投資組合Mean-Variance模型來設(shè)置服務(wù)集群中節(jié)點(diǎn)利用率的權(quán)重,以最小化任務(wù)完成時(shí)間為條件來獲得最優(yōu)的權(quán)值向量,即為每個(gè)服務(wù)器的資源利用率分配權(quán)值從而得到更有效的組合適應(yīng)度函數(shù),但其計(jì)算效率一般,對(duì)服務(wù)器的響應(yīng)時(shí)間有一定的影響。
影響負(fù)載均衡算法性能的關(guān)鍵在于如何動(dòng)態(tài)地將任務(wù)均衡地分配至各個(gè)服務(wù)器節(jié)點(diǎn),因此本文提出了一種基于二部圖最大匹配的動(dòng)態(tài)負(fù)載均衡算法。二部圖最大匹配[14]是指二部圖中不相鄰的邊組成的集合中含邊數(shù)最多的集合,常用于解決任務(wù)指派、資源分配[15]、數(shù)據(jù)匹配[16]等問題。在服務(wù)器集群系統(tǒng)中,管理服務(wù)器按照一定的機(jī)制將任務(wù)隊(duì)列中的任務(wù)分配給集群中的各個(gè)服務(wù)器節(jié)點(diǎn),這就是可用二部圖最大匹配解決的現(xiàn)實(shí)應(yīng)用場(chǎng)景之一。本文算法以服務(wù)器和任務(wù)作為圖頂點(diǎn)的子集X和Y,先預(yù)計(jì)任務(wù)的任務(wù)量和期望完成任務(wù)所需的時(shí)間,并采用由服務(wù)器反饋得到的任務(wù)量與任務(wù)實(shí)際完成時(shí)間的比值作為服務(wù)器的負(fù)載指標(biāo)[17],若任務(wù)預(yù)計(jì)的任務(wù)量與服務(wù)器負(fù)載指標(biāo)的比值小于期望完成任務(wù)所需的時(shí)間,則將該任務(wù)頂點(diǎn)與服務(wù)器頂點(diǎn)相連作為圖的邊,由此得到服務(wù)器與任務(wù)的二部圖,再采用Edmonds的匈牙利算法[18]求該二部圖的最大匹配,然后將任務(wù)發(fā)送給匹配到的服務(wù)器,從而動(dòng)態(tài)地實(shí)現(xiàn)任務(wù)的調(diào)度和服務(wù)器的負(fù)載均衡。
本文提出的基于二部圖最大匹配的動(dòng)態(tài)負(fù)載均衡算法的系統(tǒng)框架如圖1所示。整個(gè)系統(tǒng)主要由管理服務(wù)器和服務(wù)器集群組成。其中服務(wù)器集群中的服務(wù)器用于執(zhí)行任務(wù),并計(jì)算自身的負(fù)載指標(biāo)返回給管理服務(wù)器。管理服務(wù)器可分為4個(gè)模塊,分別是任務(wù)分配模塊、任務(wù)預(yù)估模塊、負(fù)載指標(biāo)接收模塊和計(jì)算模塊。負(fù)載指標(biāo)接收模塊負(fù)責(zé)接收服務(wù)器反饋的負(fù)載指標(biāo),并更新當(dāng)前保存在管理服務(wù)器的服務(wù)器集群負(fù)載信息。任務(wù)預(yù)估模塊負(fù)責(zé)預(yù)計(jì)待匹配任務(wù)的任務(wù)量和期望完成任務(wù)所需的時(shí)間。計(jì)算模塊根據(jù)各個(gè)服務(wù)器的負(fù)載指標(biāo)以及任務(wù)的任務(wù)量和期望完成時(shí)間,構(gòu)建服務(wù)器與任務(wù)之間的二部圖并求其最大匹配。任務(wù)分配模塊按照由計(jì)算模塊返回的匹配結(jié)果將任務(wù)分配給各個(gè)服務(wù)器。
圖1 基于二部圖最大匹配的動(dòng)態(tài)負(fù)載均衡算法系統(tǒng)框架
服務(wù)器每執(zhí)行一個(gè)任務(wù),將記錄該任務(wù)的任務(wù)量r,任務(wù)開始時(shí)間tstart和任務(wù)完成時(shí)間tend,并由式(1)得到服務(wù)器當(dāng)前負(fù)載指標(biāo)v。
(1)
服務(wù)器負(fù)載指標(biāo)代表服務(wù)器完成任務(wù)的速率,與常見算法采用中央處理器(CPU)空閑率、內(nèi)存空閑率等多參數(shù)計(jì)算負(fù)載指標(biāo)相比,降低了服務(wù)器負(fù)載計(jì)算的復(fù)雜度,且更直接地反映了當(dāng)前服務(wù)器的負(fù)載狀態(tài)。若v越大,則說明服務(wù)器的負(fù)載較低,能更快地完成任務(wù);若v越小,則說明服務(wù)器的負(fù)載較大,完成任務(wù)需要消耗更多的時(shí)間。那么服務(wù)器集群的負(fù)載指標(biāo)平均值為
(2)
其中,n為集群中服務(wù)器數(shù)量。由此可以得到各個(gè)服務(wù)器負(fù)載指標(biāo)的方差σ2:
(3)
方差σ2越小,說明服務(wù)器之間的負(fù)載越均衡。
本文算法是基于任務(wù)隊(duì)列、服務(wù)器集群和各服務(wù)器負(fù)載指標(biāo)構(gòu)建二部圖,并根據(jù)二部圖的最大匹配結(jié)果向各服務(wù)器分配任務(wù),其總體流程圖如圖2所示。
圖2 算法流程圖
整個(gè)算法流程主要由管理服務(wù)器和服務(wù)器集群共同工作完成。首先管理服務(wù)器中維護(hù)著一個(gè)任務(wù)隊(duì)列,任務(wù)隊(duì)列中含有一定量待執(zhí)行的任務(wù),由集合表示為Jq={J1,J2,J3,…}。服務(wù)器集群中有n臺(tái)服務(wù)器,由集合表示為S={S1,S2,S3,…,Sn},服務(wù)器Si主要負(fù)責(zé)接收并執(zhí)行管理服務(wù)器為其分配的任務(wù)Jm。服務(wù)器Si將在任務(wù)Jm被執(zhí)行前后記錄該任務(wù)的任務(wù)量Rm,以及執(zhí)行任務(wù)的開始時(shí)間Tmstart和結(jié)束時(shí)間Tmend,同時(shí)由式(1)計(jì)算得到當(dāng)前服務(wù)器Si的負(fù)載指標(biāo)vi,并將負(fù)載指標(biāo)vi反饋至管理服務(wù)器。
管理服務(wù)器的負(fù)載指標(biāo)接收模塊中記錄著服務(wù)器集群中各個(gè)服務(wù)器的負(fù)載指標(biāo),由集合表示為v={v1,v2,v3,…,vn}。各個(gè)服務(wù)器的初始化負(fù)載指標(biāo)可通過管理服務(wù)器向各個(gè)服務(wù)器發(fā)送一個(gè)測(cè)試任務(wù)J0獲得,其任務(wù)量為單位任務(wù)量R0,任務(wù)復(fù)雜度為C0,任務(wù)復(fù)雜度與任務(wù)實(shí)際計(jì)算循環(huán)次數(shù)相關(guān)。
管理服務(wù)器記錄各個(gè)服務(wù)器的初始化負(fù)載指標(biāo)后,從任務(wù)隊(duì)列中按順序取出與服務(wù)器數(shù)量相等的n個(gè)任務(wù),由集合表示為J={J1,J2,J3,…,Jn},同時(shí)通過任務(wù)預(yù)估模塊得到對(duì)應(yīng)任務(wù)的任務(wù)量為R={R1,R2,R3,…,Rn},期望完成任務(wù)所需時(shí)間為T={T1,T2,T3,…,Tn}。那么對(duì)于任務(wù)Jm,其任務(wù)量Rm可由式(4)得到:
(4)
其中,R0為單位任務(wù)量,C0為測(cè)試任務(wù)的復(fù)雜度,Cm為任務(wù)Jm的復(fù)雜度。任務(wù)Jm的期望完成時(shí)間Tm可由式(5)得到:
(5)
其中,T0為測(cè)試任務(wù)實(shí)際運(yùn)行時(shí)間,α的取值為經(jīng)驗(yàn)值。
管理服務(wù)器通過任務(wù)預(yù)估模塊得到任務(wù)量R和期望完成任務(wù)所需時(shí)間為T后,根據(jù)實(shí)時(shí)記錄的服務(wù)器負(fù)載指標(biāo)v,開始構(gòu)建二部圖。一般的圖可由G={V,E}表示,其中V為圖G的頂點(diǎn)集合,E為圖G的邊集合,由此管理服務(wù)器以服務(wù)器集合S和任務(wù)集合J作為圖的頂點(diǎn)集可得無邊圖G,如圖3所示,顯然V=S∪J,E=?。
然后管理服務(wù)器對(duì)所有服務(wù)器和任務(wù)進(jìn)行遍歷,對(duì)于任意一個(gè)服務(wù)器Si和一個(gè)任務(wù)Jm,可由式(6)預(yù)估服務(wù)器Si、執(zhí)行任務(wù)Jm、實(shí)際所需時(shí)間tim:
圖3 以集合S和集合J為頂點(diǎn)的無邊圖G
(6)
若tim≤Tm,則表示服務(wù)器Si能夠勝任任務(wù)Jm的工作,即預(yù)計(jì)服務(wù)器Si能在任務(wù)Jm的期望時(shí)間Tm內(nèi)完成該任務(wù),并將圖G中的頂點(diǎn)Si和頂點(diǎn)Jm相連,得到一條邊e=SiJm,將e加入圖G的邊集合中,即E=E∪e;若tim>Tm,則表示以服務(wù)器Si當(dāng)前的負(fù)載狀態(tài)無法及時(shí)地完成任務(wù),那么圖G中的頂點(diǎn)Si和頂點(diǎn)Jm不相連。上述遍歷完成后即可得到服務(wù)器S與任務(wù)J的二部圖G,如圖4所示。對(duì)于服務(wù)器Si,若與之相連的頂點(diǎn)較多,表示當(dāng)前該服務(wù)器負(fù)載較低,能勝任較多的任務(wù);若與之相連的頂點(diǎn)較少,表示當(dāng)前該服務(wù)器負(fù)載較高,只能勝任部分任務(wù);若沒有與之相連的頂點(diǎn),表示當(dāng)前該服務(wù)器負(fù)載較高,暫時(shí)不接收任務(wù)。
圖4 服務(wù)器S與任務(wù)J的二部圖G
管理服務(wù)器得到二部圖G后,根據(jù)深度優(yōu)先的Edmonds的匈牙利算法求二部圖G的最大匹配。遍歷頂點(diǎn)集合S,使頂點(diǎn)Si依次與集合J中的頂點(diǎn)進(jìn)行匹配,若頂點(diǎn)Si與頂點(diǎn)Jm相連,且頂點(diǎn)Jm還未與集合S中的其他頂點(diǎn)匹配,則邊e=SiJm為一條匹配邊,并開始匹配集合S的下個(gè)頂點(diǎn);若頂點(diǎn)Si與頂點(diǎn)Jm相連,但頂點(diǎn)Jm已經(jīng)與集合S中的其他頂點(diǎn)匹配,則尋找其増廣路,若找到増廣路,則將増廣路的匹配邊變成未匹配邊,而未匹配邊變成匹配邊,例如找到一條増廣路Si-J1-S1-Ji,則該増廣路匹配邊S1J1變成未匹配邊,未匹配邊SiJ1和S1Ji變成匹配邊,并開始匹配集合S的下個(gè)頂點(diǎn);若找不到増廣路,則頂點(diǎn)Si沒有匹配邊。集合S遍歷完后,所有匹配邊的集合即為二部圖G的最大匹配M={SiJm,…}。對(duì)于M中的匹配邊SiJm,表示以服務(wù)器Si當(dāng)前的負(fù)載狀況能勝任任務(wù)Jm。
管理服務(wù)器得到構(gòu)建的二部圖G的最大匹配M后,由任務(wù)分配模塊按照M中的匹配邊SiJm,將任務(wù)Jm發(fā)送至服務(wù)器Si進(jìn)行執(zhí)行。若任務(wù)集合J中存在沒有匹配邊的任務(wù),則將該任務(wù)移至任務(wù)隊(duì)列隊(duì)首,重新進(jìn)行二部圖構(gòu)建和求最大匹配流程。
在整個(gè)算法流程中,構(gòu)建二部圖需要對(duì)每個(gè)服務(wù)器與每個(gè)任務(wù)之間進(jìn)行判斷,因此對(duì)于n個(gè)服務(wù)器和n個(gè)任務(wù),其時(shí)間復(fù)雜度為O(n2)。對(duì)二部圖最大匹配采用深度優(yōu)先匈牙利算法求解時(shí),二部圖一邊有n個(gè)點(diǎn),最多找到n條増廣路,若二部圖構(gòu)建完成后有x條邊,那么每條増廣路把所有邊遍歷一遍,其時(shí)間復(fù)雜度為O(nx)。而根據(jù)二部圖構(gòu)建流程,二部圖中最多存在n2條邊,因此最壞時(shí)間復(fù)雜度為O(n3),所以整個(gè)算法流程的最高時(shí)間復(fù)雜度為O(n3)。由于服務(wù)器集群的應(yīng)用場(chǎng)景中服務(wù)器個(gè)數(shù)主要為一位數(shù)或兩位數(shù),所以管理服務(wù)器能很快計(jì)算出最大匹配。
重復(fù)上述算法流程,管理服務(wù)器即可將任務(wù)隊(duì)列中的任務(wù)分配至各個(gè)服務(wù)器中執(zhí)行,同時(shí)低負(fù)載的服務(wù)器更容易匹配到任務(wù)量較大且期望時(shí)間較短的任務(wù),高負(fù)載的服務(wù)器更容易匹配到任務(wù)量小且期望時(shí)間較長的任務(wù),甚至不會(huì)匹配到任務(wù),由此可以實(shí)現(xiàn)任務(wù)并發(fā)時(shí)服務(wù)器集群中各服務(wù)器間的負(fù)載均衡。
本文采用Java語言編寫管理服務(wù)器和服務(wù)器集群的程序,系統(tǒng)采用1個(gè)管理服務(wù)器和4個(gè)服務(wù)器組成的服務(wù)器集群,服務(wù)器配置參數(shù)如表1所示。
表1 服務(wù)器配置
基于本文算法,通過向管理服務(wù)器分別發(fā)送500、1 000、1 500個(gè)任務(wù)的任務(wù)隊(duì)列,運(yùn)行20 s后每隔5 s記錄服務(wù)器的負(fù)載指標(biāo),比較不同取值對(duì)本文算法的影響,結(jié)果如圖5所示。由圖5可知,當(dāng)向管理服務(wù)器發(fā)送500個(gè)任務(wù)時(shí),α取0.667的負(fù)載指標(biāo)方差大部分時(shí)間都低于其他取值的負(fù)載指標(biāo)方差;當(dāng)向管理服務(wù)器發(fā)送1 000個(gè)任務(wù)時(shí),α取0.667的負(fù)載指標(biāo)方差大部分時(shí)間都低于或接近其他取值的負(fù)載指標(biāo)方差;當(dāng)向管理服務(wù)器發(fā)送1 500個(gè)任務(wù)時(shí),20~50 s內(nèi)4種取值的負(fù)載指標(biāo)方差都變化較大,50 s后α取0.667和0.833的大部分時(shí)間都低于其他取值的負(fù)載指標(biāo)方差。
服務(wù)器分別完成500、1 000、1 500個(gè)任務(wù)所消耗的時(shí)間如表2所示。由表2可知,當(dāng)α取0.667時(shí),服務(wù)器完成所有任務(wù)消耗時(shí)間較少。綜合圖5和表2,當(dāng)本文算法的α值取0.667時(shí),服務(wù)器擁有較好的負(fù)載均衡度,且完成任務(wù)消耗時(shí)間較少。
表2 不同α值服務(wù)器完成任務(wù)消耗時(shí)間
以下實(shí)驗(yàn)本文算法的α值均取0.667。通過向管理服務(wù)器發(fā)送500、1 000、1 500個(gè)任務(wù)的任務(wù)隊(duì)列,對(duì)常見的加權(quán)輪詢調(diào)度算法、最小連接數(shù)算法和
(a) 500個(gè)任務(wù)
(b) 1 000個(gè)任務(wù)
基于排隊(duì)論綜合指標(biāo)評(píng)估的動(dòng)態(tài)負(fù)載均衡算法(以下簡(jiǎn)稱排隊(duì)論算法)與本文算法進(jìn)行仿真分析,運(yùn)行20 s后每隔5 s記錄服務(wù)器的負(fù)載指標(biāo),通過負(fù)載指標(biāo)的方差評(píng)估服務(wù)器的負(fù)載均衡情況,實(shí)驗(yàn)結(jié)果如圖6所示。由圖6可知,在3個(gè)不同任務(wù)隊(duì)列的情況下,運(yùn)行20 s后本文算法負(fù)載指標(biāo)的方差大部分時(shí)間都低于加權(quán)輪詢調(diào)度算法、最小連接數(shù)算法和排隊(duì)論算法,說明采用本文算法的服務(wù)器集群負(fù)載均衡度更好。
(a) 500個(gè)任務(wù)
(b) 1 000個(gè)任務(wù)
(c) 1 500個(gè)任務(wù)
3種算法完成500、1 000、1 500個(gè)任務(wù)所消耗的時(shí)間如表3所示。根據(jù)表3數(shù)據(jù),當(dāng)任務(wù)數(shù)量較少時(shí),由于加權(quán)輪詢算法未考慮服務(wù)器實(shí)時(shí)的負(fù)載狀態(tài),最小連接數(shù)算法和本文算法均優(yōu)于加權(quán)輪詢算法,但此時(shí)本文算法和最小連接數(shù)算法差距不大;當(dāng)任務(wù)數(shù)量逐漸增大時(shí),本文算法逐漸優(yōu)于最小連接數(shù)算法,消耗的時(shí)間更少。
表3 完成隊(duì)列所有任務(wù)消耗的時(shí)間
針對(duì)服務(wù)器集群系統(tǒng)中管理服務(wù)器調(diào)度任務(wù)的場(chǎng)景,本文提出了一種基于二部圖最大匹配的動(dòng)態(tài)負(fù)載均衡算法,以二部圖的匹配結(jié)果作為管理服務(wù)器的調(diào)度方案。仿真實(shí)驗(yàn)結(jié)果表明,該算法與加權(quán)輪詢調(diào)度算法、最小連接數(shù)算法和基于排隊(duì)論綜合指標(biāo)評(píng)估的動(dòng)態(tài)負(fù)載均衡算法相比,能使服務(wù)器擁有更好的負(fù)載均衡度;而且對(duì)于相同數(shù)量的任務(wù)隊(duì)列,采用該算法的服務(wù)器集群能更快地完成所有任務(wù)。
由于通過二部圖求出的最大匹配不一定是完美匹配,于是就存在取出的任務(wù)未匹配到服務(wù)器的情況,本文算法將該任務(wù)放回任務(wù)隊(duì)列,容易導(dǎo)致該任務(wù)的響應(yīng)時(shí)間過長,今后可以在這類任務(wù)的處理上對(duì)算法進(jìn)行改進(jìn)和優(yōu)化;本文算法求解二部圖最大匹配的計(jì)算復(fù)雜度與服務(wù)器數(shù)量相關(guān),當(dāng)服務(wù)器規(guī)模較大時(shí),算法效率將下降,因此對(duì)求二部圖最大匹配的匈牙利算法的改進(jìn)也是本文算法的重要優(yōu)化方向之一。