輪詢演算法
基於雜湊環的一致性雜湊演算法
最小活躍數演算法
軟體:nginx、haproxy
硬體:f5伺服器
第一台服務 權重3
第二台服務 權重2
第三台服務 權重1
那麼就維護乙個list 放入3個第一台服務、2個第二台服務、1個第一台服務,然後根據list的大小生成隨機數取出伺服器位址訪問,這就是普通的輪詢隨機演算法
把所有的輪詢權重加在一起,3+2+1然後再次範圍內從0開始生成隨機數,然後判斷它屬於哪個範圍內<3則是第一台伺服器,else<5則是第二台服務,否則是第三台服務
注意:如果權重相同則直接按照伺服器個數隨機即可
那麼就維護乙個list 放入3個第一台服務、2個第二台服務、1個第一台服務,然後按照順序依次取位址,和隨機差不多只是不產生隨機數直接乙個數++方式取服務位址
一台伺服器會連續獲得請求,應該分散開來,例如 111223不如改為123121這樣所以就需要實現動態權重
currentweight += weight
maxreturn
max所在位置=max-權重總和(1+2+3)
第一次3:2:1
3第一台伺服器位址
-3:2:1
第二次0:4:2
4第二台伺服器位址
0:-2:2
第三次3:0:3
3第一台伺服器位址
假設上圖中4節點掛掉,那麼根據圓環的特性還有一致性的要求,那麼3到1這部分的請求都需要由1承擔,這樣並不能做到負載均衡
如果增加虛擬節點並且互相分散開,那麼這樣帶有虛擬節點的hash環當某乙個節點掛掉了那麼只會影響到前乙個服務負擔兩份請求的任務(上圖有問題不應該有順序規律,hash演算法進行雜湊後是無序的,也許節點一順時針下乙個是節點3-2不一定非要是4-1)
/**
* hashmath
* * @author hanzhao
* @date 2020/11/19
*/public
class
hashmath}}
/** * 將請求及逆行hash然後定位到環上的節點,取出節點對應的ip位址
* @param request
* @return
*/public
static string getserver
(string request)
integer index = submap.
firstkey()
;//然後取出這個hash的值對應的ip位址則完成了此次負載均衡
get(index);}
/** * 主程式入口
* @param args
*/public
static
void
main
(string[
] args)
} system.out.
println
("第一台伺服器命中:"
+firstcount+
"次")
; system.out.
println
("第二台伺服器命中:"
+secondcount+
"次")
; system.out.
println
("第三台伺服器命中:"
+thredcount+
"次")
; system.out.
println
("第四臺伺服器命中:"
+fourthcount+
"次");}
/** * hash演算法
* @param key
* @return
*/public
static integer hash
(string key)
}
最小活躍數演算法一般為三颱機器,每台機器接收了多少個連線或請求然後累計+1,處理完或者意外出錯累計-1然後根據值大小分配請求和連線 四種負載均衡演算法思想
若只是單純的使用random進行隨機的話,可以實現,但是如果伺服器的負載能力大小不一樣,就會造成配置高的伺服器處於空閒或者負載量小,而配置低的伺服器任務繁重。因此為每台伺服器 設定乙個權重來表明負載的能力大小。這是如何選取就有兩個方式,乙個是根據權重大小,向服務 器list集合中新增多少個,這樣做的...
dubbo 四種均衡負載
1.consistenthashloadbalance 運用hash演算法 consistenthashselector 雜湊演算法類,在呼叫的時候,他會根據invokers生產對應乙個hashkey,這個hashkey對應著儲存著consistenthashselector consistenth...
Nginx負載均衡四種分配策略
1 輪詢 預設 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器宕機,能自動剔除掉。2 weight weight代表權重,預設為1,權重越高被分配的客戶端越多。指定輪詢機率,weight和訪問比率成正比,使用者後端伺服器效能不均的情況。例如 upstream myserver3 ip ...