您的位置:首頁 >  新聞中心 > 云通訊公告
  云通訊公告
 

多種負載均衡算法及其 Java 代碼實現(xiàn)

來源:原創(chuàng)    時間:2017-11-15    瀏覽:0 次

首先給我們介紹下什么是負載均衡
負載均衡 樹立在現(xiàn)有網(wǎng)絡結(jié)構(gòu)之上,它供給了一種廉價有用通明的辦法擴展 網(wǎng)絡設備和 效勞器的帶寬、添加 吞吐量、加強網(wǎng)絡數(shù)據(jù)處理才能、進步網(wǎng)絡的靈敏性和可用性。
負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行履行,例如Web 效勞器、 FTP效勞器、 企業(yè)要害應用效勞器和其它要害使命效勞器等,然后共同完成工作使命。
多種負載均衡算法及其Java代碼完成
本文敘述的是”將外部發(fā)送來的懇求均勻分配到對稱結(jié)構(gòu)中的某一臺效勞器上”的各種算法,并以Java代碼演示每種算法的具體完成,OK,下面進入正題,在進入正題前,先寫一個類來模仿Ip列表:

輪詢(Round Robin)法
輪詢調(diào)度算法的原理是每一次把來自用戶的懇求輪番分配給內(nèi)部中的效勞器,從1開端,直到N(內(nèi)部效勞器個數(shù)),然后從頭開端循環(huán)。算法的長處是其簡潔性,它無需記載當時一切銜接的狀況,所以它是一種無狀況調(diào)度。
其代碼完成大致如下:

因為serverWeightMap中的地址列表是動態(tài)的,隨時可能有機器上線、下線或許宕機,因而為了防止可能呈現(xiàn)的并發(fā)問題,辦法內(nèi)部要新建局部變量serverMap,現(xiàn)將serverMap中的內(nèi)容仿制到線程本地,以防止被多個線程修正。這樣可能會引進新的問題,仿制今后serverWeightMap的修正無法反映給serverMap,也就是說這一輪挑選效勞器的過程中,新增效勞器或許下線效勞器,負載均衡算法將無法獲悉。新增無所謂,如果有效勞器下線或許宕機,那么可能會拜訪到不存在的地址。因而,效勞調(diào)用端需求有相應的容錯處理,比方從頭建議一次server挑選并調(diào)用。
關于當時輪詢的方位變量pos,為了確保效勞器挑選的次序性,需求在操作時對其加鎖,使得同一時間只能有一個線程能夠修正pos的值,不然當pos變量被并發(fā)修正,則無法確保效勞器挑選的次序性,甚至有可能導致keyList數(shù)組越界。
輪詢法的長處在于:企圖做到懇求搬運的肯定均衡。
輪詢法的缺陷在于:為了做到懇求搬運的肯定均衡,有必要支付適當大的價值,因為為了確保pos變量修正的互斥性,需求引進重量級的失望鎖synchronized,這將會導致該段輪詢代碼的并發(fā)吞吐量發(fā)作顯著的下降。
隨機(Random)法
經(jīng)過體系的隨機算法,依據(jù)后端效勞器的列表巨細值來隨機選取其間的一臺效勞器進行拜訪。由概率核算理論能夠得知,跟著客戶端調(diào)用效勞端的次數(shù)增多,
其實際作用越來越接近于平均分配調(diào)用量到后端的每一臺效勞器,也就是輪詢的成果。
隨機法的代碼完成大致如下:

全體代碼思路和輪詢法共同,先重建serverMap,再獲取到server列表。在選取server的時分,經(jīng)過Random的nextInt辦法取0~keyList.size()區(qū)間的一個隨機值,然后從效勞器列表中隨機獲取到一臺效勞器地址進行回來。依據(jù)概率核算的理論,吞吐量越大,隨機算法的作用越接近于輪詢算法的作用。
源地址哈希(Hash)法
源地址哈希的思維是依據(jù)獲取客戶端的IP地址,經(jīng)過哈希函數(shù)核算得到的一個數(shù)值,用該數(shù)值對效勞器列表的巨細進行取模運算,得到的成果就是客服端要拜訪效勞器的序號。選用源地址哈希法進行負載均衡,同一IP地址的客戶端,當后端效勞器列表不變時,它每次都會映射到同一臺后端效勞器進行拜訪。
源地址哈希算法的代碼完成大致如下:

前兩部分和輪詢法、隨機法一樣就不說了,不同在于路由挑選部分。經(jīng)過客戶端的ip也就是remoteIp,取得它的Hash值,對效勞器列表的巨細取模,成果就是選用的效勞器在效勞器列表中的索引值。
源地址哈希法的長處在于:確保了相同客戶端IP地址將會被哈希到同一臺后端效勞器,直到后端效勞器列表改變。依據(jù)此特性能夠在效勞消費者與效勞供給者之間樹立有狀況的session會話。
源地址哈希算法的缺陷在于:除非集群中效勞器的十分安穩(wěn),根本不會上下線,不然一旦有效勞器上線、下線,那么經(jīng)過源地址哈希算法路由到的效勞器是效勞器上線、下線前路由到的效勞器的概率十分低,如果是session則取不到session,如果是緩存則可能引發(fā)”雪崩”。如果這么解說不適合了解,能夠看我之前的一篇文章MemCache超具體解讀,共同性Hash算法部分。
加權(quán)輪詢(Weight Round Robin)法
不同的后端效勞器可能機器的裝備和當時體系的負載并不相同,因而它們的抗壓才能也不相同。給裝備高、負載低的機器裝備更高的權(quán)重,讓其處理更多的請;而裝備低、負載高的機器,給其分配較低的權(quán)重,下降其體系負載,加權(quán)輪詢能很好地處理這一問題,并將懇求次序且依照權(quán)重分配到后端。加權(quán)輪詢法的代碼完成大致如下:

與輪詢法相似,只是在獲取效勞器地址之前添加了一段權(quán)重核算的代碼,依據(jù)權(quán)重的巨細,將地址重復地添加到效勞器地址列表中,權(quán)重越大,該效勞器每輪所取得的懇求數(shù)量越多。
加權(quán)隨機(Weight Random)法
與加權(quán)輪詢法一樣,加權(quán)隨機法也依據(jù)后端機器的裝備,體系的負載分配不同的權(quán)重。不同的是,它是依照權(quán)重隨機懇求后端效勞器,而非次序。

這段代碼適當所以隨機法和加權(quán)輪詢法的結(jié)合,比較好了解,就不解說了。
最小銜接數(shù)(Least Connections)法
最小銜接數(shù)算法比較靈敏和智能,因為后端效勞器的裝備不盡相同,關于懇求的處理有快有慢,它是依據(jù)后端效勞器當時的銜接狀況,動態(tài)地選取其間當時
積壓銜接數(shù)最少的一臺效勞器來處理當時的懇求,盡可能地進步后端效勞的使用功率,將擔任合理地分流到每一臺效勞器。
前面幾種辦法費盡心思來完成效勞消費者懇求次數(shù)分配的均衡,當然這么做是沒錯的,能夠為后端的多臺效勞器平均分配工作量,最大程度地進步效勞器的使用率,可是實際狀況是否真的如此?實際狀況中,懇求次數(shù)的均衡真的能代表負載的均衡嗎?這是一個值得考慮的問題。
上面的問題,再換一個視點來說就是:今后端效勞器的視角來調(diào)查體系的負載,而非懇求建議方來調(diào)查。最小銜接數(shù)法便歸于此類。
最小銜接數(shù)算法比較靈敏和智能,因為后端效勞器的裝備不盡相同,關于懇求的處理有快有慢,它正是依據(jù)后端效勞器當時的銜接狀況,動態(tài)地選取其間當時積壓銜接數(shù)最少的一臺效勞器來處理當時懇求,盡可能地進步后端效勞器的使用功率,將負載合理地分流到每一臺機器。因為最小銜接數(shù)規(guī)劃效勞器銜接數(shù)的匯總和感知,規(guī)劃與完成較為繁瑣,此處就不說它的完成了。


免费视频观无码一区,国内精品一区二区无码,99精品无码视频在线播放,ā片国产在线播放