1. 程式人生 > >應用負載均衡之LVS(五):加權調度算法的規律

應用負載均衡之LVS(五):加權調度算法的規律

log 示例 html bsp 先後 分享圖片 一次 表示 cdb

返回LVS系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html

加權調度算法是一種很常見的調度算法。如果只有兩個後端,調度的順序很容易,但是如果後端多於2個,可能就不像想象中那樣的順序進行調度。

所以,本文揭秘加權調度算法到底是怎麽進行調度的。

1.加權調度算法公式

首先,給一個LVS官方手冊給的加權調度算法公式:

假設有一組服務器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;
}

比如,A、B、C三個後端的權重比是2:3:4,那麽一個調度循環內的調度順序是CBCABCABC。

如果你不想從算法公式裏找規律,那麽看下面。

2.加權調度通俗規律

記住三個權重調度規則:
1.先約分
2.從最大權重開始調度
3.同權重的後端,從前向後調度

例如,三臺後端A:B:C=2:3:4。這裏沒法約分。

  1. 調度C
    調度之後,比率變成A:B:C=2:3:3,B和C權重相同,從B開始調度
  2. 調度B
    調度之後,比率變成A:B:C=2:2:3,所以下次調度C
  3. 調度C
    調度之後,比率變成A:B:C=2:2:2,下次從A開始
    當權重全部調整到相同值時,就按照先後順序不斷循環,直到調度完所有權重
  4. 調度A,調度之後,比率變成A:B:C=1:2:2
  5. 調度B,調度之後,比率變成A:B:C=1:1:2
  6. 調度C,調度之後,比率變成A:B:C=1:1:1
  7. 調度A,調度之後,比率變成A:B:C=0:1:1
  8. 調度B,調度之後,比率變成A:B:C=0:0:1
  9. 調度C,調度之後,比率變成A:B:C=0:0:0
  10. 進入下一個調度循環,順序是:CBCABCABC

所以,每個調度循環的調度順序為:CBCABCABC

調度過程如下圖:

技術分享圖片

再給個示例,A:B:C:D=2:4:6:8

首先約分,得到A:B:C:D=1:2:3:4

  1. 調度D
  2. 調度C
  3. 調度D
  4. 調度B
  5. 調度C
  6. 調度D
  7. 調度A
  8. 調度B
  9. 調度C
  10. 調度D

所以,調度順序是DCDBCDABCD。

應用負載均衡之LVS(五):加權調度算法的規律