探尋負載均衡器的算法和原理
在分析了負載均衡的算法種類之后,我們現在來介紹一下動態負載均衡。主要是通過對負載均衡器的介紹,來理解這個概念。基于加權輪詢的算法,我們可以擴展負載均衡的動態性能,那么,更加具體詳細的解釋,還是讓我們瀏覽文章吧。
動態反饋負載均衡
當客戶訪問集群資源時,提交的任務所需的時間和所要消耗的計算資源是千差萬別的,他依賴于很多因素。例如:任務請求的服務類型、當前網絡帶寬的情況、以及當前服務器資源利用的情況等等。一些負載比較重的任務需要進行計算密集的查詢、數據庫訪問、很長響應數據流;而負載比較輕的任務請求往往只需要讀一個小文件或者進行很簡單的計算。
對任務請求處理時間的不同可能會導致處理結點利用率的傾斜(Skew),即處理結點的負載不均衡。有可能存在這樣的情況,有些結點已經超負荷運行,而其他結點基本是閑置著。同時,有些結點已經忙不過28來,有很長的請求隊列,還不斷地收到新的請求。反過來說,這會導致客戶長時間的等待,而集群整體的服務質量下降。因此,有必要采用一種機制,使得負載均衡器能夠實時地了解各個結點的負載狀況,并能根據負載的變化做出調整。
具體的做法上采用了基于負反饋機制的動態負載均衡算法,該算法考慮每一個結點的實時負載和響應能力,不斷調整任務分布的比例,來避免有些結點超載時依然收到大量請求,從而提高單一集群的整體吞吐率。
在集群內,負載均衡器上運行服務端監控進程,監控進程負責監視和收集集群內各個結點的負載信息;而每個結點上運行客戶端進程,負責定時向負載均衡器報告自身的負載狀況。監控進程根據收到的全部結點的負載信息來進行同步操作,既對將要分配的任務按照權值的比例重新進行分布。權值的計算主要根據各個結點的 CPU利用率、可用內存以及磁盤I/O狀況計算出新的權值,若新權值和當前權值的差值大于設定的閥值,監控器采用新的權值對集群范圍內的任務重新進行分布,直到下一次的負載信息同步到來之前。負載均衡器可以配合動態權值,采用加權輪詢算法來對接受的網絡服務請求進行調度。
加權輪詢調度
加權輪詢調度(Weighted Round-Robin Scheduling)算法用相應的權值表示結點的處理性能。該算法根據權值的高低順序并按照輪詢的方式將任務請求分配到各結點。權值高的結點比權值低的結點處理更多的任務請求,相同權值的結點處理相同份額的請求。加權輪詢的基本原理可描述為:
假設某集群內有一組結點N={N0,N1,…,Nn-1},W(Ni)表示結點Ni的權值,一個指示變量i表示上一次選擇的服務器,T(Ni)表示結點Ni當前所分配的任務量。
∑T(Ni)表示當前同步周期需要處理的任務總量。
∑W(Ni)表示結點的權值總和。
則: W(Ni)/∑W(Ni)=T(Ni)/∑T(Ni)
表示任務的分配是按照各個結點權值占權值總數的比例來進行分配。
權值計算
當集群的結點初次投入系統中使用時,系統管理員根據結點的硬件配置情況對每個結點都設定一個初始權值DW(Ni)(通常根據結點的硬件配置來定義,硬件配置越高的結點默認值越高),在負載均衡器上也先使用這個權值。然后,隨著結點負載的變化,負載均衡器對權值進行調整。
動態權值是由結點運行時各方面的參數計算出來的。我們在實驗中選取了最重要的幾項,包括:CPU資源、內存資源、當前進程數、響應時間等信息作為計算公式的因子。結合每個結點當前的權值,可以計算出新的權值的大小。動態權值的目的是要正確反映結點負載的狀況,以預測結點將來可能的負載變化。對于不同類型的系統應用,各個參數的重要程度也有所不同。典型的Web應用環境下,可用內存資源和響應時間就非常重要;如果用戶以長的數據庫事務為主,則CPU使用率和可用內存就相對重要一些。為了方便在系統運行過程中針對不同的應用對各個參數的比例進行適當調整,我們為每一個參數設定一個常量系數Ri,用來表示各個負載參數的重要程度,其中∑Ri=1。因此,任何一個結點Ni的權值公式就可以描述為:
LOAD(Ni)=R1*Lcpu(Ni)+R2*Lmemory(Ni)+R3*Lio(Ni)+R4*Lprocess(Ni)+R5*Lresponse(Ni)
其中:Lf(Ni)表示結點Ni當前某一項參數的負載值。上述公式中依次表示為:CPU使用率、內存使用率、磁盤I/O訪問率、進程總數以及響應時間。
例如,在Web服務器集群中,我們采用以系數{0.1,0.4,0.1,0.1,0.3},這里認為服務器的內存和請求響應時間較其他參數重要一些。若當前的系數Ri不能很好地反映應用的負載,系統管理員可以對系數不斷地修正,直到找到貼近當前應用的一組系數。
另外,關于采集權值的周期值,雖然很短的周期可以更確切地反映各個結點的負載,但是很頻繁地采集(如1 s 1次或者多次)會給負載均衡器和結點帶來負擔,也可能增加不必要的網絡負荷。另外,由于采集器是在采集時刻進行負載計算的,經實驗證明,負載均衡器反映出來各個結點的負載信息會出現劇烈的抖動,負載均衡器無法準確捕捉結點真實的負載變化趨勢。因此解決這些問題,一方面要適當地調整采集負載信息的周期,一般在5~10 s;另一方面,可以使用移動均均線或者是滑動窗口來避免抖動,使得負載均衡器收集到的負載信息表現為均滑曲線,這樣在負反饋機制的調整效果上就會比較好。
負載均衡器的動態權值采集程序周期性地運行,若缺省權值不為0,則查詢該結點的各負載參數,并計算出動態權值LOAD(Ni)。我們引入以下權值計算公式,結合結點的初始權值和采集的動態權值來計算最終的權值結果。
Wi=A*DW(Ni)+B*(LOAD(Ni)-DW(Ni))1/3
在公式中,如果動態權值恰好等于初始權值,最終權值不變,則說明系統的負載狀況剛好達到理想狀況,等于初始權值DW(Ni)。如果動態權值計算結果高于初始權值,最終權值變高,則說明系統負載很輕,負載均衡器將會增加分配給該結點的任務比率。如果動態權值低于初始權值,最終權值變低,說明系統開始處于重載狀況,負載均衡器將會減少對該結點分配的任務。在實際使用中,若發現所有結點的權值都小于他們的DW(Ni),則說明當前個集群處于超載狀態,這時需要加入新的結點到集群中來處理部分負載;反之,若所有結點的權值大大高于DW(Ni),則說明當前系統的負載都比較輕。
結語
網絡負載均衡是集群作業調度系統的具體實現。由于其處理的作業單元是TCP/IP協議下的網絡連接,因此可以采用面向網絡連接的集中基本調度算法。考慮集群負載不均衡的可能,采取了動態獲取服務節點的權值并使用負反饋機制調整負載均衡器對網絡服務請求的分布,以適應服務節點在運行過程中資源的變化。實踐證明,采用動態均衡在集群系統的整體吞吐量方面有所提高,特別是在集群各個節點性能不一,集群提供的網絡服務程序所訪問的資源多樣化的情況下,負反饋機制的效果尤其明顯。在其他類型的集群中,負反饋機制的動態負載均衡也能夠得到很好的應用,只是負載均衡器所處理的作業單元不同于網絡連接,而具體的負載算法上也將有所不同。