Round-Robin輪詢調度法及其實現原理


輪詢調度算法(Round-Robin Scheduling)

  輪詢調度算法的原理是每一次把來自用戶的請求輪流分配給內部中的服務器,從1開始,直到N(內部服務器個數),然后重新開始循環。
  算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,所以它是一種無狀態調度。
  輪詢調度算法流程
  假設有一組服務器N台,S = {S1, S2, …, Sn},一個指示變量i表示上一次選擇的服務器ID。變量i被初始化為N-1。其算法如下:

j = i;
do { j = (j + 1) mod n; i = j; return Si; } while (j != i); return NULL;

  輪詢調度算法假設所有服務器的處理性能都相同,不關心每台服務器的當前連接數和響應速度。當請求服務間隔時間變化比較大時,輪詢調度算法容易導致服務器間的負載不平衡。
  所以此種均衡算法適合於服務器組中的所有服務器都有相同的軟硬件配置並且平均服務請求相對均衡的情況。

權重輪詢調度算法(Weighted Round-Robin Scheduling)

上面所講的輪詢調度算法並沒有考慮每台服務器的處理能力,在實際情況中,可能並不是這種情況。由於每台服務器的配置、安裝的業務應用等不同,其處理能力會不一樣。所以,我們根據服務器的不同處理能力,給每個服務器分配不同的權值,使其能夠接受相應權值數的服務請求。
  權重輪詢調度算法流程
  假設有一組服務器S = {S0, S1, …, Sn-1},W(Si)表示服務器Si的權值,一個指示變量i表示上一次選擇的服務器,指示變量cw表示當前調度的權值,max(S)表示集合S中所有服務器的最大權值,gcd(S)表示集合S中所有服務器權值的最大公約數。變量i初始化為-1,cw初始化為零。其算法如下:
  

while (true) { i = (i + 1) mod n; if (i == 0) { cw = cw - gcd(S); if (cw <= 0) { cw = max(S); if (cw == 0) return NULL; } } if (W(Si) >= cw) return Si; }

  這種算法的邏輯實現如圖2所示,圖中我們假定四台服務器的處理能力為3:1:1:1。
 

 由於權重輪詢調度算法考慮到了不同服務器的處理能力,所以這種均衡算法能確保高性能的服務器得到更多的使用率,避免低性能的服務器負載過重。所以,在實際應用中比較常見。

 

在分布式系統中,為了實現系統的高性能、高並發、高可用,在構架中都會進行負載均衡設計,它是分布式系統的核心和中樞,負載均衡的好壞直接影響着整個系統的性能。負載均衡分為軟件均衡和硬件均衡兩類,比如apache、nginx、dubbo 等屬於軟件負載均衡,F5屬於硬件負載均衡,當然他們都會使用到負載均衡算法。

常見的負載均衡算法包含:
1、輪詢法(Round Robin)
2、加權輪詢法(Weight Round Robin)
3、隨機法(Random)
4、加權隨機法(Weight Random)
5、平滑加權輪詢法(Smooth Weight Round Robin)
6、源地址哈希法(Hash)
7、最小連接數法(Least Connections)

接下來的博客中會一一介紹如上幾種算法,本文介紹輪詢法。

輪詢法是將請求按順序輪流地分配到服務器上,它均衡地對待后端的每一台服務器,而不關心服務器實際的連接數和當前的系統負載。

 

總結

  輪詢調度算法以及權重輪詢調度算法的特點是實現起來比較簡潔,並且實用。目前幾乎所有的負載均衡設備均提供這種功能。


免責聲明!

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



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