負載均衡在web系統中的應用


在日常的架構設計與開發中,常用的負載均衡算法主要分為靜態和動態兩類。靜態負載算法以固定的頻率分配任務不考慮服務器的狀態信息,如輪詢法、隨機法等;動態負載均衡算法以服務器的實時負載狀態信息來決定任務的分配,如最小鏈接法等,下面簡單對其中幾種算法原理進行基本說明:

1、輪詢法會將收到的請求循環分配到服務器集群中的每台機器,即有效服務器上。如果使用這種方式,所有的標記進入分發的服務器應該有相近的資源容量以及負載形同的應用程序。如果所有的服務器有相同或者相近的性能那么選擇這種方式會使服務器負載相對均衡。基於這個前提,輪循調度是一個簡單而有效的分配請求的方式。然而對於服務器不同的情況,選擇這種方式就意味着能力比較弱的服務器也會在下一輪循環中接受輪循,即使這個服務器已經不能再處理當前這個請求了。這可能導致能力較弱的服務器超載。

2、加權輪詢算法解決了簡單輪循調度算法的缺點:傳入的請求按順序被分配到集群中服務器,但是會考慮提前為每台服務器分配的權重。配置人員只是簡單的通過服務器的處理能力來定義各台服務器的權重。例如,性能最強的服務器A給的權重是100,同時性能最低的服務器給的權重是50。這意味着在服務器B接收到第一個請求之前前,服務器A會連續的接受到2個請求,以此類推。

3、最小連接數算法,上述兩種方法都沒有考慮的是系統不能識別在給定的時間里保持了多少連接。因此可能發生,服務器B服務器收到的連接比服務器A少但是它已經超載,因為服務器B上的用戶打開連接持續的時間更長。這就是說連接數即服務器的負載是累加的。這種潛在的問題可以通過"最少連接數"算法來避免:傳入的請求是根據每台服務器當前所打開的連接數來分配的。即活躍連接數最少的服務器會自動接收下一個傳入的請求。基本上和簡單輪詢的原則相同:所有擁有虛擬服務的服務器資源容量應該相近。值得注意的是,在流量較低的配置環境中,各服務器的流量並不是相同的,會優先考慮第一台服務器。這是因為,如果所有的服務器是相同的,那么第一個服務器優先,直到第一台服務器有連續的活躍流量,否則總是會優先選擇第一台服務器。

在實際項目設計與建設過程中,可使用LVS+NGINX+TOMCAT實現了軟硬結合的負載均衡模式,四層負載使用LVS軟件,七層負載使用Nginx實現。整體架構設計如下圖所示

 

 

搭建基於LVS的集群服務器,,LVS服務器通過輪詢算法把將用戶請求平均分發至nginx集群服務器當中,這一層如果服務器性能一致,采用輪詢算法,保證訪問請求均勻分攤至集群機器當中,LVS是一個虛擬的四層交換器集群系統,根據目標地址和目標端口實現用戶請求轉發,本身不產生流量,只做用戶請求轉發,目前是負載均衡性能最好的集群系統,實現了很好可伸縮性,節點數目可以增長到幾千,甚至幾萬。這樣第一次的壓力分攤與負載均衡執行完畢;

在nginx集群當中我們通過反向代理+加權輪詢的模式,把客戶端請求根據應用服務器的性能進行加權輪詢,分攤至不同應用服務器上,首先我們把應用服務器集群中的服務器按照性能依次進行加權,性能越高的服務器加權比重越大,同時對nginx進行配置, 這樣一方面分攤了服務壓力,也能夠最大化的釋放服務器的性能。這樣就在應用服務的前面進行了第二次的負載均衡,Nginx是一種非常靈活的反向代理軟件,可以自由定制化轉發策略,分配服務器流量的權重等,反向代理服務的核心工作主要是轉發HTTP請求,Nginx扮演了瀏覽器端和后台Web服務器中轉的角色。因為它工作在HTTP層(應用層),也就是網絡七層結構中的第七層,因此也被稱為“七層負載均衡”。反向代理中,常見的一個問題,就是Web服務器存儲的session數據,因為一般負載均衡的策略都是隨機分配請求的。同一個登錄用戶的請求,無法保證一定分配到相同的Web機器上,會導致無法找到session的問題。我們在項目一般將session、token等需要保持的會話信息存儲在了redis當中,從而滿足負載均衡的分布式存儲要求。

上述負載均衡架構及算法策略,結構清晰,實現和部署相對簡單,疊加且充分發揮了LVS+NGINX的性能優勢,LVS通過輪詢算法對訪問請求進行了初步負載均衡,NGINX通過負加權輪詢算法結合服務器的性能對訪問請求進行了二次負載均衡,可有效保證高並發壓力下的服務性能與可用性。以上就是負載均衡在web系統開發中的一般應用,本文內容只是一個基本總結,其中如有不足與不正確的地方還望指正與海涵,十分感謝。

 

關注微信公眾號,查看更多技術文章。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM