負載均衡很難?看完這篇全懂了

來自:金鐘路上小碼工

鏈接:https://www.cnblogs.com/danbing/p/7459224.html


一、什么是負載均衡?

互聯網早期,業務流量比較小并且業務邏輯比較簡單,單臺服務器便可以滿足基本的需求;但隨著互聯網的發展,業務流量越來越大并且業務邏輯也越來越復雜,單臺機器的性能問題以及單點問題凸顯了出來,因此需要多臺機器來進行性能的水平擴展以及避免單點故障。但是要如何將不同的用戶的流量分發到不同的服務器上面呢?

640?wx_fmt=png


早期的方法是使用DNS做負載,通過給客戶端解析不同的IP地址,讓客戶端的流量直接到達各個服務器。但是這種方法有一個很大的缺點就是延時性問題,在做出調度策略改變以后,由于DNS各級節點的緩存并不會及時的在客戶端生效,而且DNS負載的調度策略比較簡單,無法滿足業務需求,因此就出現了負載均衡。

640?wx_fmt=png


客戶端的流量首先會到達負載均衡服務器,由負載均衡服務器通過一定的調度算法將流量分發到不同的應用服務器上面,同時負載均衡服務器也會對應用服務器做周期性的健康檢查,當發現故障節點時便動態的將節點從應用服務器集群中剔除,以此來保證應用的高可用。

640?wx_fmt=png


負載均衡又分為四層負載均衡和七層負載均衡。四層負載均衡工作在OSI模型的傳輸層,主要工作是轉發,它在接收到客戶端的流量以后通過修改數據包的地址信息將流量轉發到應用服務器。

七層負載均衡工作在OSI模型的應用層,因為它需要解析應用層流量,所以七層負載均衡在接到客戶端的流量以后,還需要一個完整的TCP/IP協議棧。七層負載均衡會與客戶端建立一條完整的連接并將應用層的請求流量解析出來,再按照調度算法選擇一個應用服務器,并與應用服務器建立另外一條連接將請求發送過去,因此七層負載均衡的主要工作就是代理。

二、四層和七層負載均衡的區別?

2.1 - 技術原理上的區別。


所謂四層負載均衡,也就是主要通過報文中的目標地址和端口,再加上負載均衡設備設置的服務器選擇方式,決定最終選擇的內部服務器。

以常見的TCP為例,負載均衡設備在接收到第一個來自客戶端的SYN 請求時,即通過上述方式選擇一個最佳的服務器,并對報文中目標IP地址進行修改(改為后端服務器IP),直接轉發給該服務器。TCP的連接建立,即三次握手是客戶端和服務器直接建立的,負載均衡設備只是起到一個類似路由器的轉發動作。在某些部署情況下,為保證服務器回包可以正確返回給負載均衡設備,在轉發報文的同時可能還會對報文原來的源地址進行修改。

640?wx_fmt=png

所謂七層負載均衡,也稱為“內容交換”,也就是主要通過報文中的真正有意義的應用層內容,再加上負載均衡設備設置的服務器選擇方式,決定最終選擇的內部服務器。

以常見的TCP為例,負載均衡設備如果要根據真正的應用層內容再選擇服務器,只能先代理最終的服務器和客戶端建立連接(三次握手)后,才可能接受到客戶端發送的真正應用層內容的報文,然后再根據該報文中的特定字段,再加上負載均衡設備設置的服務器選擇方式,決定最終選擇的內部服務器。

負載均衡設備在這種情況下,更類似于一個代理服務器。負載均衡和前端的客戶端以及后端的服務器會分別建立TCP連接。所以從這個技術原理上來看,七層負載均衡明顯的對負載均衡設備的要求更高,處理七層的能力也必然會低于四層模式的部署方式。那么,為什么還需要七層負載均衡呢?

2.2 - 應用場景的需求。

七層應用負載的好處,是使得整個網絡更"智能化", 參考我們之前的另外一篇專門針對HTTP應用的優化的介紹,就可以基本上了解這種方式的優勢所在。例如訪問一個網站的用戶流量,可以通過七層的方式,將對圖片類的請求轉發到特定的圖片服務器并可以使用緩存技術;將對文字類的請求可以轉發到特定的文字服務器并可以使用壓縮技術。

當然這只是七層應用的一個小案例,從技術原理上,這種方式可以對客戶端的請求和服務器的響應進行任意意義上的修改,極大的提升了應用系統在網絡層的靈活性。很多在后臺,(例如Nginx或者Apache)上部署的功能可以前移到負載均衡設備上,例如客戶請求中的Header重寫,服務器響應中的關鍵字過濾或者內容插入等功能。

另外一個常常被提到功能就是安全性。網絡中最常見的SYN Flood攻擊,即黑客控制眾多源客戶端,使用虛假IP地址對同一目標發送SYN攻擊,通常這種攻擊會大量發送SYN報文,耗盡服務器上的相關資源,以達到Denial of Service(DoS)的目的。

從技術原理上也可以看出,四層模式下這些SYN攻擊都會被轉發到后端的服務器上;而七層模式下這些SYN攻擊自然在負載均衡設備上就截止,不會影響后臺服務器的正常運營。另外負載均衡設備可以在七層層面設定多種策略,過濾特定報文,例如SQL?Injection等應用層面的特定攻擊手段,從應用層面進一步提高系統整體安全。

現在的7層負載均衡,主要還是著重于應用廣泛的HTTP協議,所以其應用范圍主要是眾多的網站或者內部信息平臺等基于B/S開發的系統。 4層負載均衡則對應其他TCP應用,例如基于C/S開發的ERP等系統。

2.3 - 七層應用需要考慮的問題。

  • 是否真的必要,七層應用的確可以提高流量智能化,同時必不可免的帶來設備配置復雜,負載均衡壓力增高以及故障排查上的復雜性等問題。在設計系統時需要考慮四層七層同時應用的混雜情況。

  • 是否真的可以提高安全性。例如SYN Flood攻擊,七層模式的確將這些流量從服務器屏蔽,但負載均衡設備本身要有強大的抗DDoS能力,否則即使服務器正常而作為中樞調度的負載均衡設備故障也會導致整個應用的崩潰。

  • 是否有足夠的靈活度。七層應用的優勢是可以讓整個應用的流量智能化,但是負載均衡設備需要提供完善的七層功能,滿足客戶根據不同情況的基于應用的調度。最簡單的一個考核就是能否取代后臺Nginx或者Apache等服務器上的調度功能。能夠提供一個七層應用開發接口的負載均衡設備,可以讓客戶根據需求任意設定功能,才真正有可能提供強大的靈活性和智能性。


三、負載均衡的算法?

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的請求轉發至同一服務器的算法。


四、負載均衡的實現(DNS > 數據鏈路層 > IP層 > Http層)?

1 - DNS域名解析負載均衡(延遲)

640?wx_fmt=png

利用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域名解析,作為第一級負載均衡手段,然后再在內部做第二級負載均衡。

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

640?wx_fmt=png

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

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

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

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

3 - IP負載均衡(SNAT)

640?wx_fmt=png


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

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

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

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

4 - HTTP重定向負載均衡(少見)

640?wx_fmt=png


HTTP重定向服務器是一臺普通的應用服務器,其唯一的功能就是根據用戶的HTTP請求計算一臺真實的服務器地址,并將真實的服務器地址寫入HTTP重定向響應中(響應狀態嗎302)返回給瀏覽器,然后瀏覽器再自動請求真實的服務器。

這種負載均衡方案的優點是比較簡單,缺點是瀏覽器需要每次請求兩次服務器才能拿完成一次訪問,性能較差;使用HTTP302響應碼重定向,可能是搜索引擎判斷為SEO作弊,降低搜索排名。重定向服務器自身的處理能力有可能成為瓶頸。因此這種方案在實際使用中并不見多。

5 - 反向代理負載均衡(nginx)

640?wx_fmt=png


傳統代理服務器位于瀏覽器一端,代理瀏覽器將HTTP請求發送到互聯網上。而反向代理服務器則位于網站機房一側,代理網站web服務器接收http請求。

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

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

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

640?wx_fmt=png


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

參考文章

[1 - MGW——美團點評高性能四層負載均衡]
[2 - 四層和七層負載均衡的區別]
[3 - 負載均衡算法及手段]


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272429.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

配置樹莓派linux的內核和編譯并將鏡像拷貝至樹莓派

驅動代碼的編寫需要一個提前編譯好的內核,編譯內核就必須配置,配置的最終目標會生成.config文件,該文件指導makefile去把有用的東西組織成內核。 如何生成.config文件: 第一種方式: 廠家配linux內核源碼,比…

h5 與原生 app 交互的原理

作者:senntyousegmentfault.com/a/1190000016759517現在移動端 web 應用,很多時候都需要與原生 app 進行交互、溝通(運行在 webview中),比如微信的 jssdk,通過 window.wx 對象調用一些原生 app 的功能。所以…

(原)直方圖的相似性度量

轉載請注明出處: http://www.cnblogs.com/darkknightzh/p/5147982.html 對于兩直方圖 $S\left\{ {{s}_{1}},\cdots {{s}_{n}} \right\}$ 及 $M\left\{ {{m}_{1}},\cdots {{m}_{n}} \right\}$,n為直方圖維數(如255),這兩…

【ROS問題】rqt_plot運行報錯

本人Linux版本:Ubuntu 18.04 LTS ROS版本:Melodic 方案一: 你看那個報錯,全是Matplotlib的報錯,是這個東西版本不夠高,重新安裝就好啦。 python -m pip install -U pip python -m pip install -U matp…

BCP使用筆記整理

一、BCP 簡介大容量復制程序實用工具 (bcp) 可以在 Microsoft SQL Server 實例和用戶指定格式的數據文件間大容量復制數據。 使用 bcp 實用工具可以將大量新行導入 SQL Server 表,或將表數據導出到數據文件。 除非與 queryout 選項一起使用,否則使用該實…

怎樣基于谷歌地圖的Server緩存公布Image Service服務

怎樣基于谷歌地圖的Server緩存公布Image Service服務第一步:下載地圖數據下載安裝水經注萬能地圖下載器,啟動時僅僅選擇電子.谷歌(這里能夠依據自己的須要選擇)。例如以下圖所看到的。找到成都后框選下載成都區域,例如…

ROS文件系統介紹

預備工作 本教程中我們將會用到ros-tutorials程序包&#xff0c;請先安裝&#xff1a; sudo apt-get install ros-<distro>-ros-tutorials快速了解文件系統概念 Packages: 軟件包&#xff0c;是ROS應用程序代碼的組織單元&#xff0c;每個軟件包都可以包含程序庫、可執…

接軟件開發項目,你需要知道這些!

作為一個程序員&#xff0c;跟客戶交流是最困難的事情了&#xff0c;所以在上路之前&#xff0c;復習一下這兩年遇到的奇怪的客戶言論&#xff0c;以便以后更好地跟客戶交流。1、不就是做個網站&#xff08;或者別的&#xff09;么&#xff1f;為什么這么貴&#xff1f;一定耐心…

整理的一些比較基礎的面試知識點

1、面向對象的三大特性或其具體體現在哪 2、頁面間傳值方式 3、session cookie原理及區別 4、hasstable&#xff0c;dictionary&#xff0c;List &#xff0c;collection 5、類和抽象類&#xff0c;類和接口&#xff0c;接口和抽象類區別及適合場景 6、Get和Post比較優缺點或區…

五種類型的程序員,你屬于哪一種?

在我的編程生涯中,我碰到過很多奇奇怪怪的對手和同盟。我把這些編碼戰士們分成五類&#xff0c;有些人是你隊伍中的好伙伴&#xff0c;有些人則是搗蛋者&#xff0c;讓你的每一個計劃都完不成。不管怎么說&#xff0c;他們在軟件開發的諸神殿上都占有一席之地。如果你的團隊中沒…

創建ROS程序包

一個catkin程序包由什么組成? 一個程序包要想稱為catkin程序包必須符合以下要求&#xff1a; 該程序包必須包含catkin compliant package.xml文件這個package.xml文件提供有關程序包的元信息。 程序包必須包含一個catkin 版本的CMakeLists.txt文件&#xff0c;而Catkin meta…

一些有用的js插件

getfuelux.com 一系列插件合集 Ion.RangeSlider 超級牛的范圍選擇控件 Ion.CheckRadio Ion.Tabs Ion.Calendar Ion.ImageSlider Ion.Zoom www.ngwidgets.com Advanced UI Widgets for AngularJS http://www.jq22.com/ jQuery 插件庫 http://jvectormap.com/ 地圖插件 X-…

C# FTP操作類庫

class FTP_Class{string ftpServerIP;string ftpUserID;string ftpPassword;FtpWebRequest reqFTP; #region 連接/// <summary>/// 連接FtpWebRequest/// </summary>/// <param name"path"></param>private void Connect(String path)/…

安裝并配置ROS環境

參考該網址內容&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/InstallingandConfiguringROSEnvironment

Cropper – 簡單的 jQuery 圖片裁剪插件

Cropper 是一個簡單的 jQuery 圖像裁剪插件。它支持選項&#xff0c;方法&#xff0c;事件&#xff0c;觸摸&#xff08;移動&#xff09;&#xff0c;縮放&#xff0c;旋轉。輸出的裁剪數據基于原始圖像大小&#xff0c;這樣你就可以用它們來直接裁剪圖像。 如果你嘗試裁剪跨域…

C# JSON格式數據用法

JSON簡介JSON(全稱為JavaScript ObjectNotation) 是一種輕量級的數據交換格式。它是基于JavaScript語法標準的一個子集。JSON采用完全獨立于語言的文本格式&#xff0c;可以很容易在各種網絡、平臺和程序之間傳輸。JSON的語法很簡單&#xff0c;易于人閱讀和編寫&#xff0c;同…

Ros命令及功能

運行小烏龜代碼&#xff1a; roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key一些命令及作用 ros 加tap //查看電腦中以ros開頭的命令 rqt_graph //將系統內的主要資源以可視化的形式展現出來 rosnode list //列出系統節點 命令 --help //查看命…

數據庫——環境初建改端口和密碼(轉)

一、修改APACHE的監聽端口 2、在界面中選apache&#xff0c;彈出隱藏菜單選項&#xff0c;打開配置文件httpd.conf; 2、找到Listen 80 和 ServerName localhost:80; 3、將80改成801&#xff08;當然自己也可以設定別的不使用的端口&#xff0c;例如8000等&#xff09;; 4、保存…

文件系統認知

什么是文件系統 常規認知是&#xff1a;linux根目錄那些東西 百科&#xff1a;文件系統是操作系統用于明確存儲設備組織文件的方法&#xff0c;操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統&#xff0c;簡稱文件系統。 以上說的方法&#xff1a;就是文件管理…

何謂悲觀鎖與樂觀鎖

樂觀鎖對應于生活中樂觀的人總是想著事情往好的方向發展&#xff0c;悲觀鎖對應于生活中悲觀的人總是想著事情往壞的方向發展。這兩種人各有優缺點&#xff0c;不能不以場景而定說一種人好于另外一種人。 悲觀鎖 總是假設最壞的情況&#xff0c;每次去拿數據的時候都認為別人會…