若只是單純的使用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 ...