漫談負載均衡

負載均衡是什麼鬼?從字面意思來看,它應該有兩層意思分別是負載和均衡。而對於系統負載均衡它一樣具備兩層意思,其中系統負載指的系統可以承載的最大訪問流量,系統均衡指的是前端請求要均勻地分配給後端機器,同時,同一用戶要儘量分配給同一機器。系統經過負載均衡之後具備以下好處:前端

一、避免資源浪費。若是咱們均衡算法選的很差,就會致使後端資源浪費。好比:若是選擇一致Hash算法,能夠很好利用cache的容量。而若是用隨機,有可能會讓cache效果大打折扣。node

二、避免服務不可用。當咱們不考慮系統的承載能力,有可能直接把某臺機器壓垮,好比當機器的CPU利用率達到80%,若是再有大量的請求,那麼該機器直接宕機,甚至於致使雪崩狀況(一臺機器宕機,對應的請求會分給其餘機器上,那麼其餘機器也會出現宕機,以致於所有機器都宕機)。nginx

理論基礎

系統要實現負載均衡,背後確定須要一些算法支撐,下面就來看下對應的算法。算法

一、負載算法後端

既然要解決後端系統的承載能力,那咱們就有不少方式,經常使用的有如下幾種:服務器

靜態配置微信

這種方式對於中小系統來說是最有效最穩定的。由於後端機器的性能配置、上面部署哪些服務,還能有多大的承載能力等等,咱們是最清楚的。好比,咱們常常看到nginx的配置:網絡

image

動態調整併發

當碰到機器故障,以及因爲性能問題沒法處理請求時,若是此時還將新來的請求分配到該節點,那麼可能致使該節點宕機。所以,根據節點的實際負載動態調整節點的權重是很是重要的。固然,要獲得節點的真正負載,以及如何定義負載,不管負載是否及時收集,都是須要考慮的問題。負載均衡

動態調整首先計算全部節點的請求響應時間,對於響應較快的節點,咱們能夠多分配請求給它,而後增長它的請求數,當它的響應變慢時再慢慢減小它的請求數,慢慢地咱們找到這個節點最佳平衡點,即分配多少請求給它。經過相同方法咱們找到全部節點的平衡點。

這種方法的好處在於能夠動態平衡後面服務器的處理能力。不過,任何事物都有兩面性。這種方案若是遇到極端狀況,可能會形成雪崩。當某臺機器出現短暫網絡抖動的時候,它的響應就可能變慢,這個時候,前端服務就會將它的請求分配給其餘機器。若是分配的不少,就有可能形成某些機器響應也變慢。而後又將這些機器的請求分配給另外機器。如此這般,就會形成雪崩。

二、均衡算法

均衡算法主要解決將請求如何發送給後端服務。常常會用到如下三種算法:隨機(random)、輪詢(round-robin)和 哈希算法。

隨機算法

隨機算法就是經過一個隨機函數將全部請求分散到各個節點上, 該方法比較簡單,且能作到將請求均勻地分散到各個節點上,所以常用隨機算法。

輪詢算法

輪詢算法就是將全部節點以一樣的機率向外提供服務,可是它沒有考慮各個節點之間的性能差異,對於一樣數目的請求,性能好的節點可以輕鬆完成,而性能差的節點完成的比較費力。所以,咱們提出了加權輪詢算法,爲不一樣性能的節點賦予不一樣權重。

哈希算法

一般將用戶 id 或 ip 做爲key,計算出對應的hash值,而後再對節點數量取模,即hash(key) mode n,其中n爲節點數,獲得該用戶請求落到哪一個節點上。該方法能夠作到讓同一個請求落到同一個節點中,可是當節點數量發生動態變化時,該方法就不太適應了。此時,就應該使用一致性hash算法。一致性hash算法就是把每臺server分紅v個虛擬節點,再把全部虛擬節點(n*v)隨機分配到一致性哈希的圓環上,這樣全部的用戶從本身圓環上的位置順時針往下取到第一個vnode就是本身所屬的節點。當此節點存在故障時,再順時針取下一個做爲替代節點。更加具體的描述能夠參考一致性Hash這篇文章,這裏就不展開了。

具體實現

目前負載均衡系統有Nginx、LVS、F5,其總會難過Nginx是軟件的7層負載均衡,LVS是內核的4層負載均衡,F5是硬件的4層負載均衡。

軟件和硬件的區別在於性能,硬件遠遠高於軟件,Nginx的性能是萬級的,通常的Linux服務器上安裝一個Nginx能達到每秒5萬併發請求;而F5的性能能達到百萬級,從200萬每秒到800萬每秒都有,不過價格很貴。

4層和7層的區別在於協議和靈活性,Nginx是7層的,它支持HTTP等協議,而LVS和F5是4層協議,它們和協議無關,幾乎全部應用均可以作。

image

image

歡迎關注微信公衆號:木可大大,全部文章都將同步在公衆號上。

相關文章
相關標籤/搜索