一篇讀懂分佈式架構下的負載均衡

微信公衆號:IT一刻鐘, 大型現實非嚴肅主義現場, 一刻鐘與你分享優質技術架構與見聞,作一個有劇情的程序員。程序員

什麼是負載均衡?

百度詞條裏的解釋是:負載均衡,英文叫Load Balance,意思就是將請求或者數據分攤到多個操做單元上進行執行,共同完成工做任務。 它的目的就經過調度集羣,達到最佳化資源使用,最大化吞吐率,最小化響應時間,避免單點過載的問題。算法

負載均衡分類

負載均衡能夠根據網絡協議的層數進行分類,咱們這裏以ISO模型爲準,從下到上分爲: 物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層,應用層。 當客戶端發起請求,會通過層層的封裝,發給服務器,服務器收到請求後通過層層的解析,獲取到對應的內容。後端

二層負載均衡

二層負債均衡是基於數據鏈路層的負債均衡,即讓負債均衡服務器和業務服務器綁定同一個虛擬IP(即VIP),客戶端直接經過這個VIP進行請求,那麼如何區分相同IP下的不一樣機器呢?沒錯,經過MAC物理地址,每臺機器的MAC物理地址都不同,當負載均衡服務器接收到請求以後,經過改寫HTTP報文中以太網首部的MAC地址,按照某種算法將請求轉發到目標機器上,實現負載均衡。 這種方式負載方式雖然控制粒度比較粗,可是優勢是負載均衡服務器的壓力會比較小,負載均衡服務器只負責請求的進入,不負責請求的響應(響應是有後端業務服務器直接響應給客戶端),吞吐量會比較高。緩存

三層負載均衡

三層負載均衡是基於網絡層的負載均衡,通俗的說就是按照不一樣機器不一樣IP地址進行轉發請求到不一樣的機器上。 這種方式雖然比二層負載多了一層,但從控制的顆粒度上看,並無比二層負載均衡更有優點,而且,因爲請求的進出都要通過負載均衡服務器,會對其形成比較大的壓力,性能也比二層負載均衡要差。服務器

四層負載均衡

四層負載均衡是基於傳輸層的負載均衡,傳輸層的表明協議就是TCP/UDP協議,除了包含IP以外,還有區分了端口號,通俗的說就是基於IP+端口號進行請求的轉發。相對於上面兩種,控制力度縮小到了端口,能夠針對同一機器上的不用服務進行負載。 這一層以LVS爲表明。微信

七層負載均衡

七層負載均衡是基於應用層的負載均衡,應用層的表明協議有HTTP,DNS等,能夠根據請求的url進行轉發負載,比起四層負載,會更加的靈活,所控制到的粒度也是最細的,使得整個網絡更"智能化"。例如訪問一個網站的用戶流量,能夠經過七層的方式,將對圖片類的請求轉發到特定的圖片服務器並可使用緩存技術;將對文字類的請求能夠轉發到特定的文字服務器並可使用壓縮技術。能夠說功能是很是強大的負載。網絡

這一層以Nginx爲表明。架構

在普通的應用架構中,使用Nginx徹底能夠知足需求,對於一些大型應用,通常會採用DNS+LVS+Nginx的方式進行多層次負債均衡,以上這些說明都是基於軟件層面的負載均衡,在一些超大型的應用中,還會在前面多加一層物理負載均衡,好比知名的F5。負載均衡

負載均衡算法

負載均衡算法分爲兩類: 一種是靜態負載均衡,一種是動態負載均衡。函數

靜態均衡算法:

一、輪詢法

將請求按順序輪流地分配到每一個節點上,不關心每一個節點實際的鏈接數和當前的系統負載。 優勢:簡單高效,易於水平擴展,每一個節點知足字面意義上的均衡 缺點:沒有考慮機器的性能問題,根據木桶最短木板理論,集羣性能瓶頸更多的會受性能差的服務器影響。 

二、隨機法

將請求隨機分配到各個節點。由機率統計理論得知,隨着客戶端調用服務端的次數增多,其實際效果愈來愈接近於平均分配,也就是輪詢的結果。 優缺點和輪詢類似。

三、源地址哈希法

源地址哈希的思想是根據客戶端的IP地址,經過哈希函數計算獲得一個數值,用該數值對服務器節點數進行取模,獲得的結果即是要訪問節點序號。採用源地址哈希法進行負載均衡,同一IP地址的客戶端,當後端服務器列表不變時,它每次都會落到到同一臺服務器進行訪問。 優勢:相同的IP每次落在同一個節點,能夠人爲干預客戶端請求方向,例如灰度發佈 缺點:若是某個節點出現故障,會致使這個節點上的客戶端沒法使用,沒法保證高可用。當某一用戶成爲熱點用戶,那麼會有巨大的流量涌向這個節點,致使冷熱分佈不均衡,沒法有效利用起集羣的性能。因此當熱點事件出現時,通常會將源地址哈希法切換成輪詢法。

四、加權輪詢法

不一樣的後端服務器可能機器的配置和當前系統的負載並不相同,所以它們的抗壓能力也不相同。給配置高、負載低的機器配置更高的權重,讓其處理更多的請;而配置低、負載高的機器,給其分配較低的權重,下降其系統負載,加權輪詢能很好地處理這一問題,並將請求順序且按照權重分配到後端。 加權輪詢算法要生成一個服務器序列,該序列中包含n個服務器。n是全部服務器的權重之和。在該序列中,每一個服務器的出現的次數,等於其權重值。而且,生成的序列中,服務器的分佈應該儘量的均勻。好比序列{a, a, a, a, a, b, c}中,前五個請求都會分配給服務器a,這就是一種不均勻的分配方法,更好的序列應該是:{a, a, b, a, c, a, a}。 優勢:能夠將不一樣機器的性能問題歸入到考量範圍,集羣性能最優最大化; 缺點:生產環境複雜多變,服務器抗壓能力也沒法精確估算,靜態算法致使沒法實時動態調整節點權重,只能粗糙優化。

五、加權隨機法

與加權輪詢法同樣,加權隨機法也根據後端機器的配置,系統的負載分配不一樣的權重。不一樣的是,它是按照權重隨機請求後端服務器,而非順序。

六、鍵值範圍法

根據鍵的範圍進行負債,好比0到10萬的用戶請求走第一個節點服務器,10萬到20萬的用戶請求走第二個節點服務器……以此類推。 優勢:容易水平擴展,隨着用戶量增長,能夠增長節點而不影響舊數據 缺點:容易負債不均衡,好比新註冊的用戶活躍度高,舊用戶活躍度低,那麼壓力就全在新增的服務節點上,舊服務節點性能浪費。並且也容易單點故障,沒法知足高可用。

(注:以上所提到的單點故障,均可以用主從方式來解決,從節點監聽主節點心跳,當發現主節點死亡,從節點切換成主節點頂替上去。這裏能夠思考一個問題,怎麼設計集羣主從能夠最大程度上下降成本)

動態負債均衡算法:

一、最小鏈接數法

根據每一個節點當前的鏈接狀況,動態地選取其中當前積壓鏈接數最少的一個節點處理當前請求,儘量地提升後端服務的利用效率,將請求合理地分流到每一臺服務器。俗稱閒的人不能閒着,你們一塊兒動起來。 優勢:動態,根據節點情況實時變化 缺點:提升了複雜度,每次鏈接斷開須要進行計數 實現:將鏈接數的倒數當權重值

二、最快響應速度法

根據請求的響應時間,來動態調整每一個節點的權重,將響應速度快的服務節點分配更多的請求,響應速度慢的服務節點分配更少的請求,俗稱能者多勞,扶貧救弱。 優勢:動態,實時變化,控制的粒度更細,跟靈敏 缺點:複雜度更高,每次須要計算請求的響應速度 實現:能夠根據響應時間進行打分,計算權重

三、觀察模式法

觀察者模式是綜合了最小鏈接數和最快響應度,同時考量這兩個指標數,進行一個權重的分配。

說在後面話

還有哪些負載均衡的算法,或者有更好的想法或問題,歡迎留言交流!

 

相關文章
相關標籤/搜索