四種負載均衡演算法思想

2021-10-03 05:31:16 字數 3622 閱讀 6866

​ 若只是單純的使用random進行隨機的話,可以實現,但是如果伺服器的負載能力大小不一樣,

就會造成配置高的伺服器處於空閒或者負載量小,而配置低的伺服器任務繁重。因此為每台伺服器

設定乙個權重來表明負載的能力大小。這是如何選取就有兩個方式,乙個是根據權重大小,向服務

list集合中新增多少個,這樣做的缺點就在於當伺服器過多,或者權重值過大,那這個list集合就

會很大,並且每更改一次就要重新維護一次,不適合動態。這是可以採用命中機制

》假如現在有乙個map,裡面的weight集合為【10,5,10】

》這時的請求數量為6

》6<10~~~~~~~~~~~>返回當前權重為10的ip

》若請求數為11;

》11>10,進行相減得1,再判斷1<5命中,返回權重為5的ip位址

實現**如下:

public

class

randomsolution

int requestsize =

newrandom()

.nextint

(totalweight)

; system.out.

println

(requestsize)

;for

(string ip : serverips.weight_ipmap.

keyset()

) requestsize = requestsize - weight;

}return null;

}

輪詢就是按照當前的請求id經過取模和命中機制返回伺服器的ip,具體的實現如下:

》若請求的id為5;此時伺服器的權重列表為【5,3,1】;

》計算出伺服器的權重的總和為9

》5%9=5(這一步是為了保證id過大的時候,始終能夠命中)

》和上面的隨機的命中演算法是一樣的

》如果id從0開始,則最終的結果會是a伺服器五次,b伺服器三次,c伺服器一次,按照此規律進行迴圈

實現**如下:

public

class

roundrobin

int requestid = requestid.

getrequestid()

;int iid=requestid % totalweight;

system.out.

println

(requestid)

;for

(string ip : serverips.weight_ipmap.

keyset()

) iid = iid - weight;

}return null;

}public

static

void

main

(string[

] args)

}

這只是簡單的輪詢,如果能夠讓這些請求交叉分布就更好了,平滑加權輪詢的出現就是為了解決這個問題,這也是nginx的負載均衡機制(簡單思想)

》採用map>的資料結構,weight物件用來記載當前ip的實時權重值

》若初始的權重為【5,3,1】,每次迴圈初始化到weight物件中並封裝到map集合中(即當前的currentweight+初始的權重值,作為當前的權重值)

》找出當前weight物件中maxcurrentweight,即當前權重最大的點

》進行減操作maxcurrentweight-totalweight,將結果賦給currentweight,返回當前權重值的ip;

具體**如下:

public

class

smoothroundrobin

return totalweight;

}public

static

void

initweightmap()

gettotalweight()

;}public

static string getserver()

/*為currentweight賦值,每次的重新計算當前權重*/

for(weight w:weightmap.

values()

) system.out.

println

(weightmap)

;/*找出weightmap中最大的currentweight*/

weight maxcurrentweight = null;

for(weight weight:weightmap.

values()

)}/*對maxweight進行-sumweight處理*/

maxcurrentweight.

setcurrentweight

(maxcurrentweight.

getcurrentweight()

-totalweight)

;return maxcurrentweight.

getip()

;}public

static

void

main

(string[

] args)

}}

這樣就會使輸出結果更加均衡。

又稱為hash環法,根據請求者的ip計算出其hashcode,去查詢由伺服器ip的hashcode所構成的乙個環,這個環上面有很多虛節點,虛節點的多少可以有權重而定,

找出比當前iphash值大的第乙個點作為返回。

注意:一定要保證hash環是乙個有序的環(採用treemap實現)

具體**如下:

public

class

consistenhash

} system.out.

println

(hashcirle);}

/*根據請求的ip的hash值,找到比這個值大的一顆子樹(同樣有序的),取出子樹中的最小節點,返回此節點的ip值,如沒有這樣一課子樹,則返回整棵樹最小節點的ip值

* 依次向下排取,但是這種方法的問題又出來了,可以將活躍節點用乙個有序表來進行對映,這時候取對應的點*/

public

static string getserver

(string clientip)

else

}public

static

intgehash

(string str)

if(hash<0)

return hash;

}public

static

void

main

(string[

] args)

}}

這個就是動態實現了,需要根據伺服器此時的請求多少和其他影響因素得出乙個活躍因子,然後根據這個值去判斷由哪乙個伺服器來處理當前請求,可以結合上面的三種方法一起實現

四種負載均衡演算法

輪詢演算法 基於雜湊環的一致性雜湊演算法 最小活躍數演算法 軟體 nginx haproxy 硬體 f5伺服器 第一台服務 權重3 第二台服務 權重2 第三台服務 權重1 那麼就維護乙個list 放入3個第一台服務 2個第二台服務 1個第一台服務,然後根據list的大小生成隨機數取出伺服器位址訪問,...

dubbo 四種均衡負載

1.consistenthashloadbalance 運用hash演算法 consistenthashselector 雜湊演算法類,在呼叫的時候,他會根據invokers生產對應乙個hashkey,這個hashkey對應著儲存著consistenthashselector consistenth...

Nginx負載均衡四種分配策略

1 輪詢 預設 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器宕機,能自動剔除掉。2 weight weight代表權重,預設為1,權重越高被分配的客戶端越多。指定輪詢機率,weight和訪問比率成正比,使用者後端伺服器效能不均的情況。例如 upstream myserver3 ip ...