負載均衡演算法 加權輪詢

2021-10-03 14:21:34 字數 1690 閱讀 1205

輪詢演算法沒有考慮每台伺服器的處理能力,實際情況是每台伺服器的配置、安裝的業務應用等不同,其處理能力會不一樣。所以,加權輪詢演算法的原理就是:根據伺服器的不同處理能力,給每個伺服器分配不同的權值,使其能接受相應權值數的服務請求。

首先看乙個簡單的nginx負載均衡配置。

...}按照上述配置,nginx每收到7個客戶端的請求,會把其中的1個**給後端a,把其中的2個**給後端b,把其中的4個**給後端c。

假設有 n 臺例項 s = ,配置權重 w = ,有效權重 cw = 。每個例項 i 除了存在乙個配置權重 wi 外,還存在乙個當前有效權重 cwi,且 cwi 初始化為 wi;指示變數 currentpos 表示當前選擇的例項 id,初始化為 -1;所有例項的配置權重和為 weightsum;

那麼,排程演算法可以描述為:

初始每個例項 i 的當前有效權重cwi 為配置權重wi,並求得配置權重和 weightsum;

選出當前有效權重最大 的例項,將當前有效權重cwi 減去所有例項的權重和weightsum,且變數 currentpos 指向此位置;

將每個例項 i 的當前有效權重cwi 都加上配置權重wi;

此時變數 currentpos 指向的例項就是需排程的例項;

每次排程重複上述步驟 2、3、4;

上述 3 個服務,配置權重和 weightsum 為 7,其排程過程如下:

請求選中前的當前權重

currentpos

選中的例項

選中後的當前權重10

a21b

30a4

2c50

a61b

70a生成的序列是,發給後端的服務都分散開了,不在連續了。

#include #include #include #include using namespace std;

typedef struct

server;

vectorinitservers(vector& names, vectorweights)

return ss;

}int getnextserverindex(vector& ss, int total)

} ss[index].cur_weight -= total;

return index;

}void wrr_nginx(vector&ss, vectorweights)

printf("\n");

}int main()

; vectorservernames = ;

vectorss = initservers(servernames, weights);

printf("server is : \n ");

for (i = 0; i < ss.size(); i++)

printf("\n");

printf("\nwrr_nginx sequence is : ");

wrr_nginx(ss, weights);

system("pause");

return 0;

}

Nginx負載均衡 輪訓策略與加權輪詢

nginx 負載均衡排程策略 排程策略 含義輪詢 按照時間順序,逐一分配到不同的後端伺服器 加權輪詢 weight值越大,分配到的訪問機率越高 ip hash 每個請求按訪問ip的hash結果分配,這樣來自同乙個ip的請求固定訪問乙個後端伺服器,可以解決分布式session問題,但不是最優的解決辦法...

負載均衡演算法之輪詢

最近的工作事情比較少,於是就開是瞎折騰了 負載均衡大家一定不陌生了,一句話就是,人人有飯吃,還吃得飽,它的核心關鍵字就在於均衡,關於負載均衡大家基本可以脫口而出常見的幾種,輪詢,隨機,雜湊,帶權值的輪詢,客戶端請求數等等 作為最簡單的一種負載均衡策略,輪詢的優點顯而易見,簡單,並且在多數的情況是,基...

PHP實現負載均衡的加權輪詢方法分析

負載均衡演算法有哪些?輪詢法 將請求按順序輪流地分配到後端伺服器上,它均衡地對待後端的每一台伺服器,而不關心伺服器實際的連線數和當前的系統負載。隨機法 通過系統的隨機演算法,根據後端伺服器的列表大小值來隨機選取其中的一台伺服器進行訪問。源位址雜湊法 根據獲取客戶端的ip位址,通過雜湊函式計算得到乙個...