陳崗
摘要:目前接入互聯(lián)網(wǎng)的應(yīng)用越來越多,服務(wù)器在使用時經(jīng)常會面臨并發(fā)量、資源使用率以及響應(yīng)時間等各種要求,單臺服務(wù)器通常難以滿足繁忙的業(yè)務(wù)。服務(wù)器集群可以解決單臺服務(wù)器的問題,但是又面臨著負(fù)載均衡的問題。Nginx可以實現(xiàn)負(fù)載均衡,能夠有效解決服務(wù)器集群,尤其是異構(gòu)機器的負(fù)載均衡問題。
關(guān)鍵詞:集群;負(fù)載均衡;動態(tài);異構(gòu)
中圖分類號:G642 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2019)08-0009-02
互聯(lián)網(wǎng)技術(shù)和移動技術(shù)的結(jié)合,使互聯(lián)網(wǎng)用戶訪問量呈級數(shù)級別的不斷增長,如此龐大的用戶量給網(wǎng)絡(luò)系統(tǒng)運營以及服務(wù)器性能帶來的巨大的挑戰(zhàn)。很多情況下一臺服務(wù)器已經(jīng)難以滿足大量并發(fā)訪問的需求。為了解決服務(wù)器的單點性能問題,通常是搭建一個服務(wù)器集群響應(yīng)用戶請求。
大量用戶請求如何均衡的分發(fā)到服務(wù)器集群中的各個服務(wù)器上是一個非常關(guān)鍵的問題,這就是通常所說的負(fù)載均衡。負(fù)載均衡技術(shù)可以使服務(wù)器集群中的各服務(wù)器按照其性能合理地按比例分擔(dān)用戶請求,以保證性能高的服務(wù)器能夠更好、更快的處理請求。
1 Nginx技術(shù)及負(fù)載均衡
Nginx誕生于2004年,是一款反向代理服務(wù)器,具備高可靠性、高擴(kuò)展性的優(yōu)點,在支持大量的并發(fā)連接的同時內(nèi)存消耗還相對比較低,因此非常適合用于充當(dāng)服務(wù)器負(fù)載均衡器[1]。Nginx的內(nèi)部支持多種高級的數(shù)據(jù)結(jié)構(gòu)及開發(fā)模型,因此同等條件下要比apache tomcat的性能好。
Nginx是一種高度模塊化的負(fù)載均衡產(chǎn)品,包括event、upstream、fastcgi、memcached、Proxy等模塊,event模塊主要用于處理各種采集管理和分發(fā)的事件,fastcgi模塊用于便利地調(diào)用c、python等各種語言編寫的程序,upstream模塊可以解決一個請求有多個TCP連接、多個讀寫事件的問題,從而實現(xiàn)Nginx和上游服務(wù)器的交互;memcached模塊使Nginx能夠從后端的服務(wù)器獲取響應(yīng),服務(wù)代理模塊能夠?qū)⒂脩舻恼埱髠鬟f到另外一臺服務(wù)器。
Nginx啟動后有多個服務(wù)進(jìn)程,比如master進(jìn)程、worker進(jìn)程以及cache相關(guān)的進(jìn)程等。master進(jìn)程和worker進(jìn)程間的通信用于傳遞信息。master進(jìn)程通常就是Nginx的主進(jìn)程,此進(jìn)程并不實際執(zhí)行業(yè)務(wù),也不處理各種事件,而僅僅作為Nginx啟動后的進(jìn)程組和用戶的交互接口;另外,master進(jìn)程還可以監(jiān)控worker進(jìn)程的執(zhí)行狀態(tài),在worker進(jìn)程意外終止時重新啟動一個新的worker進(jìn)程。worker進(jìn)程一般是由master進(jìn)程fork產(chǎn)生的,作用是處理客戶端應(yīng)用程序與后端服務(wù)器間的數(shù)據(jù)交互和讀寫操作。
Nginx的upstream模塊的功能主要是實現(xiàn)用戶請求的負(fù)載均衡,其工程流程如圖1所示:
圖1 Nginx的upstream模塊工作流程
客戶端應(yīng)用的http請求發(fā)送給Nginx后,Nginx會根據(jù)請求向后端服務(wù)器發(fā)送TCP請求,后端服務(wù)器返回對應(yīng)的響應(yīng)報文[2]。Nginx會根據(jù)后端服務(wù)器的響應(yīng)報文決定是否轉(zhuǎn)發(fā)給客戶端。upstream模塊的處理機制會保證在處理Nginx上下游數(shù)據(jù)時,可以根據(jù)上下游網(wǎng)絡(luò)的具體情況采取不同的措施,如果上下游網(wǎng)絡(luò)差距不大,那么為了更多的并發(fā)處理用戶請求,可以開辟一塊固定的內(nèi)存,用于處理上游的響應(yīng),同時把保存的響應(yīng)頁面返回給下游。如果上游網(wǎng)速比下游網(wǎng)速快很多,則需要開辟足夠大的內(nèi)存緩沖區(qū),以緩存上游響應(yīng),在必要時還需要將其緩存到磁盤上。
2 負(fù)載均衡策略
為了更加高效的處理用戶請求,需要有一個高效的負(fù)載均衡策略,常用的負(fù)載均衡策略包括加權(quán)輪詢策略、IP Hash策略以及第三方負(fù)載均衡策略[3]。
加權(quán)輪詢策略需要事先為每臺服務(wù)器設(shè)置一個權(quán)值,代表各服務(wù)器處理用戶請求能力的高低。Nginx在分發(fā)請求時,就會有些選擇權(quán)重大的服務(wù)器,每次分發(fā)請求后都會更新權(quán)值,然后再分發(fā)新的請求。一段時間后各服務(wù)器處理的請求數(shù)量比值趨近于權(quán)值之比。這種負(fù)載均衡策略不依賴于客戶端,因此用戶請求能夠更合理地加權(quán)均勻分配到后端服務(wù)器。然而,同一個客戶端的多次請求可能被分配到不同的后端服務(wù)器處理,因此難以滿足需要會話保持的場景。
IP Hash負(fù)載均衡策略解決了同一客戶端的多次請求可能被分配到不同后端服務(wù)器的問題,先根據(jù)客戶端的IP計算一個哈希值,然后根據(jù)哈希值選擇后端服務(wù)器進(jìn)行分發(fā),這樣就克服了加權(quán)輪詢策略難以保持會話的不足。但是IP Hash策略實現(xiàn)負(fù)載均衡的依據(jù)是客戶端的IP地址,因此對于使用NAT代理的用戶而言,如果短時間內(nèi)大量使用同一NAT代理的用戶發(fā)起請求,則某臺后端服務(wù)器可能面臨巨大的壓力。
第三方負(fù)載均衡策略需要在安裝Nginx過程中編譯添加進(jìn)去,可以支持Fair Weight策略以及最小連接數(shù)策略。Fair Weight策略根據(jù)后端服務(wù)器的響應(yīng)時間分配請求,優(yōu)先分配響應(yīng)時間端的服務(wù)器;最小連接數(shù)策略優(yōu)先選擇連接數(shù)最少的后端服務(wù)器。雖然這些第三方負(fù)載均衡策略在一定程度上反映并利用了后端服務(wù)器的處理能力,但是它們還都是僅僅在加權(quán)輪詢的基礎(chǔ)上添加了一定的動態(tài)反饋,并沒有實質(zhì)性的改進(jìn)。
基于內(nèi)容分類的負(fù)載均衡算法會把用戶的請求分為若干類,并均勻地分配給各個服務(wù)器,以保證各個服務(wù)器得到的請求量大致相當(dāng)?;贖TTP請求內(nèi)容的負(fù)載均衡策略把用戶的HTTP請求內(nèi)容分為靜態(tài)請求和動態(tài)請求兩類,靜態(tài)請求只需要提高請求的cache命中率即可,動態(tài)請求才考慮進(jìn)行負(fù)載均衡。
在實現(xiàn)負(fù)載均衡時,服務(wù)器當(dāng)前的負(fù)載信息是關(guān)鍵,因此對負(fù)載信息評價的準(zhǔn)確性直接影響到負(fù)載均衡策略的選取。經(jīng)典的負(fù)載信息評價標(biāo)準(zhǔn)會綜合考慮服務(wù)器的CPU利用率、內(nèi)存使用率、網(wǎng)絡(luò)帶寬利用率以及磁盤IO情況等各種信息。
3 業(yè)務(wù)異構(gòu)集群的負(fù)載均衡
WEB請求通常會涉及到多種業(yè)務(wù),比如發(fā)表型業(yè)務(wù)、事務(wù)處理型業(yè)務(wù)、多媒體型業(yè)務(wù)等[4]。在多業(yè)務(wù)組成的業(yè)務(wù)異構(gòu)集群中,業(yè)務(wù)類型的不同會在很大程度上影響后端服務(wù)器的資源使用情況。例如,對單臺服務(wù)器而言事務(wù)性業(yè)務(wù)使用的資源主要是磁盤I/O,因此如果此類業(yè)務(wù)被分配到磁盤I/O相對差的服務(wù)器時就會減慢用戶的處理速度;對集群整體而言,電商類業(yè)務(wù)需要較高的服務(wù)器性能。
在多業(yè)務(wù)異構(gòu)集群的情況下,可以先把異構(gòu)服務(wù)器集群分為不同的業(yè)務(wù)子集群,然后依據(jù)動態(tài)負(fù)載均衡策略分發(fā)請求;另外,在請求分發(fā)過程中,如果某一個業(yè)務(wù)子集群的負(fù)載過重,則需要從負(fù)載較輕的業(yè)務(wù)子集群中抽調(diào)服務(wù)器,以緩解負(fù)載壓力?;谶@樣的思路,可以把負(fù)載均衡模塊劃分為請求分類模塊、請求分發(fā)模塊、負(fù)載反饋模塊。
請求分類模塊的作用是把用戶的請求分成不同的類型,以便有針對性的分發(fā)到不同服務(wù)器。請求分發(fā)模塊根據(jù)識別的用戶請求,然后詢問后端服務(wù)器的IP地址,并將用戶請求分發(fā)到對應(yīng)的IP。負(fù)載反饋模塊維護(hù)業(yè)務(wù)集群的結(jié)構(gòu)信息和整體負(fù)載信息,并根據(jù)實際情況選擇不同的負(fù)載均衡策略。
具體的服務(wù)請求分發(fā)步驟是:1) 用戶發(fā)起請求。通俗地講,就是在瀏覽器中輸入url地址并回車后,請求被發(fā)送到負(fù)載均衡器。2) 請求分類。請求分類模塊接收到用戶的請求url后,會把請求url轉(zhuǎn)換為(url ,type)的格式,然后發(fā)送給請求分發(fā)模塊。3) 請求分發(fā)。請求分發(fā)模塊根據(jù)其維護(hù)的每個用戶請求的負(fù)載值,把(type, request)發(fā)送給負(fù)載采集模塊,以便循環(huán)后端服務(wù)器的IP地址。4) 負(fù)載采集模塊根據(jù)一定的負(fù)載均衡策略,選擇合適的后端服務(wù)器處理用戶請求。
在請求分發(fā)過程中,如果在短時間內(nèi)用戶的請求都是某一類固定的業(yè)務(wù),那么可能會導(dǎo)致處理此業(yè)務(wù)的業(yè)務(wù)子集群負(fù)載過高,而且其他服務(wù)器因為空閑而沒有得到合理的利用。為了解決這一“旱澇不均”的現(xiàn)象,在負(fù)載分發(fā)過程中還需要進(jìn)行服務(wù)器的動態(tài)劃分,也就是在出現(xiàn)某類業(yè)務(wù)集中處理、負(fù)載過高的情況時,就從負(fù)載較輕的業(yè)務(wù)子集群中臨時抽調(diào)服務(wù)器,以緩解負(fù)載較高業(yè)務(wù)集群的壓力,在處理完畢后再把抽調(diào)的服務(wù)器歸還到原來的業(yè)務(wù)子集群。這樣一來,服務(wù)器的動態(tài)劃分既解決了用戶請求分發(fā)的負(fù)載均衡問題,又有效提高了后端服務(wù)器集群的利用效率。
4 總結(jié)
本文對服務(wù)器集群的負(fù)載均衡技術(shù)進(jìn)行研究。首先,介紹了Nginx技術(shù)及其負(fù)載均衡模塊,接下來在此基礎(chǔ)上闡述了動態(tài)負(fù)載均衡技術(shù),以及用于異構(gòu)集群的負(fù)載均衡技術(shù),對服務(wù)器集群的負(fù)載均衡研究有一定的參考意義。
參考文獻(xiàn):
[1] 王永輝.基于Nginx高性能web服務(wù)器性能優(yōu)化與負(fù)載均衡的改進(jìn)和實現(xiàn)[D].電子科技大學(xué),2017.
[2] A. Yousofi, M. Banitaba,S. Yazdanpanah.A Novel Method for Achieving Load Balancing in Web Clusters Based on Congestion Control and Cost Reduction[J]. IEEE Symposium on Computers &informatics, 2017,17(9): 55-58.
[3] 鄧珍榮,唐興興,黃文明,等.一種Web服務(wù)器集群負(fù)載均衡調(diào)度算法[J].計算機應(yīng)用與軟件,2013(10):53-56.
[4] 陳偉. 異構(gòu)Web集群中基于動態(tài)反饋機制的負(fù)載均衡的研究與實現(xiàn)[D].重慶大學(xué),2018.
【通聯(lián)編輯:王力】