負載均衡算法概述


我們查詢注冊中心獲得了某個服務的可用節點列表,我們需要從可用節點列表中選擇一個發起調用,這就是負載均衡的所用了。

需要考慮兩個因素,⼀個是要考慮調⽤的均勻性,也就是要讓每個節點都接收到調⽤,發揮所有節點的作⽤,另⼀個是要考慮調⽤的性能,也就是哪個節點響應最快,優先調⽤哪個節點。

常見的負載均衡算法

隨機算法(偽隨機)

隨機算法,顧名思義就是從可⽤的服務節點中,隨機挑選⼀個節點來訪問。

在實現時,隨機算法通常是通過⽣成⼀個隨機數來實現,⽐如服務有10個節點,那么就每⼀次⽣成⼀個1~10之間的隨機數, 假設⽣成的是2,那么就訪問編號為2的節點。

采⽤隨機算法,在節點數量⾜夠多,並且訪問量⽐較⼤的情況下,各個節點被訪問的概率是基本相同的。

改算法的核心就是獲取一個不超過服務節點列表大小的隨機整數。

int idx = (int) (ThreadLocalRandom.current().nextDouble() * servicesList.size()); 

如何實現真隨機

霍金有句名言:“誰跟我提薛定諤的貓,我就去拿我的槍”。因為在我們的宏觀世界中薛定諤的貓其實是一個很荒謬的真理,這只貓既是活着的又是死的,在沒有開箱之前,一切都是不確定的,同時,我覺得這才是真隨機,不同於計算機中的隨機數生成,因為大多數語言的隨機數生成是基於時鍾的,例如c中的srand就是與計算機目前的時刻與1970年1月1日0時0分0秒之間的時間差有關。

假如說我對於時間的掌控足夠強大,我就可以在某個特定時刻發起調用,這樣使用隨機調用的負載均衡算法到底調用了哪個節點,當然就在我的掌控之中了。

所以說在我們的宏觀世界,一切所謂的隨機都是不存在的,拉普拉斯妖可以根據現有的狀態得到我們所謂的隨機值。

那么在微觀世界呢? 記得在高中物理中,我們學到過光的波粒二象性,光既是波又是粒子,仔細一想,細思極恐,你既是男人又是女人,沒有驗身之前你有男女太監三種狀態,就好像薛定諤的貓,沒有開箱前有死活兩種狀態。這是愛因斯坦發現的,記得課本上說的是使用了雙縫實驗。在探測儀觀察的情況下光是粒子,只通過單縫,在沒觀察的情況下是波,通過雙縫。至於粒子到底通過哪一夾縫,這才是真正的隨機。

對於物理學家來說,這種量子隨機性是宇宙唯一的隨機性,是物理定律不能預測的結果。

建議各位妄圖調度方便而使用隨機算法的人,先去搞一個光子發射設備,放在計算機里面用來實現隨機算法。

輪詢算法

輪詢算法,顧名思義就是按照固定的順序,把可⽤的服務節點,挨個訪問⼀次。

在實現時,輪詢算法通常是把所有可⽤節點放到⼀個數組⾥,然后按照數組編號,挨個訪問。

⽐如服務有10個節點,放到數組⾥就是⼀個大小為10的數組,這樣的話就可以從序號為0的節點開始訪問,訪問后序號⾃動加1,下⼀次就會訪問序號為1的 節點,以此類推。

輪詢算法能夠保證所有節點被訪問到的概率是相同的。

當然,在我們現實生活中,可能我們不同服務節點的性能不同,我們需要根據其能力進行調度。

加權輪詢算法

輪詢算法能夠保證所有節點被訪問的概率相同,⽽加權輪詢算法是在此基礎上,給每個節點賦予⼀個權重,從⽽使每個節點被訪問到的概率不同,權重⼤的節點被訪問的概率就⾼,權重⼩的節點被訪問的概率就⼩。

在實現時,加權輪詢算法是⽣成⼀個節點序列,該序列⾥有n個節點,n是所有節點的權重之和。

在這個序列中,每個節點出現的次數,就是它的權重值。⽐如有三個節點:a、b、c,權重分別是3、2、1,那么⽣成的序列就是{a、a、b、c、b、a}, 這樣的話按照這個序列訪問,前6次請求就會分別訪問節點a三次,節點b兩次,節點c⼀次。從第7個請求開始,⼜重新按照這個序列的順序來訪問節點。

在應⽤加權輪詢算法的時候,要盡可能保證⽣產的序列的均勻,如果⽣成的不均勻會造成節點訪問失衡,⽐如剛才的例⼦,如果⽣成的序列是{a、a、a、b、b、c},就會導致前3次訪問的節點都是a。

最少活躍連接算法

最少活躍連接算法,顧名思義就是每⼀次訪問都選擇連接數最少的節點。

因為不同節點處理請求的速度不同,使得同⼀個服務消費者同每⼀個節點的連接數都不相同。

連接數⼤的節點,可以認為是處理請求慢,⽽連接數小的節點,可以認為是處理請求快。所以在挑選節點時,可以以連接數為依據,選擇連接數最少的節點訪問。

在實現時,需要記錄跟每⼀個節點的連接數,這樣在選擇節點時,才能⽐較出連接數最⼩的節點。

⼀致性hash算法

⼀致性hash算法,是通過某個hash函數,把同⼀個來源的請求都映射到同⼀個節點上。⼀致性hash算法最⼤的特點就是同⼀個來源的請求,只會映射到同⼀個節點上,可以說是具有記憶功能。只有當這個節點不可⽤時,請求才會被分配到相鄰的可⽤節點上。

總結

上面五種負載均衡算法分別可以應用在不同的場景,最近正好在寫Zeus的負載均衡策略,考慮之后決定使用改造后的加權輪詢算法,在每一個client中會有一個定時任務,去獲取所有節點的近期訪問的性能統計,根據性能快慢,把服務節點按照二八分為20%慢節點80快節點,動態調整權重。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM