負載均衡備註一

注:轉載自http://tangfeng.iteye.com/blog/433011

一 、LVS總共有8種調度算法。
1. 輪叫調度(Round Robin Scheduling)
是以輪叫的方式依次將請求調度不同的服務器,即每次調度執行i = (i + 1) % n,並選出第i臺服務器。在系統實現時,引入了一個額外條件,當服務器的權值爲零時,表示該服務器不可用而不被調度。這樣做的目的是將服務器切出服務(如屏蔽服務器故障,系統維護)。它的算法流程如下:
假設有一組服務器S = {S0, S1, …, Sn-1},一個指示變量i表示上一次選擇的服務器,W(Si)表示服務器Si的權值。變量i被初始化爲n-1,其中n > 0。
int j = i;
do {
j = (j + 1) % n;
if (W(Sj) > 0) {
i = j;
return Si;
}
} while (j != i);
return null;

輪叫調度算法假設所有服務器處理性能均相同,不管服務器的當前連接數和響應速度。該算法相對簡單,[color=red]不適用於服務器組中處理性能不一的情況[/color],而且當請求服務時間變化比較大時,輪叫調度算法容易導致服務器間的負載不平衡。

2. 加權輪叫調度(Weighted Round-Robin Scheduling)
可以解決服務器間性能不一的情況,它用相應的權值表示服務器的處理性能,服務器的缺省權值爲1。假設服務器A的權值爲1,B的權值爲2,則表示服務器B的處理性能是A的兩倍。加權輪叫調度算法是按權值的高低和輪叫方式分配請求到各服務器。權值高的服務器先收到的連接,權值高的服務器比權值低的服務器處理更多的連接,相同權值的服務器處理相同數目的連接數。加權輪叫調度算法流程如下:
假設有一組服務器S = {S0, S1, …, Sn-1},W(Si)表示服務器Si的權值,一個
指示變量i表示上一次選擇的服務器,指示變量cw表示當前調度的權值,max(S)
表示集合S中所有服務器的最大權值,gcd(S)表示集合S中所有服務器權值的最大
公約數。變量i和cw最初都被初始化爲零。
while (true) {
if (i == 0) {
cw = cw - gcd(S);
if (cw <= 0) {
cw = max(S);
if (cw == 0)
return null;
}
} else i = (i + 1) % n;
if (W(Si) >= cw)
return Si;
}

例如,有三個服務器A、B和C分別有權值4、3和2,則在一個調度週期內(mod sum(W(Si)))調度序列爲AABABCABC。加權輪叫調度算法還是比較簡單和高效。當請求的服務時間變化很大,單獨的加權輪叫調度算法依然會導致服務器間的負載不平衡。

從上面的算法流程中,我們可以看出當服務器的權值爲零時,該服務器不被被調度;當所有服務器的權值爲零,即對於任意i有W(Si)=0,則沒有任何服務器可用,算法返回NULL,所有的新連接都會被丟掉。加權輪叫調度也無需記錄當前所有連接的狀態,所以它也是一種無狀態調度。

3. 最小連接調度(Least-Connection Scheduling)

是把新的連接請求分配到當前連接數最小的服務器。最小連接調度是一種動態調度算法,它通過服務器當前所活躍的連接數來估計服務器的負載情況。調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺服務器,其連接數加1;當連接中止或超時,其連接數減一。在系統實現時,也引入當服務器的權值爲零時,表示該服務器不可用而不被調度,它的算法流程如下:
假設有一組服務器S = {S0, S1, ..., Sn-1},W(Si)表示服務器Si的權值,
C(Si)表示服務器Si的當前連接數。
for (m = 0; m < n; m++) {
if (W(Sm) > 0) {
for (i = m+1; i < n; i++) {
if (W(Si) <= 0)
continue;
if (C(Si) < C(Sm))
m = i;
}
return Sm;
}
}
return null;

當各個服務器有相同的處理性能時,最小連接調度算法能把負載變化大的請求分佈平滑到各個服務器上,所有處理時間比較長的請求不可能被髮送到同一臺服務器上。但是,當各個服務器的處理能力不同時,該算法並不理想,因爲TCP連接處理請求後會進入TIME_WAIT狀態,TCP的TIME_WAIT一般爲2分鐘,此時連接還佔用服務器的資源,所以會出現這樣情形,性能高的服務器已處理所收到的連接,連接處於TIME_WAIT狀態,而性能低的服務器已經忙於處理所收到的連接,還不斷地收到新的連接請求。

4. 加權最小連接調度(Weighted Least-Connection Scheduling)
是最小連接調度的超集,各個服務器用相應的權值表示其處理性能。服務器的缺省權值爲1,系統管理員可以動態地設置服務器的權值。加權最小連接調度在調度新連接時儘可能使服務器的已建立連接數和其權值成比例。加權最小連接調度的算法流程如下:
假設有一組服務器S = {S0, S1, ..., Sn-1},W(Si)表示服務器Si的權值,C(Si)表示服務器Si的當前連接數。所有服務器當前連接數的總和爲
CSUM = ΣC(Si) (i=0, 1, .. , n-1)。
當前的新連接請求會被髮送服務器Sm,當且僅當服務器Sm滿足以下條件
(C(Sm)/CSUM)/W(Sm) = min{ (C(Si)/CSUM)/W(Si)} (i=0, 1, . , n-1) 其中W(Si)不爲零
因爲CSUM在這一輪查找中是個常數,所以判斷條件可以簡化爲
C(Sm)/W(Sm) = min{ C(Si)/W(Si)} (i=0, 1, . , n-1) 其中W(Si)不爲零
因爲除法所需的CPU週期比乘法多,且在Linux內核中不允許浮點除法,服務器的權值都大於零,所以判斷條件C(Sm)/W(Sm) > C(Si)/W(Si) 可以進一步優化爲C(Sm)*W(Si) > C(Si)* W(Sm)。同時保證服務器的權值爲零時,服務器不被調度。所以,算法只要執行以下流程。
for (m = 0; m < n; m++) {
if (W(Sm) > 0) {
for (i = m+1; i < n; i++) {
if (C(Sm)*W(Si) > C(Si)*W(Sm))
m = i;
}
return Sm;
}
}
return null;


5. 基於局部性的最少鏈接調度 (Locality-Based Least Connections Schedulin
是針對請求報文的目標IP地址的負載均衡調度,目前主要用於Cache集羣系統,因爲在Cache集羣中客戶請求報文的目標IP地址是變化的。這裏假設任何後端服務器都可以處理任一請求,算法的設計目標是在服務器的負載基本平衡情況下,將相同目標IP地址的請求調度到同一臺服務器,來提高各臺服務器的訪問局部性和主存Cache命中率,從而整個集羣系統的處理能力。

LBLC 調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於其一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。該算法的詳細流程如下:
假設有一組服務器S = {S0, S1, ..., Sn-1},W(Si)表示服務器Si的權值,C(Si)表示服務器Si的當前連接數。ServerNode[dest_ip]是一個關聯變量,表示目標IP地址所對應的服務器結點,一般來說它是通過Hash表實現的。WLC(S)表示在集合S中的加權最小連接服務器,即前面的加權最小連接調度。Now爲當前系統時間。
if (ServerNode[dest_ip] is null) then {
n = WLC(S);
if (n is null) then return null;
ServerNode[dest_ip].server = n;
} else {
n = ServerNode[dest_ip].server;
if ((n is dead) OR
(C(n) > W(n) AND
there is a node m with C(m) < W(m)/2))) then {
n = WLC(S);
if (n is null) then return null;
ServerNode[dest_ip].server = n;
}
}
ServerNode[dest_ip].lastuse = Now;
return n;


6. 帶複製的基於局部性最少鏈接調度

帶複製的基於局部性最少鏈接調度(Locality-Based Least Connections with Replication Scheduling,以下簡稱爲LBLCR)算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。對於一個“熱門”站點的服務請求,一臺Cache 服務器可能會忙不過來處理這些請求。這時,LBLC調度算法會從所有的Cache服務器中按“最小連接”原則選出一臺Cache服務器,映射該“熱門”站點到這臺Cache服務器,很快這臺Cache服務器也會超載,就會重複上述過程選出新的Cache服務器。這樣,可能會導致該“熱門”站點的映像會出現在所有的Cache服務器上,降低了Cache服務器的使用效率。LBLCR調度算法將“熱門”站點映射到一組Cache服務器(服務器集合),當該“熱門”站點的請求負載增加時,會增加集合裏的Cache服務器,來處理不斷增長的負載;當該“熱門”站點的請求負載降低時,會減少集合裏的Cache服務器數目。這樣,該“熱門”站點的映像不太可能出現在所有的Cache服務器上,從而提供Cache集羣系統的使用效率。

LBLCR 算法先根據請求的目標IP地址找出該目標IP地址對應的服務器組;按“最小連接”原則從該服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載;則按“最小連接”原則從整個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低複製的程度。LBLCR調度算法的流程如下:
假設有一組服務器S = {S0, S1, ..., Sn-1},W(Si)表示服務器Si的權值,C(Si)表示服務器Si的當前連接數。ServerSet[dest_ip]是一個關聯變量,表示目標IP地址所對應的服務器集合,一般來說它是通過Hash表實現的。WLC(S)表示在集合S中的加權最小連接服務器,即前面的加權最小連接調度;WGC(S)表示在集合S中的加權最大連接服務器。Now爲當前系統時間,lastmod表示集合的最近修改時間,T爲對集合進行調整的設定時間。
if (ServerSet[dest_ip] is NULL) then {
n = WLC(S);
if (n is NULL) then return NULL;
add n into ServerSet[dest_ip];
} else {
n = WLC(ServerSet[dest_ip]);
if ((n is NULL) OR
(n is dead) OR
(C(n) > W(n) AND
there is a node m with C(m) < W(m)/2))) then {
n = WLC(S);
if (n is NULL) then return NULL;
add n into ServerSet[dest_ip];
} else
if (|ServerSet[dest_ip]| > 1 AND
Now - ServerSet[dest_ip].lastmod > T) then {
m = WGC(ServerSet[dest_ip]);
remove m from ServerSet[dest_ip];
}
}
ServerSet[dest_ip].lastuse = Now;
if (ServerSet[dest_ip] changed) then
ServerSet[dest_ip].lastmod = Now;
return n;


7. 目標地址散列調度

目標地址散列調度(Destination Hashing Scheduling)算法也是針對目標IP地址的負載均衡,但它是一種靜態映射算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。該算法的流程如下:
假設有一組服務器S = {S0, S1, ..., Sn-1},W(Si)表示服務器Si的權值,C(Si)表示服務器Si的當前連接數。ServerNode[]是一個有256個桶(Bucket)的Hash表,一般來說服務器的數目會運小於256,當然表的大小也是可以調整的。算法的初始化是將所有服務器順序、循環地放置到ServerNode表中。若服務器的連接數目大於2倍的權值,則表示服務器已超載。
n = ServerNode[hashkey(dest_ip)];
if ((n is dead) OR
(W(n) == 0) OR
(C(n) > 2*W(n))) then
return NULL;
return n;


8. 源地址散列調度

源地址散列調度(Source Hashing Scheduling)算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。它採用的散列函數與目標地址散列調度算法的相同。它的算法流程與目標地址散列調度算法的基本相似,除了將請求的目標IP地址換成請求的源IP地址。

在實際應用中,源地址散列調度和目標地址散列調度可以結合使用在防火牆集羣中,它們可以保證整個系統的唯一出入口。
發佈了19 篇原創文章 · 獲贊 0 · 訪問量 2927
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章