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