發新話題

網路負載平衡問題~

[已閱]

網路負載平衡問題~

網路負載平衡是分散式作業調度系統的一種實現,平衡器作為網路請求分配的控制者,要根據集群節點的當前處理能力,採用集中或分佈策略對網路服務請求進行調配,並且在每個服務請求的生命週期裏監控各個節點的有效狀態。
網路平衡原理
在TCP / IP 協定中,資料包含有必要的網路資訊,因而在網路緩存或網路平衡的具體實現演算法裏,資料包的資訊很重要,但由於資料包是面向分組的(IP)和面向連接的(TCP),且經常被分片,沒有與應用有關的完整資訊,特別是和連接會話相關的狀態資訊。因此必須從連接的角度看待資料包——從源地址的埠建立到目的地址埠的連接。
平衡考慮的另一個要素就是節點的資源使用狀態,由於負載平衡是這類系統的最終目的,那麼及時、準確的把握節點負載狀況,並根據各個節點當前的資源使用狀態動態調整負載平衡的任務分佈,是網路動態負載平衡集群系統考慮的另一關鍵問題。
一般情況下,集群的服務節點可以提供諸如處理器負載,應用系統負載、活躍用戶數、可用的網路協定緩存以及其他的資源資訊,資訊通過高效的消息機制傳給平衡器,平衡器監視所有處理節點的狀態,主動決定下個任務傳給誰,平衡器可以是單個設備,也可以使一組平行或樹狀分佈的設備。
基本的網路負載平衡演算法
平衡演算法設計的好壞直接決定了集群在負載均衡上的表現,設計不好的演算法,會導致集群的負載失衡,一般的平衡演算法主要任務是決定如何選擇下一個集群節點,然後將新的服務請求轉發給它,有些簡單平衡方法可以獨立使用,有些必須和其他簡單或高級方法組合使用,而一個好的負載均衡演算法也並不是萬能的,它一般只在某些特殊的應用環境下才能發揮最大效用,因此在考察負載均衡演算法的同時,也要注意演算法本身的適用面,並在採取集群部署的時候根據集群自身的特點進行綜合考慮,把不同的演算法和技術結合起來使用。

1 輪轉法
輪轉演算法是所有調度演算法中最簡單也最容易實現的一種方法,在一個任務佇列裏,佇列的每個成員(節點)都具有相同的地位,輪轉法簡單的在這組成員中順序輪轉選擇,在負載平衡環境中,等化器將新的請求輪流發給節點佇列中的下一節點,如此連續、週而復始,每個集群的節點都在相等的地位下被輪流選擇,這個演算法在 DNS 功能變數名稱輪詢中被廣泛使用, 輪轉法的活動是可預知的,每個節點被選擇的機會是1 / N,因此很容易計算出節點的負載分佈,輪轉法典型的適用於集群中所有節點的處理能力和性能均相同的情況,在實際應用中,一般將它與其他簡單方法聯合使用時比較有效。

2 散列法:
散列法也叫哈希法(HASH),通過單射不可逆的 HASH 函數,按照某種規則將網路請求發往集群節點,哈希法在其他幾類平衡演算法不是很有效時會顯示出特別的威力,例如,在前面提到的UDP 會話的情況下,由於輪轉法和其他幾類基於連接資訊的演算法,無法識別出會話的起止標記,會引起應用混亂, 而採取基於資料包源地址的哈希映射可以在一定程度上解決這個問題,將具有相同源位址的資料包發給同一伺服器節點,這使得基於高層會話的事務可以以適當的方式運行,相對稱的是,基於目的地址的哈希調度演算法可以用在Web Cache 集群中,指向同一個目標站點的訪問請求都被負載平衡器發送到同一個 Cache 服務節點上,以避免頁面缺失而帶來的更新 Cache 問題。

3 最少連接法
在最少連接法中,平衡器紀錄目前所有活躍連接,把下一個新的請求發給當前含有最少連接數的節點,這種演算法針對 TCP 連接進行,但由於不同應用對系統資源的消耗可能差異很大,而連接數無法反映出真實的應用負載,因此在使用重型 Web 伺服器作為集群節點服務時(例如 Apache 伺服器),該演算法在平衡負載的效果上要打個折扣,為了減少這個不利的影響,可以對每個節點設置最大的連接數上限(通過閾值設定體現)。

4 最低缺失法
在最低缺失法中,平衡器長期紀錄到各節點的請求情況,把下個請求發給歷史上處理請求最少的節點,與最少連接法不同的是,最低缺失記錄過去的連接數而不是當前的連接數。

5 最快回應法
平衡器記錄自身到每一個集群節點的網路回應時間,並將下一個到達的連接請求分配給回應時間最短的節點,這種方法要求使用ICMP包或基於UDP包的專用技術來主動探測各節點,在大多數基於LAN 的集群中,最快回應演算法工作的並不是很好,因為 LAN 中的 ICMP 包基本上都在10ms內完成回應,體現不出節點之間的差異,如果在WAN上進行平衡的話,回應時間對於用戶就近選擇伺服器而言還是具有現實意義的,而且集群的拓撲越分散這種方法越能體現出效果來,這種方法是高級平衡基於拓撲結構重定向用到的主要方法。

6 加權法
加權方法只能與其他方法合用,是它們的一個很好的補充,加權演算法根據節點的優先順序或當前的負載狀況(即權值)來構成負載平衡的多優先順序佇列,佇列中的每個等待處理的連接都具有相同處理等級,這樣在同一個佇列裏可以按照前面的輪轉法或者最少連接法進行均衡,而佇列之間按照優先順序的先後順序進行均衡處理,在這裏權值是基於各節點能力的一個估計值。
動態反饋負載均衡演算法當客戶訪問集群資源時,提交的任務所需的時間和所要消耗的計算資源是千差萬別的,它依賴於很多因素,例如:任務請求的服務類型、當前網路帶寬的情況、以及當前伺服器資源利用的情況等等,一些負載比較重的任務需要進行計算密集的查詢、資料庫訪問、很長回應資料流程;而負載比較輕的任務請求往往只需要讀一個小文件或者進行很簡單的計算。
對任務請求處理時間的不同可能會導致處理結點利用率的傾斜(Skew),即處理結點的負載不平衡,有可能存在這樣情況,有些結點已經超負荷運行,而其他結點基本是閒置著,同時,有些結點已經忙不過來,有很長的請求佇列,還不斷地收到新的請求,反過來說,這會導致客戶長時間的等待,而集群整體的服務質量下降,因此,有必要採用一種機制,使得平衡器能夠即時地瞭解各個結點的負載狀況,並能根據負載的變化做出調整。
具體的做法上採用了基於負反饋機制的動態負載均衡演算法,該演算法考慮每一個結點的即時負載和回應能力,不斷調整任務分佈的比例,來避免有些結點超載時依然收到大量請求,從而提高單一集群的整體吞吐率。
在集群內,負載等化器上運行服務端監控進程,監控進程負責監視和收集集群內各個結點的負載資訊,而每個結點上運行用戶端進程,負責定時向等化器報告自身的負載狀況,監控進程根據收到的全部結點的負載資訊來進行同步操作,既對將要分配的任務按照權值得比例重新進行分佈,權值得計算主要根據各個結點的 CPU 利用率、可用記憶體以及磁片 I / O 狀況計算出新的權值,若新權值和當前權值的差值大於設定的閥值,監控器採用新的權值對集群範圍內的任務重新進行分佈,直到下一次的負載資訊同步到來之前,等化器可以配合動態權值,採用加權輪詢演算法來對接受的網路服務請求進行調度。

1 加權輪詢調度
加權輪詢調度( Weighted Round-Robin Scheduling )演算法用相應的權值表示結點的處理性能,該演算法根據權值的高低順序並按照輪詢的方式將任務請求分配到各結點,權值高的結點比權值低的結點處理更多的任務請求,相同權值的結點處理相同份額的請求。

2 權值計算
當集群的結點初次投入系統中使用時,系統管理員根據結點的硬體配置情況對每個結點都設定一個初始權值DW(Ni)(通常根據結點的硬體配置來定義,硬體配置越高的結點預設值越高),在負載等化器上也先使用這個權值,然後,隨著結點負載的變化,等化器對權值進行調整。
動態權值是由結點運行時各方面的參數計算出來的,我們在實驗中選取了最重要幾項,包括:CPU 資源,記憶體資源,當前進程數,回應時間等資訊作為計算公式的因數,結合每個結點當前的權值,可以計算出新的權值的大小,動態權值目的是要正確反映結點負載的狀況,以預測結點將來可能的負載變化,對於不同類型的系統應用,各個參數的重要程度也有所不同,典型的Web應用環境下,可用記憶體資源和回應時間就非常重要,如果用戶以長的資料庫事務為主,則CPU使用率和可用記憶體就相對重要一些,為了方便在系統運行過程中針對不同的應用對各個參數的比例進行適當調整,我們為每一個參數設定一個常量係數 Ri ,用來來表示各個負載參數的重要程度,其中Σ Ri = 1。
另外,關於採集權值的週期置,雖然很短的週期可以更確切地反映各個結點的負載,但是很頻繁地採集(如1秒1次或者多次)會給等化器和結點帶來負擔,也可能增加不必要的網路負荷,另外,由於採集器是在採集時刻進行負載計算的,經實驗證明,等化器反映出來各個結點的負載資訊會出現劇烈的抖動,等化器無法準確捕捉結點真實的負載變化趨勢,因此解決這些問題,一方面要適當地調整採集負載資訊的週期,一般在5~10秒,另一方面,可以使用移動平均線或者是滑動視窗來避免抖動,使得等化器收集到的負載資訊表現平滑曲線,這樣在負反饋機制的調整效果上就會比較好。
等化器的動態權值採集程式週期性地運行,若缺省權值不規零,則查詢該結點的各負載參數,並計算出動態權值 LOAD ( Ni ) ,我們引入以下權值計算公式,結合結點的初始權值和採集的動態權值來計算最終的權值結果。
在公式中,如果動態權值恰好等於初始權值,最終權值不變,則說明系統的負載狀況剛好達到理想狀況,等於初始權值DW(Ni),如果動態權值計算結果高於初始權值,最終權值變高,則說明系統負載很輕,等化器將會增加分配給該結點的任務比率,如果動態權值低於初始權值,最終權值變低,說明系統開始處於重載狀況,等化器將會減少對該結點分配的任務,在實際使用中,若發現所有結點的權值都小於他們的DW ( Ni ),則說明當前個集群處於超載狀態,這時需要加入新的結點到集群中來處理部分負載,反之,若所有結點的權值大大高於DW ( Ni ),則說明當前系統的負載都比較輕。
總結
網路負載平衡是集群作業調度系統的具體實現,由於其處理的作業單元是TCP / IP協定下的網路連接,因此可以採用面向網路連接的集中基本調度演算法,考慮集群負載不平衡的可能,採取了動態獲取服務節點的權值並使用負反饋機制調整平衡器對網路服務請求的分佈,以適應服務節點在運行過程中資源的變化,筆者也在 LVS 集群系統的基礎上,配合原有的輪詢演算法對其進行改進,增加了採集動態權值的程式並即時反饋到負載平衡器的調度系統上,實踐證明,採用動態平衡在集群系統的整體吞吐量方面有所提高,特別是在集群各個節點性能不一,集群提供的網路服務程式所訪問的資源多樣化的情況下,負反饋機制的效果尤其明顯,在其他類型的集群中,負反饋機制的動態負載平衡也能夠得到很好的應用,只是平衡器所處理的作業單元不同於網路連接,而具體的負載演算法上也將有所不同。

TOP

多謝大大的分享
幫了我粉大的忙
學到一些技巧
以備一時之須
本帖最近評分記錄
  • lchqoo 經驗 -4 違反版規第6條,限期改善!!~重複內容 2006-7-16 01:48

TOP

超屌的方法,

不是我自己學的會的境界,

佩服佩服!!

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。