負載均衡的原理和架構

目錄

1 爲什麼需要負載均衡?

2 負載均衡原理 

3 常見負載均衡算法

4 常見負載均衡架構

4.1 DNS域名解析負載均衡

4.2 數據鏈路層負載均衡(LVS)

4.3 IP負載均衡(SNAT)

4.4 反向代理負載均衡(nginx)

5 常見的四層和七層負載均衡

5.1 四層負載均衡

5.2 七層負載均衡


1 爲什麼需要負載均衡?

       從單機網站到分佈式網站,很重要的區別是業務拆分和分佈式部署,將應用拆分後,部署到不同的機器上,實現大規模分佈式系統。分佈式和業務拆分解決了,但不同的機器面臨的業務壓力不盡相同,爲了使各機器均勻的分擔業務處理壓力,需要在集羣前面增加負載均衡設備,實現業務被平均分發到各業務處理單元。

圖1 負載均衡架構

2 負載均衡原理 

系統的擴展可分爲縱向(垂直)擴展和橫向(水平)擴展。

  • 縱向擴展,是從單機的角度通過增加硬件處理能力,比如CPU處理能力,內存容量,磁盤等方面,實現服務器處理能力的提升,不能滿足大型分佈式系統(網站),大流量,高併發,海量數據的問題。
  • 橫向擴展,通過添加機器來滿足大型網站服務的處理能力。比如:一臺機器不能滿足,則增加兩臺或者多臺機器,共同承擔訪問壓力。典型的集羣和負載均衡架構:如下圖:
圖2-1 典型負載均衡

       應用集羣:將同一應用部署到多臺機器上,組成處理集羣,接收負載均衡設備分發的請求,進行處理,並返回相應數據。

       負載均衡設備:將用戶訪問的請求,根據負載均衡算法,分發到集羣中的一臺處理服務器。(一種把網絡請求分散到一個服務器集羣中的可用服務器上去的設備)

3 常見負載均衡算法

(1)隨機算法

  • Random隨機,按權重設置隨機概率。在一個截面上碰撞的概率高,但調用量越大分佈越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。

(2)輪詢及加權輪詢

  • 輪詢(Round Robbin)當服務器羣中各服務器的處理能力相同時,且每筆業務處理量差異不大時,最適合使用這種算法。 輪循,按公約後的權重設置輪循比率。存在慢的提供者累積請求問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。
  • 加權輪詢(Weighted Round Robbin)爲輪詢中的每臺服務器附加一定權重的算法。比如服務器1權重1,服務器2權重2,服務器3權重3,則順序爲1-2-2-3-3-3-1-2-2-3-3-3- ......

(3)最小連接及加權最小連接

  • 最少連接(Least Connections)在多個服務器中,與處理連接數(會話數)最少的服務器進行通信的算法。即使在每臺服務器處理能力各不相同,每筆業務處理量也不相同的情況下,也能夠在一定程度上降低服務器的負載。
  • 加權最少連接(Weighted Least Connection)爲最少連接算法中的每臺服務器附加權重的算法,該算法事先爲每臺服務器分配處理連接的數量,並將客戶端請求轉至連接數最少的服務器上。

(4)哈希算法

  • 普通哈希
  • 一致性Hash,相同參數的請求總是發到同一提供者。當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。

(5)IP地址散列

  • 通過管理髮送方IP和目的地IP地址的散列,將來自同一發送方的分組(或發送至同一目的地的分組)統一轉發到相同服務器的算法。當客戶端有一系列業務需要處理而必須和一個服務器反覆通信時,該算法能夠以流(會話)爲單位,保證來自相同客戶端的通信能夠一直在同一服務器中進行處理。

(6)URL散列

  • 通過管理客戶端請求URL信息的散列,將發送至相同URL的請求轉發至同一服務器的算法。

4 常見負載均衡架構

4.1 DNS域名解析負載均衡

圖4-1 DNS域名解析

       利用DNS處理域名解析請求的同時進行負載均衡是另一種常用的方案。在DNS服務器中配置多個A記錄,如:www.mysite.com IN A 114.100.80.1、www.mysite.com IN A 114.100.80.2、www.mysite.com IN A 114.100.80.3.

      每次域名解析請求都會根據負載均衡算法計算一個不同的IP地址返回,這樣A記錄中配置的多個服務器就構成一個集羣,並可以實現負載均衡。

       DNS域名解析負載均衡的優點是將負載均衡工作交給DNS,省略掉了網絡管理的麻煩,缺點就是DNS可能緩存A記錄,不受網站控制。事實上,大型網站總是部分使用DNS域名解析,作爲第一級負載均衡手段,然後再在內部做第二級負載均衡

4.2 數據鏈路層負載均衡(LVS)

圖4-2 LVS負載均衡

       數據鏈路層負載均衡是指在通信協議的數據鏈路層修改mac地址進行負載均衡。

       這種數據傳輸方式又稱作三角傳輸模式,負載均衡數據分發過程中不修改IP地址,只修改目的的mac地址,通過配置真實物理服務器集羣所有機器虛擬IP和負載均衡服務器IP地址一樣,從而達到負載均衡。.

       在上圖中,用戶請求到達負載均衡服務器後,負載均衡服務器將請求數據的目的mac地址修改爲真實WEB服務器的mac地址,並不修改數據包目標IP地址,因此數據可以正常到達目標WEB服務器,該服務器在處理完數據後可以經過網管服務器而不是負載均衡服務器直接到達用戶瀏覽器。

       使用三角傳輸模式的鏈路層負載均衡是目前大型網站所使用的最廣的一種負載均衡手段。在linux平臺上最好的鏈路層負載均衡開源產品是LVS(linux virtual server)。

4.3 IP負載均衡(SNAT)

圖4-3 IP負載均衡

       IP負載均衡:即在網絡層通過修改請求目標地址進行負載均衡

       用戶請求數據包到達負載均衡服務器後,負載均衡服務器在操作系統內核進行獲取網絡數據包,根據負載均衡算法計算得到一臺真實的WEB服務器地址,然後將數據包的IP地址修改爲真實的WEB服務器地址,不需要通過用戶進程處理。真實的WEB服務器處理完畢後,相應數據包回到負載均衡服務器,負載均衡服務器再將數據包源地址修改爲自身的IP地址發送給用戶瀏覽器。

       這裏的關鍵在於真實WEB服務器相應數據包如何返回給負載均衡服務器,一種是負載均衡服務器在修改目的IP地址的同時修改源地址,將數據包源地址改爲自身的IP,即源地址轉換(SNAT),另一種方案是將負載均衡服務器同時作爲真實物理服務器的網關服務器,這樣所有的數據都會到達負載均衡服務器。

       IP負載均衡在內核進程完成數據分發,較反向代理均衡有更好的處理性能。但由於所有請求響應的數據包都需要經過負載均衡服務器,因此負載均衡的網卡帶寬成爲系統的瓶頸

4.4 反向代理負載均衡(nginx)

圖4-4 反向代理

       反向代理的作用是保護網站安全,所有互聯網的請求都必須經過代理服務器,相當於在web服務器和可能的網絡攻擊之間建立了一個屏障。

       代理服務器也可以配置緩存加速web請求。當用戶第一次訪問靜態內容的時候,靜態內存就被緩存在反向代理服務器上,這樣當其他用戶訪問該靜態內容時,就可以直接從反向代理服務器返回,加速web請求響應速度,減輕web服務器負載壓力

       另外,反向代理服務器也可以實現負載均衡的功能。

      由於反向代理服務器轉發請求在HTTP協議層面,因此也叫應用層負載均衡。優點是部署簡單,缺點是可能成爲系統的瓶頸。

5 常見的四層和七層負載均衡

5.1 四層負載均衡

       基於IP+端口的負載均衡:在三層負載均衡的基礎上,通過發佈三層的IP地址(VIP),然後加四層的端口號,來決定哪些流量需要做負載均衡。

       對應的負載均衡器稱爲四層交換機(L4 switch),主要分析IP層及TCP/UDP層,實現四層負載均衡。此種負載均衡器不理解應用協議(如HTTP/FTP/MySQL等等)。

實現四層負載均衡的軟件有:

  • F5:硬件負載均衡器,功能很好,但是成本很高。
  • lvs:重量級的四層負載軟件
  • nginx:輕量級的四層負載軟件,帶緩存功能,正則表達式較靈活
  • haproxy:模擬四層轉發,較靈活

5.2 七層負載均衡

      基於虛擬的URL或主機IP的負載均衡,對應的負載均衡器稱爲七層交換機(L7 switch),除了支持四層負載均衡以外,還有分析應用層的信息,如HTTP協議URI或Cookie信息,實現七層負載均衡。此種負載均衡器能理解應用協議。

實現七層負載均衡的軟件有:

  • haproxy:天生負載均衡技能,全面支持七層代理,會話保持,標記,路徑轉移;
  • nginx:只在http協議和mail協議上功能比較好,性能與haproxy差不多;
  • apache:功能較差
  • Mysql proxy:功能尚可。

總的來說,一般是lvs做4層負載;nginx做7層負載;haproxy比較靈活,4層和7層負載均衡都能做。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章