究及兩大負(fù)載均衡算法的原理
負(fù)載均衡設(shè)備的產(chǎn)生都是依據(jù)負(fù)載均衡算法的,那么現(xiàn)在我們就來研究一下它們的原理內(nèi)容。包括輪詢調(diào)度算法和權(quán)重輪詢調(diào)度算法。這兩種都是負(fù)載均衡算法的核心內(nèi)容。通過兩個算法的介紹,也能幫助我們理解負(fù)載均衡的概念。
負(fù)載均衡算法——輪詢調(diào)度算法(Round-Robin Scheduling)
輪詢調(diào)度算法的原理是每一次把來自用戶的請求輪流分配給內(nèi)部中的服務(wù)器,從1開始,直到N(內(nèi)部服務(wù)器個數(shù)),然后重新開始循環(huán),這也是負(fù)載均衡算法的核心內(nèi)容。
算法的優(yōu)點是其簡潔性,它無需記錄當(dāng)前所有連接的狀態(tài),所以它是一種無狀態(tài)調(diào)度。
輪詢調(diào)度算法流程
假設(shè)有一組服務(wù)器N臺,S = {S1, S2, …, Sn},一個指示變量i表示上一次選擇的服務(wù)器ID。變量i被初始化為N-1。其算法如下:
- j = i;
- do
- {
- j = (j + 1) mod n;
- i = j;
- return Si;
- } while (j != i);
- return NULL;
這種算法的邏輯實現(xiàn)如圖1所示:
圖1 輪詢調(diào)度實現(xiàn)邏輯圖示
輪詢調(diào)度算法假設(shè)所有服務(wù)器的處理性能都相同,不關(guān)心每臺服務(wù)器的當(dāng)前連接數(shù)和響應(yīng)速度。當(dāng)請求服務(wù)間隔時間變化比較大時,輪詢調(diào)度算法容易導(dǎo)致服務(wù)器間的負(fù)載不平衡。
所以此種均衡算法適合于服務(wù)器組中的所有服務(wù)器都有相同的軟硬件配置并且平均服務(wù)請求相對均衡的情況。#p#
權(quán)重輪詢調(diào)度算法(Weighted Round-Robin Scheduling)
上面所講的輪詢調(diào)度算法并沒有考慮每臺服務(wù)器的處理能力,在實際情況中,可能并不是這種情況。由于每臺服務(wù)器的配置、安裝的業(yè)務(wù)應(yīng)用等不同,其處理能力會不一樣。所以,我們根據(jù)服務(wù)器的不同處理能力,給每個服務(wù)器分配不同的權(quán)值,使其能夠接受相應(yīng)權(quán)值數(shù)的服務(wù)請求。
負(fù)載均衡算法——權(quán)重輪詢調(diào)度算法流程
這一負(fù)載均衡算法是輪訓(xùn)調(diào)度算法的升級版本。假設(shè)有一組服務(wù)器S = {S0, S1, …, Sn-1},W(Si)表示服務(wù)器Si的權(quán)值,一個指示變量i表示上一次選擇的服務(wù)器,指示變量cw表示當(dāng)前調(diào)度的權(quán)值,max(S)表示集合S中所有服務(wù)器的***權(quán)值,gcd(S)表示集合S中所有服務(wù)器權(quán)值的***公約數(shù)。變量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;
- }
這種算法的邏輯實現(xiàn)如圖2所示,圖中我們假定四臺服務(wù)器的處理能力為3:1:1:1。
由于權(quán)重輪詢調(diào)度算法考慮到了不同服務(wù)器的處理能力,所以這種均衡算法能確保高性能的服務(wù)器得到更多的使用率,避免低性能的服務(wù)器負(fù)載過重。所以,在實際應(yīng)用中比較常見。
總結(jié)
兩大負(fù)載均衡算法,輪詢調(diào)度算法以及權(quán)重輪詢調(diào)度算法的特點是實現(xiàn)起來比較簡潔,并且實用。目前幾乎所有的負(fù)載均衡設(shè)備均提供這種功能。