姜 偉,潘邵芹
(北京工業(yè)大學(xué) 信息學(xué)部,北京 100124)
隨著業(yè)務(wù)需求的多元化以及系統(tǒng)規(guī)模的不斷擴大,單體架構(gòu)的服務(wù)架構(gòu)可擴展性越來越差,系統(tǒng)變得難以維護,而微服務(wù)通過服務(wù)功能拆分、模塊功能聚合,使單體架構(gòu)的服務(wù)拆分成多個微服務(wù),提高了擴展性和可維護性[1-3],因此微服務(wù)架構(gòu)在分布式服務(wù)領(lǐng)域有著越來越重要的位置。微服務(wù)架構(gòu)目前的負載均衡策略主要在調(diào)用方控制,依賴于隨機調(diào)用或Round Robin方式,沒有考慮網(wǎng)絡(luò)負載以及調(diào)用鏈路情況[3-4]。
SDN是目前廣受關(guān)注的新型網(wǎng)絡(luò)架構(gòu)[5-6],通過將控制平面和數(shù)據(jù)平面進行分離,提高了對網(wǎng)絡(luò)流量的控制能力,使SDN控制器能夠?qū)嵤┘毩6鹊穆窂揭?guī)劃和控制能力[7-8],是未來網(wǎng)絡(luò)的發(fā)展方向。
文中研究基于SDN的微服務(wù)負載均衡方案,通過將微服務(wù)部署于SDN網(wǎng)絡(luò),可以借助SDN控制平面的精細化管控能力提供更細粒度的負載均衡能力,實現(xiàn)針對微服務(wù)特點的負載均衡的優(yōu)化。
負載均衡一般會維護一個服務(wù)端清單,利用心跳檢測等手段進行清單維護,保證清單中都是可以正常訪問的服務(wù)節(jié)點。當(dāng)用戶發(fā)送請求時,會先到達負載均衡器,負載均衡器根據(jù)負載均衡算法(輪詢、隨機、加權(quán)輪詢)從可用的服務(wù)端列表中取出一臺服務(wù)端的地址,根據(jù)負載情況進行轉(zhuǎn)發(fā),降低系統(tǒng)的壓力[9-12]。
文獻[13]設(shè)計并實現(xiàn)了一種鏈路負載均衡方案,在利用SDN獲取了全局網(wǎng)絡(luò)拓撲視圖的基礎(chǔ)上,實現(xiàn)了一種最優(yōu)K條路徑算法,選擇出最優(yōu)的K條冗余鏈路,制定評價模型對于每條候選鏈路進行評估,得到最有利于當(dāng)前全局網(wǎng)絡(luò)負載均衡的鏈路,最終將對應(yīng)的轉(zhuǎn)發(fā)策略部署到OpenFlow交換機的流表上。
文獻[14]提出一種基于SDN的分布式服務(wù)器負載均衡方法,SDN控制器管理通過SDN網(wǎng)絡(luò)訪問服務(wù)器集群的進出流量,并能綜合網(wǎng)絡(luò)設(shè)備、服務(wù)器負載與用戶特定需求,部署動態(tài)可擴展的負載均衡策略。
文獻[9]確定了在OpenFlow網(wǎng)絡(luò)中進行負載均衡需要解決的三個關(guān)鍵問題:服務(wù)器狀態(tài)的度量、網(wǎng)絡(luò)狀態(tài)的度量和路徑選擇,提出了一種基于Open Flow的負載均衡算法。該算法對網(wǎng)絡(luò)建立起全局的視圖,綜合考慮網(wǎng)絡(luò)資源與計算資源的使用狀態(tài),通過統(tǒng)一的決策,合理地進行流量分配,以達成負載均衡的目標(biāo)。
文中主要工作是研究將SDN技術(shù)應(yīng)用于微服務(wù)架構(gòu),利用SDN對網(wǎng)絡(luò)的精細化管控能力使微服務(wù)架構(gòu)達到更優(yōu)的負載均衡策略。重點研究并解決了下列問題:
研究負載均衡由客戶端上移到控制平面:為了使負載均衡能夠在得知全網(wǎng)流量視圖的基礎(chǔ)上計算策略,而不是僅僅依靠round robin這種比較隨機的方式,需要將微服務(wù)調(diào)用的負載均衡策略選擇從客戶端上移到控制平面。
基于調(diào)用鏈分析的微服務(wù)負載均衡:負載均衡決策上移到控制平面后,可以針對全局網(wǎng)絡(luò)視圖進行路徑?jīng)Q策,還可以根據(jù)微服務(wù)的特點,進行調(diào)用鏈路分析,不局限在兩個主機之間的網(wǎng)絡(luò)通信,而是綜合考慮整個調(diào)用鏈路的網(wǎng)絡(luò)負載情況,提升負載均衡決策的效果。
服務(wù)限流:當(dāng)服務(wù)調(diào)用量過多或服務(wù)容量不夠時,只靠負載均衡仍然可能不足以支撐微服務(wù)集群的正常工作,為避免過多的流量造成網(wǎng)絡(luò)或服務(wù)不可用,需要進行限流。
基于SDN的微服務(wù)網(wǎng)絡(luò)組成如圖1所示。微服務(wù)的應(yīng)用服務(wù)器部署于SDN網(wǎng)絡(luò)之中,微服務(wù)之間通過應(yīng)用名進行服務(wù)調(diào)用,應(yīng)用名與ip的綁定與映射由服務(wù)注冊與發(fā)現(xiàn)機制完成,通過將服務(wù)注冊與發(fā)現(xiàn)組件嵌入到控制平面也就是SDN控制器,實現(xiàn)將微服務(wù)調(diào)用過程的負載均衡完全上移到控制平面,服務(wù)調(diào)用方不需要感知負載均衡策略,而控制平面則能夠?qū)崿F(xiàn)更精細化的負載均衡策略,可以綜合考量服務(wù)提供方主機的負載情況、網(wǎng)絡(luò)路徑的帶寬情況,進而引入調(diào)用鏈路分析,根據(jù)微服務(wù)的特點進行調(diào)用鏈路的負載均衡決策,而不僅僅限于兩臺主機之間的網(wǎng)絡(luò)通信。
圖1 基于SDN的微服務(wù)網(wǎng)絡(luò)組成
使用SDN進行負載均衡設(shè)計,首先需要解決如何將微服務(wù)調(diào)用過程對目的節(jié)點的選擇上移到SDN控制器。為此,文中定義虛IP。虛IP與特定的服務(wù)進行綁定,調(diào)用該服務(wù)時使用虛IP,這樣調(diào)用方不需要知道被調(diào)用服務(wù)有幾臺機器,也不需要知道這些機器的IP,負載均衡策略完全對調(diào)用方透明。此外,當(dāng)被調(diào)用服務(wù)節(jié)點下線、上線新機器時,調(diào)用方不需要感知。服務(wù)提供方服務(wù)節(jié)點的選取、網(wǎng)絡(luò)路徑的計算都由SDN的微服務(wù)鏈路計算與負載均衡模塊進行處理。當(dāng)SDN控制器計算好網(wǎng)絡(luò)路徑后,目的服務(wù)節(jié)點也就確定下來,這時候會有IP改寫的過程,將虛IP改寫成實際服務(wù)節(jié)點的IP。
當(dāng)微服務(wù)A的某臺節(jié)點調(diào)用微服務(wù)B的服務(wù)時,主要會有以下步驟:
(1)需要發(fā)起服務(wù)調(diào)用的機器向服務(wù)發(fā)現(xiàn)模塊進行服務(wù)發(fā)現(xiàn)請求,請求微服務(wù)B的IP;
(2)服務(wù)發(fā)現(xiàn)模塊返回微服務(wù)B對應(yīng)的虛IP:ipB;
(3)微服務(wù)A向ipB發(fā)起服務(wù)請求;
(4)SDN控制器進行路徑計算,選擇微服務(wù)B的某個主機的IP,如ip2;
(5)SDN控制器向SDN交換機下發(fā)流表進行轉(zhuǎn)發(fā)的同時對IP進行改寫(目的IP由IPB改為ip2)。
微服務(wù)架構(gòu)中,服務(wù)調(diào)用通常伴隨著下游依賴的調(diào)用,導(dǎo)致一個服務(wù)調(diào)用的鏈路可能會比較長,在負載均衡決策中,就不能只考慮服務(wù)調(diào)用的兩個節(jié)點之間,而應(yīng)該考慮整個調(diào)用鏈路上的負載均衡。
圖2展示了典型微服務(wù)調(diào)用的調(diào)用鏈路。應(yīng)用A調(diào)用應(yīng)用B時,伴隨著應(yīng)用B調(diào)用應(yīng)用C,應(yīng)用C調(diào)用應(yīng)用D和E,只對應(yīng)用A到應(yīng)用B之間的鏈路做負載均衡存在弊端。圖3展示了微服務(wù)的分布式節(jié)點網(wǎng)絡(luò)聯(lián)通圖。節(jié)點{Xi|X∈(A,B,C,D…),i∈(1,2,3,4…)}分別代表微服務(wù)X的服務(wù)器節(jié)點,連接線表示某臺服務(wù)器可以通過網(wǎng)絡(luò)(可以經(jīng)過若干交換機,圖里省略了交換機)與另一臺服務(wù)器通信,在應(yīng)用A調(diào)用應(yīng)用B的服務(wù)時,存在多條鏈路可以選擇,如果只考慮A→B的鏈路,鏈路負載可能不是最佳的選擇,還可能選擇的鏈路無法完成后續(xù)調(diào)用導(dǎo)致調(diào)用失敗(C1→D1之間網(wǎng)絡(luò)故障無法調(diào)用成功)。
圖2 微服務(wù)調(diào)用(A→B)引起的服務(wù)調(diào)用鏈路
圖3 微服務(wù)調(diào)用的分布式節(jié)點示意(省略交換機)
微服務(wù)調(diào)用有以下特點:
(1)服務(wù)以分布式部署,服務(wù)調(diào)用沒有明確的調(diào)用目的主機,網(wǎng)絡(luò)路徑選擇是對服務(wù)之間,而不是主機之間;
(2)局部最優(yōu)不一定表示整個調(diào)用鏈路最優(yōu);
(3)某個網(wǎng)絡(luò)鏈路中斷如C1→D1中斷導(dǎo)致A→B1→C1是調(diào)不通的路徑,如果不進行調(diào)用鏈路分析,對A調(diào)用B服務(wù)進行路徑選擇時可能會選擇A→B1的路徑,導(dǎo)致B服務(wù)的后續(xù)調(diào)用失敗。
基于調(diào)用鏈路分析的負載均衡算法綜合考慮整個服務(wù)調(diào)用鏈路涉及到的網(wǎng)絡(luò)負載狀況,進行綜合的路徑選擇考量。SDN控制器在處理流表請求時分析應(yīng)用之間的依賴關(guān)系,逐漸維護出微服務(wù)之間的調(diào)用鏈路,在進行微服務(wù)負載均衡路徑計算時,綜合考慮整個調(diào)用鏈路涉及到的所有網(wǎng)絡(luò)節(jié)點的負載情況,計算出更合適的路徑。
以圖3為例,基于調(diào)用鏈路分析的微服務(wù)負載均衡路徑計算主要步驟可通過圖4簡要描述:
(1)節(jié)點標(biāo)注:計算路徑時不再抽象成無差別的網(wǎng)絡(luò)節(jié)點,明確網(wǎng)絡(luò)節(jié)點的身份:交換機、服務(wù)A、服務(wù)B……
(2)鏈路剪枝:剪掉不符合調(diào)用邏輯的節(jié)點如A→F(服務(wù)A沒有調(diào)用服務(wù)B)、B2→E1(服務(wù)B沒有調(diào)用服務(wù)C);
(3)以服務(wù)為基準(zhǔn)進行費用計算。從最后一個服務(wù)開始,標(biāo)注調(diào)用該服務(wù)的某臺機器需要的費用;
(4)依次沿著調(diào)用鏈路逆向計算費用,直到調(diào)用源頭。
圖4 基于調(diào)用鏈路分析的微服務(wù)負載均衡
當(dāng)網(wǎng)絡(luò)請求到達SDN網(wǎng)絡(luò)時,需要路由到限流服務(wù)器決定是否通過,SDN控制器通過對SDN交換機安裝流表,將網(wǎng)絡(luò)流量轉(zhuǎn)發(fā)到限流服務(wù)器,由限流服務(wù)器決定是否允許網(wǎng)絡(luò)流量通過。
如果網(wǎng)絡(luò)流沒有觸發(fā)限流,被允許通過,限流服務(wù)器需要把數(shù)據(jù)包發(fā)送回網(wǎng)絡(luò),并按照合適的路徑傳輸給目的主機。但前文提到,需要把新進入網(wǎng)絡(luò)的數(shù)據(jù)包轉(zhuǎn)發(fā)到限流服務(wù)器,當(dāng)限流服務(wù)器把數(shù)據(jù)包傳回網(wǎng)絡(luò)時,需要網(wǎng)絡(luò)能夠正確處理網(wǎng)絡(luò)數(shù)據(jù)包,不再轉(zhuǎn)發(fā)給限流服務(wù)器,而是按照正常的路徑規(guī)劃轉(zhuǎn)發(fā)到目標(biāo)節(jié)點。
為了能夠區(qū)分到達限流服務(wù)器之前的數(shù)據(jù)包和從限流服務(wù)器傳回的數(shù)據(jù)包,文中通過VLAN標(biāo)記對兩種數(shù)據(jù)包進行標(biāo)識。當(dāng)限流服務(wù)器將數(shù)據(jù)包傳回SDN網(wǎng)絡(luò)時,需要對數(shù)據(jù)包添加VALN標(biāo)記,SDN交換機和SDN控制器通過VLAN標(biāo)記對兩種數(shù)據(jù)包進行區(qū)分。此技術(shù)消耗一個VLAN id即可,文中定義為VLAN 10。
在SDN交換機的流表項匹配時,使用流表優(yōu)先級確定對網(wǎng)絡(luò)數(shù)據(jù)包的轉(zhuǎn)發(fā)決定。為此需要預(yù)先安裝另一條流表1:VLAN 10,轉(zhuǎn)發(fā)至SDN控制器,優(yōu)先級A。前文提到的默認(rèn)轉(zhuǎn)發(fā)到限流服務(wù)器的流表2優(yōu)先級定義為B。優(yōu)先級A>B,當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包到達SDN網(wǎng)絡(luò)時,SDN交換機有兩個流表,流表1優(yōu)先級高,但此時數(shù)據(jù)包沒有VLAN 10的標(biāo)記,所以不匹配流表1,但匹配流表2,從而按照流表2的轉(zhuǎn)發(fā)決定轉(zhuǎn)發(fā)到限流服務(wù)器。當(dāng)限流服務(wù)器把數(shù)據(jù)包傳回SDN網(wǎng)絡(luò)時,由于添加了VLAN 10標(biāo)記,從而匹配到了流表1,按照流表1的轉(zhuǎn)發(fā)決定把數(shù)據(jù)包轉(zhuǎn)發(fā)到SDN控制器,SDN控制器為其進行路徑選擇,然后安裝相應(yīng)流表(定義為流表3,優(yōu)先級C)到SDN交換機。此時流表優(yōu)先級C>A>B。所以數(shù)據(jù)包此后會按照流表3的轉(zhuǎn)發(fā)決定,被轉(zhuǎn)發(fā)到目的服務(wù)節(jié)點。
圖5為網(wǎng)絡(luò)流被允許通過時網(wǎng)絡(luò)流的走向。其中,步驟3將網(wǎng)絡(luò)流轉(zhuǎn)發(fā)到限流服務(wù)器,限流服務(wù)器決定允許該網(wǎng)絡(luò)流正常轉(zhuǎn)發(fā),對數(shù)據(jù)包添加VLAN 10標(biāo)記,然后傳回到SDN網(wǎng)路中,到達SDN交換機后,由于匹配到了流表1,且流表1的優(yōu)先級大于流表2,所以會向SDN控制器發(fā)出請求流表。步驟7控制器為交換機安裝正常轉(zhuǎn)發(fā)的流表3,該流表的優(yōu)先級最高,后續(xù)的轉(zhuǎn)發(fā)行為將按照此流表正常轉(zhuǎn)發(fā)到服務(wù)節(jié)點。
圖5 微服務(wù)通信時的網(wǎng)絡(luò)數(shù)據(jù)流向
Mininet是一款廣泛使用的SDN網(wǎng)絡(luò)測試平臺,文中基于Mininet搭建網(wǎng)絡(luò)拓撲,并基于ONOS(一款分布式SDN控制器)編寫算法,微服務(wù)使用thrift框架編寫,運行于docker容器中,docker容器內(nèi)運行ubuntu操作系統(tǒng)。整個實驗的網(wǎng)絡(luò)拓撲如圖6所示,共10臺SDN交換機,由Mininet拓撲腳本建立,13臺運行微服務(wù)的主機,部署在13臺docker容器中,微服務(wù)之間的調(diào)用關(guān)系與圖5保持一致。docker容器與SDN交換機進行橋接,以進行網(wǎng)絡(luò)連通。實驗中交換機端口帶寬配置為50 M,延遲10 ms。
圖6 實驗拓撲
首先將D1與S6的連接斷開,主機A1發(fā)起服務(wù)調(diào)用,使用隨機模式的負載均衡與文中提出的基于調(diào)用鏈路分析的負載均衡算法分別進行1 000次調(diào)用,重復(fù)10次試驗,結(jié)果表明文中算法的調(diào)用全部成功,隨機模式的實驗結(jié)果如圖7所示。大體上有三分之一的調(diào)用失敗,其原因為A應(yīng)用調(diào)用B應(yīng)用有3個候選機器,每個機器同等概率被調(diào)用,但主機B1的調(diào)用后續(xù)鏈路是不通的。
圖7 實驗1隨機負載均衡算法失敗次數(shù)
然后將D1與S6的連接恢復(fù),延遲時間增加到100 ms,使用iperf工具進行隨機的背景流量發(fā)送,然后進行100次服務(wù)調(diào)用,對比平均調(diào)用時延,結(jié)果如圖8所示??梢娢闹刑岢龅乃惴軌蛴行Ы档驼{(diào)用時延,其原因主要是隨機負載均衡算法無法感知某個調(diào)用鏈路具體的優(yōu)劣,無法進行更優(yōu)化的路徑選擇。
最后進行服務(wù)限流實驗,開啟20 M/s的隨機背景流量,隨后不斷加大調(diào)用頻率,出現(xiàn)大量超時后,統(tǒng)計100次調(diào)用成功的平均時延,共統(tǒng)計10次,隨后開啟限流,丟棄1/4的流量,重復(fù)實驗,結(jié)果如圖9所示。實驗表明限流功能能夠有效減少網(wǎng)絡(luò)擁堵。
圖8 隨著流量增多服務(wù)調(diào)用延遲趨勢
圖9 限流實驗結(jié)果
對基于SDN的微服務(wù)場景下的負載均衡與限流進行了研究,通過虛IP與IP改寫技術(shù),將微服務(wù)調(diào)用的負載均衡上移到控制平面,進而提出了基于調(diào)用鏈路分析的負載均衡算法。同時通過VLAN標(biāo)記和流表優(yōu)先級機制實現(xiàn)服務(wù)限流,在服務(wù)過載時保護服務(wù)的正常服務(wù),避免服務(wù)不可用。實驗結(jié)果表明,提出的算法、策略能夠降低微服務(wù)的調(diào)用時延,提升微服務(wù)的性能。