我們查詢註冊中心獲得了某個服務的可用節點列表,我們需要從可用節點列表中選擇乙個發起呼叫,這就是負載均衡的所用了。
需要考慮兩個因素,⼀個是要考慮調⽤的均勻性,也就是要讓每個節點都接收到調⽤,發揮所有節點的作⽤,另⼀個是要考慮調⽤的效能,也就是哪個節點響應最快,優先調⽤哪個節點。
隨機演算法(偽隨機)
隨機演算法,顧名思義就是從可⽤的服務節點中,隨機挑選⼀個節點來訪問。
在實現時,隨機演算法通常是通過⽣成⼀個隨機數來實現,⽐如服務有10個節點,那麼就每⼀次⽣成⼀個1~10之間的隨機數, 假設⽣成的是2,那麼就訪問編號為2的節點。
採⽤隨機演算法,在節點數量⾜夠多,並且訪問量⽐較⼤的情況下,各個節點被訪問的概率是基本相同的。
改演算法的核心就是獲取乙個不超過服務節點列表大小的隨機整數。
int idx = (int) (threadlocalrandom.current().nextdouble() * serviceslist.size());
如何實現真隨機
霍金有句名言:「誰跟我提薛丁格的貓,我就去拿我的槍」。因為在我們的巨集觀世界中薛丁格的貓其實是乙個很荒謬的真理
,這只貓既是活著的又是死的,在沒有開箱之前,一切都是不確定的,同時,我覺得這才是真隨機,不同於計算機中的隨機數生成,因為大多數語言的隨機數生成是基於時鐘的,例如c中的srand就是與計算機目前的時刻與2023年1月1日0時0分0秒之間的時間差有關。
假如說我對於時間的掌控足夠強大,我就可以在某個特定時刻發起呼叫,這樣使用隨機呼叫的負載均衡演算法到底呼叫了哪個節點,當然就在我的掌控之中了。
所以說在我們的巨集觀世界,一切所謂的隨機都是不存在的,拉普拉斯妖可以根據現有的狀態得到我們所謂的隨機值。
那麼在微觀世界呢? 記得在高中物理中,我們學到過光的波粒二象性,光既是波又是粒子,仔細一想,細思極恐,你既是男人又是女人,沒有驗身之前你有男女太監三種狀態,就好像薛丁格的貓,沒有開箱前有死活兩種狀態。這是愛因斯坦發現的,記得課本上說的是使用了雙縫實驗。在探測儀觀察的情況下光是粒子,只通過單縫,在沒觀察的情況下是波,通過雙縫。至於粒子到底通過哪一夾縫,這才是真正的隨機。
對於物理學家來說,這種量子隨機性是宇宙唯一的隨機性,是物理定律不能**的結果。
建議各位妄圖排程方便而使用隨機演算法的人,先去搞乙個光子發射裝置,放在計算機裡面用來實現隨機演算法。輪詢演算法
輪詢演算法,顧名思義就是按照固定的順序,把可⽤的服務節點,挨個訪問⼀次。
在實現時,輪詢演算法通常是把所有可⽤節點放到⼀個陣列⾥,然後按照陣列編號,挨個訪問。
⽐如服務有10個節點,放到陣列⾥就是⼀個大小為10的陣列,這樣的話就可以從序號為0的節點開始訪問,訪問後序號⾃動加1,下⼀次就會訪問序號為1的 節點,以此類推。
輪詢演算法能夠保證所有節點被訪問到的概率是相同的。
當然,在我們現實生活中,可能我們不同服務節點的效能不同,我們需要根據其能力進行排程。
加權輪詢演算法
輪詢演算法能夠保證所有節點被訪問的概率相同,⽽加權輪詢演算法是在此基礎上,給每個節點賦予⼀個權重,從⽽使每個節點被訪問到的概率不同,權重⼤的節點被訪問的概率就⾼,權重⼩的節點被訪問的概率就⼩。
在實現時,加權輪詢演算法是⽣成⼀個節點序列,該序列⾥有n個節點,n是所有節點的權重之和。
在這個序列中,每個節點出現的次數,就是它的權重值。⽐如有三個節點:a、b、c,權重分別是3、2、1,那麼⽣成的序列就是, 這樣的話按照這個序列訪問,前6次請求就會分別訪問節點a三次,節點b兩次,節點c⼀次。從第7個請求開始,⼜重新按照這個序列的順序來訪問節點。
在應⽤加權輪詢演算法的時候,要盡可能保證⽣產的序列的均勻,如果⽣成的不均勻會造成節點訪問失衡,⽐如剛才的例⼦,如果⽣成的序列是,就會導致前3次訪問的節點都是a。
最少活躍連線演算法
最少活躍連線演算法,顧名思義就是每⼀次訪問都選擇連線數最少的節點。
因為不同節點處理請求的速度不同,使得同⼀個服務消費者同每⼀個節點的連線數都不相同。
連線數⼤的節點,可以認為是處理請求慢,⽽連線數小的節點,可以認為是處理請求快。所以在挑選節點時,可以以連線數為依據,選擇連線數最少的節點訪問。
在實現時,需要記錄跟每⼀個節點的連線數,這樣在選擇節點時,才能⽐較出連線數最⼩的節點。
⼀致性hash演算法
⼀致性hash演算法,是通過某個hash函式,把同⼀個**的請求都對映到同⼀個節點上。⼀致性hash演算法最⼤的特點就是同⼀個**的請求,只會對映到同⼀個節點上,可以說是具有記憶功能。只有當這個節點不可⽤時,請求才會被分配到相鄰的可⽤節點上。
上面五種負載均衡演算法分別可以應用在不同的場景,最近正好在寫zeus的負載均衡策略,考慮之後決定使用改造後的加權輪詢演算法,在每乙個client中會有乙個定時任務,去獲取所有節點的近期訪問的效能統計,根據效能快慢,把服務節點按照二八分為20%慢節點80快節點,動態調整權重。
負載均衡概述
負載均衡 load balance 是分布式系統架構設計中必須考慮的因素之一,它通常是指,將請求 資料 均勻 分攤到多個操作單元上執行,負載均衡的關鍵在於 均勻 常見網際網路分布式架構如上,分為客戶端層 反向 nginx層 站點層 服務層 資料層。什麼是負載均衡 負載均衡 load balance ...
十二 負載均衡基本概述
隨著有線無線網路的漸漸擴張,大規模網路的建設和應用,大量資訊的互動和流動,給我們的伺服器帶來了空前的壓力 那麼,如何進行乙個優化,如何緩解單一伺服器的壓力呢?這就引出了負載均衡這個概念 那麼,什麼是負載均衡呢?負載均衡 load balance 由於目前現有網路的各個核心部分隨著業務量的提高,訪問量...
負載均衡演算法
輪循演算法 roundrobin 說明 每一次來自網路的請求輪流分配給內部中的每台伺服器,從1至n然後重新開始 舉例 適合於伺服器組中的所有伺服器都有相同的軟硬體配置並且平均服務請求相對均衡的情況 最少連線演算法 leastconnection 說明 客戶端的每一次請求服務在伺服器停留的時間都可能會...