   
-
積分
-
862
-
帖子
-
161
-
精華
-
11
-
經驗
-
584 點
-
威望
-
0 點
-
金幣
-
458
|
Linux服務器集羣系統(四) LVS集羣的負載調度 本文主要講述了LVS集羣的IP負載均衡軟件IPVS在內核中實現的各類鏈接調度算法。針對請求的服務時間變化很大,給出一個動態反饋負載均衡算法,它結合內核中的加權鏈接調度算法,根據動態反饋回來的負載信息來調整服務器的權值,來進一步避免服務器間的負載不平衡。 前言 在上一篇文章中,咱們主要講述了LVS集羣中實現的三種IP負載均衡技術,它們主要解決系統的可伸縮性和透明性問題,如何經過負載調度器將請求高效地分發 到不一樣的服務器執行,使得由多臺獨立計算機組成的集羣系統成爲一臺虛擬服務器;客戶端應用程序與集羣系統交互時,就像與一臺高性能的服務器交互同樣。 本文將主要講述在負載調度器上的負載調度策略和算法,如何將請求流調度到各臺服務器,使得各臺服務器儘量地保持負載均衡。文章主要由兩個部分組成。第一 部分描述IP負載均衡軟件IPVS在內核中所實現的各類鏈接調度算法;第二部分給出一個動態反饋負載均衡算法(Dynamic-feedback load balancing),它結合內核中的加權鏈接調度算法,根據動態反饋回來的負載信息來調整服務器的權值,來進一步避免服務器間的負載不平衡。 在下面描述中,咱們稱客戶的socket和服務器的socket之間的數據通信爲鏈接,不管它們是使用TCP仍是UDP協議。對於UDP數據報文的調 度,IPVS調度器也會爲之創建調度記錄並設置超時值(如5分鐘);在設定的時間內,來自同一地址(IP地址和端口)的UDP數據包會被調度到同一臺服務 器。 內核中的鏈接調度算法 IPVS 在內核中的負載均衡調度是以鏈接爲粒度的。在HTTP協議(非持久)中,每一個對象從WEB服務器上獲取都須要創建一個TCP鏈接,同一用戶的不一樣請求會被 調度到不一樣的服務器上,因此這種細粒度的調度在必定程度上能夠避免單個用戶訪問的突發性引發服務器間的負載不平衡。 在內核中的鏈接調度算法上,IPVS已實現瞭如下八種調度算法: * 輪叫調度(Round-Robin Scheduling) * 加權輪叫調度(Weighted Round-Robin Scheduling) * 最小鏈接調度(Least-Connection Scheduling) * 加權最小鏈接調度(Weighted Least-Connection Scheduling) * 基於局部性的最少連接(Locality-Based Least Connections Scheduling) * 帶複製的基於局部性最少連接(Locality-Based Least Connections with Replication Scheduling) * 目標地址散列調度(Destination Hashing Scheduling) * 源地址散列調度(Source Hashing Scheduling) 下面,咱們先介紹這八種鏈接調度算法的工做原理和算法流程,會在之後的文章中描述怎麼用它們。 輪叫調度 輪叫調度(Round Robin Scheduling)算法就是以輪叫的方式依次將請求調度不一樣的服務器,即每次調度執行i = (i + 1) mod n,並選出第i臺服務器。算法的優勢是其簡潔性,它無需記錄當前全部鏈接的狀態,因此它是一種無狀態調度。 在系統實現時,咱們引入了一個額外條件,當服務器的權值爲零時,表示該服務器不可用而不被調度。這樣作的目的是將服務器切出服務(如屏蔽服務器故障和系統維護),同時與其餘加權算法保持一致。因此,算法要做相應的改動,它的算法流程以下: 輪叫調度算法流程
假設有一組服務器S = {S0, S1, …, Sn-1},一個指示變量i表示上一次選擇的
服務器,W(Si)表示服務器Si的權值。變量i被初始化爲n-1,其中n > 0。
j = i;
do {
j = (j + 1) mod n;
if (W(Sj) > 0) {
i = j;
return Si;
}
} while (j != i);
return NULL;
輪叫調度算法假設全部服務器處理性能均相同,無論服務器的當前鏈接數和響應速度。該算法相對簡單,不適用於服務器組中處理性能不一的狀況,並且當請求服務時間變化比較大時,輪叫調度算法容易致使服務器間的負載不平衡。 雖然Round-Robin DNS方法也是以輪叫調度的方式將一個域名解析到多個IP地址,但輪叫DNS方法的調度粒度是基於每一個域名服務器的,域名服務器對域名解析的緩存會妨礙輪 叫解析域名生效,這會致使服務器間負載的嚴重不平衡。這裏,IPVS輪叫調度算法的粒度是基於每一個鏈接的,同一用戶的不一樣鏈接都會被調度到不一樣的服務器 上,因此這種細粒度的輪叫調度要比DNS的輪叫調度優越不少。 加權輪叫調度 加權輪叫調度(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) mod n;
if (W(Si) >= cw)
return Si;
}
例如,有三個服務器A、B和C分別有權值四、3和2,則在一個調度週期內(mod sum(W(Si)))調度序列爲AABABCABC。加權輪叫調度算法仍是比較簡單和高效。當請求的服務時間變化很大,單獨的加權輪叫調度算法依然會致使服務器間的負載不平衡。 從上面的算法流程中,咱們能夠看出當服務器的權值爲零時,該服務器不被被調度;當全部服務器的權值爲零,即對於任意i有W(Si)=0,則沒有任何服務器 可用,算法返回NULL,全部的新鏈接都會被丟掉。加權輪叫調度也無需記錄當前全部鏈接的狀態,因此它也是一種無狀態調度。 最小鏈接調度 最小鏈接調度(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狀態,而性能低的服務器已經忙於 處理所收到的鏈接,還不斷地收到新的鏈接請求。 加權最小鏈接調度 加權最小鏈接調度(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;
基於局部性的最少連接調度 基於局部性的最少連接調度(Locality-Based Least Connections Scheduling,如下簡稱爲LBLC)算法是針對請求報文的目標IP地址的負載均衡調度,目前主要用於Cache集羣系統,由於在Cache集羣中 客戶請求報文的目標IP地址是變化的。這裏假設任何後端服務器均可以處理任一請求,算法的設計目標是在服務器的負載基本平衡狀況下,將相同目標IP地址的 請求調度到同一臺服務器,來提升各臺服務器的訪問局部性和主存Cache命中率,從而整個集羣系統的處理能力。 LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在, 或者該服務器超載且有服務器處於其一半的工做負載,則用「最少連接」的原則選出一個可用的服務器,將請求發送到該服務器。該算法的詳細流程以下: LBLC調度算法流程
假設有一組服務器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;
此外,對關聯變量 ServerNode[dest_ip]要進行週期性的垃圾回收(Garbage Collection),將過時的目標IP地址到服務器關聯項進行回收。過時的關聯項是指哪些當前時間(實現時採用系統時鐘節拍數jiffies)減去最 近使用時間超過設定過時時間的關聯項,系統缺省的設定過時時間爲24小時。 帶複製的基於局部性最少連接調度 帶複製的基於局部性最少連接調度(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調度算法的流程以下: 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;
此外,對關聯變量 ServerSet[dest_ip]也要進行週期性的垃圾回收(Garbage Collection),將過時的目標IP地址到服務器關聯項進行回收。過時的關聯項是指哪些當前時間(實現時採用系統時鐘節拍數jiffies)減去最 近使用時間(lastuse)超過設定過時時間的關聯項,系統缺省的設定過時時間爲24小時。 目標地址散列調度 目標地址散列調度(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;
在實現時,咱們採用素數乘法Hash函數,經過乘以素數使得散列鍵值儘量地達到較均勻的分佈。所採用的素數乘法Hash函數以下: 素數乘法Hash函數
static inline unsigned hashkey(unsigned int dest_ip)
{
return (dest_ip* 2654435761UL) & HASH_TAB_MASK;
}
其中,2654435761UL是2到2^32 (4294967296)間接近於黃金分割的素數,
(sqrt(5) - 1) / 2 = 0.618033989
2654435761 / 4294967296 = 0.618033987
源地址散列調度 源地址散列調度(Source Hashing Scheduling)算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。它採用的散列函數與目標地址散列調度算法 的相同。它的算法流程與目標地址散列調度算法的基本類似,除了將請求的目標IP地址換成請求的源IP地址,因此這裏不一一敘述。 在實際應用中,源地址散列調度和目標地址散列調度能夠結合使用在防火牆集羣中,它們能夠保證整個系統的惟一出入口。 動態反饋負載均衡算法 動態反饋負載均衡算法考慮服務器的實時負載和響應狀況,不斷調整服務器間處理請求的比例,來避免有些服務器超載時依然收到大量請求,從而提升整個系統的吞 吐率。圖1顯示了該算法的工做環境,在負載調度器上運行Monitor Daemon進程,Monitor Daemon來監視和收集各個服務器的負載信息。Monitor Daemon可根據多個負載信息算出一個綜合負載值。Monitor Daemon將各個服務器的綜合負載值和當前權值算出一組新的權值,若新權值和當前權值的差值大於設定的閥值,Monitor Daemon將該服務器的權值設置到內核中的IPVS調度中,而在內核中鏈接調度通常採用加權輪叫調度算法或者加權最小鏈接調度算法。 動態反饋負載均衡算法的工做環境 鏈接調度 當客戶經過TCP鏈接訪問網絡訪問時,服務所需的時間和所要消耗的計算資源是千差萬別的,它依賴於不少因素。例如,它依賴於請求的服務類型、當前網絡帶寬 的狀況、以及當前服務器資源利用的狀況。一些負載比較重的請求須要進行計算密集的查詢、數據庫訪問、很長響應數據流;而負載比較輕的請求每每只須要讀一個 HTML頁面或者進行很簡單的計算。 請求處理時間的千差萬別可能會致使服務器利用的傾斜(Skew),即服務器間的負載不平衡。例如,有一個WEB頁面有A、B、C和D文件,其中D是大圖像 文件,瀏覽器須要創建四個鏈接來取這些文件。當多個用戶經過瀏覽器同時訪問該頁面時,最極端的狀況是全部D文件的請求被髮到同一臺服務器。因此說,有可能 存在這樣狀況,有些服務器已經超負荷運行,而其餘服務器基本是閒置着。同時,有些服務器已經忙不過來,有很長的請求隊列,還不斷地收到新的請求。反過來 說,這會致使客戶長時間的等待,以爲系統的服務質量差。 簡單鏈接調度 簡單鏈接調度可能會使得服務器傾斜的發生。在上面的例子中,若採用輪叫調度算法,且集羣中正好有四臺服務器,必有一臺服務器老是收到D文件的請求。這種調度策略會致使整個系統資源的低利用率,由於有些資源被用盡致使客戶的長時間等待,而其餘資源空閒着。 實際TCP/IP流量的特徵 文獻[1]說明網絡流量是呈波浪型發生的,在一段較長時間的小流量後,會有一段大流量的訪問,而後是小流量,這樣跟波浪同樣週期性地發生。文獻 [2,3,4,5]揭示在WAN和LAN上網絡流量存在自類似的特徵,在WEB訪問流也存在自類似性。這就須要一個動態反饋機制,利用服務器組的狀態來應 對訪問流的自類似性。 動態反饋負載均衡機制 TCP/IP流量的特徵通俗地說是有許多短事務和一些長事務組成,而長事務的工做量在整個工做量佔有較高的比例。因此,咱們要設計一種負載均衡算法,來避免長事務的請求總被分配到一些機器上,而是儘量將帶有毛刺(Burst)的分佈分割成相對較均勻的分佈。 咱們提出基於動態反饋負載均衡機制,來控制新鏈接的分配,從而控制各個服務器的負載。例如,在IPVS調度器的內核中使用加權輪叫調度(Weighted Round-Robin Scheduling)算法來調度新的請求鏈接;在負載調度器的用戶空間中運行Monitor Daemon。Monitor Daemon定時地監視和收集各個服務器的負載信息,根據多個負載信息算出一個綜合負載值。Monitor Daemon將各個服務器的綜合負載值和當前權值算出一組新的權值。當綜合負載值表示服務器比較忙時,新算出的權值會比其當前權值要小,這樣新分配到該服 務器的請求數就會少一些。當綜合負載值表示服務器處於低利用率時,新算出的權值會比其當前權值要大,來增長新分配到該服務器的請求數。若新權值和當前權值 的差值大於設定的閥值,Monitor Daemon將該服務器的權值設置到內核中的IPVS調度中。過了必定的時間間隔(如2秒鐘),Monitor Daemon再查詢各個服務器的狀況,並相應調整服務器的權值;這樣週期性地進行。能夠說,這是一個負反饋機制,使得服務器保持較好的利用率。 在加權輪叫調度算法中,當服務器的權值爲零,已創建的鏈接會繼續獲得該服務器的服務,而新的鏈接不會分配到該服務器。系統管理員能夠將一臺服務器的權值設 置爲零,使得該服務器安靜下來,當已有的鏈接都結束後,他能夠將該服務器切出,對其進行維護。維護工做對系統都是不可少的,好比硬件升級和軟件更新等,零 權值使得服務器安靜的功能很主要。因此,在動態反饋負載均衡機制中咱們要保證該功能,當服務器的權值爲零時,咱們不對服務器的權值進行調整。 綜合負載 在計算綜合負載時,咱們主要使用兩大類負載信息:輸入指標和服務器指標。輸入指標是在調度器上收集到的,而服務器指標是在服務器上的各類負載信息。咱們用 綜合負載來反映服務器當前的比較確切負載狀況,對於不一樣的應用,會有不一樣的負載狀況,這裏咱們引入各個負載信息的係數,來表示各個負載信息在綜合負載中輕 重。系統管理員根據不一樣應用的需求,調整各個負載信息的係數。另外,系統管理員設置收集負載信息的時間間隔。 輸入指標主要是在單位時間內服務器收到新鏈接數與平均鏈接數的比例,它是在調度器上收集到的,因此這個指標是對服務器負載狀況的一個估計值。在調度器上有 各個服務器收到鏈接數的計數器,對於服務器Si,能夠獲得分別在時間T1和T2時的計數器值Ci1和Ci2,計算出在時間間隔T2-T1內服務器Si收到 新鏈接數Ni = Ci2 - Ci1。這樣,獲得一組服務器在時間間隔T2-T1內服務器Si收到新鏈接數{Ni},服務器Si的輸入指標INPUTi爲其新鏈接數與n臺服務器收到平 均鏈接數的比值,其公式爲 服務器指標主要記錄服務器各類負載信息,如服務器當前CPU負載LOADi、服務器當前磁盤使用狀況Di、當前內存利用狀況Mi和當前進程數目Pi。有兩 種方法能夠得到這些信息;一是在全部的服務器上運行着SNMP(Simple Network Management Protocol)服務進程,而在調度器上的Monitor Daemon經過SNMP向各個服務器查詢得到這些信息;二是在服務器上實現和運行收集信息的Agent,由Agent定時地向Monitor Daemon報告負載信息。若服務器在設定的時間間隔內沒有響應,Monitor Daemon認爲服務器是不可達的,將服務器在調度器中的權值設置爲零,不會有新的鏈接再被分配到該服務器;若在下一次服務器有響應,再對服務器的權值進 行調整。再對這些數據進行處理,使其落在[0, ∞)的區間內,1表示負載正好,大於1表示服務器超載,小於1表示服務器處於低負載狀態。得到調整後的數據有DISKi、MEMORYi和 PROCESSi。 另外一個重要的服務器指標是服務器所提供服務的響應時間,它能比較好地反映服務器上請求等待隊列的長度和請求的處理時間。調度器上的Monitor Daemon做爲客戶訪問服務器所提供的服務,測得其響應時間。例如,測試從WEB服務器取一個HTML頁面的響應延時,Monitor Daemon只要發送一個「GET /」請求到每一個服務器,而後記錄響應時間。若服務器在設定的時間間隔內沒有響應,Monitor Daemon認爲服務器是不可達的,將服務器在調度器中的權值設置爲零。一樣,咱們對響應時間進行如上調整,獲得RESPONSEi。 這裏,咱們引入一組能夠動態調整的係數Ri來表示各個負載參數的重要程度,其中ΣRi = 1。綜合負載能夠經過如下公式計算出: 例如,在WEB服務器集羣中,咱們採用如下係數{0.1, 0.3, 0.1, 0.1, 0.1, 0.3},認爲服務器的CPU負載和請求響應時間較其餘參數重要一些。若當前的係數Ri不能很好地反映應用的負載,系統管理員能夠對係數不斷地修正,直到 找到貼近當前應用的一組係數。 另外,關於查詢時間間隔的設置,雖然很短的間隔能夠更確切地反映各個服務器的負載,可是很頻繁地查詢(如1秒鐘幾回)會給調度器和服務器帶來必定的負載, 如頻繁執行的Monitor Daemon在調度器會有必定的開銷,一樣頻繁地查詢服務器指標會服務器帶來必定的開銷。因此,這裏要有個折衷(Tradeoff),咱們通常建議將時間 間隔設置在5到20秒之間。 權值計算 當服務器投入集羣系統中使用時,系統管理員對服務器都設定一個初始權值DEFAULT_WEIGHTi,在內核的IPVS調度中也先使用這個權值。而後, 隨着服務器負載的變化,對權值進行調整。爲了不權值變成一個很大的值,咱們對權值的範圍做一個限制[DEFAULT_WEIGHTi, SCALE*DEFAULT_WEIGHTi],SCALE是能夠調整的,它的缺省值爲10。 Monitor Daemon週期性地運行,若DEFAULT_WEIGHTi不爲零,則查詢該服務器的各負載參數,並計算出綜合負載值AGGREGATE_LOADi。咱們引入如下權值計算公式,根據服務器的綜合負載值調整其權值。 在公式中,0.95是咱們想要達到的系統利用率,A是一個可調整的係數(缺省值爲5)。當綜合負載值爲0.95時,服務器權值不變;當綜合負載值大於 0.95時,權值變小;當綜合負載值小於0.95時,權值變大。若新權值大於SCALE*DEFAULT_WEIGHTi,咱們將新權值設爲 SCALE*DEFAULT_WEIGHTi。若新權值與當前權值的差別超過設定的閥值,則將新權值設置到內核中的IPVS調度參數中,不然避免打斷 IPVS調度的開銷。咱們能夠看出這是一個負反饋公式,會使得權值調整到一個穩定點,如系統達到理想利用率時,權值是不變的。 在實際使用中,若發現全部服務器的權值都小於他們的DEFAULT_WEIGHT,則說明整個服務器集羣處於超載狀態,這時須要加入新的服務器結點到集羣 中來處理部分負載;反之,若全部服務器的權值都接近於SCALE*DEFAULT_WEIGHT,則說明當前系統的負載都比較輕。 一個實現例子 咱們在RedHat集羣管理工具Piranha[6]中實現了一個簡單的動態反饋負載均衡算法。在綜合負載上,它只考慮服務器的CPU負載(Load Average),使用如下公式進行權值調整: 服務器權值調整區間爲[DEFAULT_WEIGHTi, 10*DEFAULT_WEIGHTi],A爲DEFAULT_WEIGHTi /2,而權值調整的閥值爲DEFAULT_WEIGHTi /4。1是所想要達到的系統利用率。Piranha每隔20秒查詢各臺服務器的CPU負載,進行權值計算和調整。 小結 本文主要講述了IP虛擬服務器在內核中實現的八種鏈接調度算法: * 輪叫調度(Round-Robin Scheduling) * 加權輪叫調度(Weighted Round-Robin Scheduling) * 最小鏈接調度(Least-Connection Scheduling) * 加權最小鏈接調度(Weighted Least-Connection Scheduling) * 基於局部性的最少連接(Locality-Based Least Connections Scheduling) * 帶複製的基於局部性最少連接(Locality-Based Least Connections with Replication Scheduling) * 目標地址散列調度(Destination Hashing Scheduling) * 源地址散列調度(Source Hashing Scheduling) 由於請求的服務時間差別較大,內核中的鏈接調度算法容易使得服務器運行出現傾斜。爲此,給出了一個動態反饋負載均衡算法,結合內核中的加權鏈接調度算法, 根據動態反饋回來的負載信息來調整服務器的權值,來調整服務器間處理請求數的比例,從而避免服務器間的負載不平衡。動態反饋負載算法能夠較好地避免服務器 的傾斜,提升系統的資源使用效率,從而提升系統的吞吐率。 |
|