負載均衡——LVS,HAProxy和Nginx對比分析(附自學資料)

2022-02-06 程式設計師面試吧

負載均衡(Load Balance)是應用於網際網路後臺系統架構設計中的各層,它將請求均勻分攤到多個操作單元上執行。

目前,在線上環境中應用較多的負載均衡器硬體有F5 BIG-IP,但是硬體設備昂貴,不如軟體適應網際網路公司的快速發展。最常用的負載均衡軟體有LVS、HAProxy和Nginx,結合高可用軟體有Heartbeat、Keepalived,可以搭建出承載海量請求的成熟架構如LVS+Keepalived、HAProxy+keepalived等.

領取方式見文末


一、LVS

自學資料:使用 LVS 實現負載均衡原理及安裝配置詳解

LVS 是 Linux Virtual Server 的簡稱,也就是 Linux 虛擬伺服器。現在 LVS 已經是 Linux 標準內核的一部分,從 Linux2.4 內核以後,已經完全內置了 LVS 的各個功能模塊,無需給內核打任何補丁,可以直接使用 LVS 提供的各種功能。
LVS 自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。

1、LVS 的體系結構

LVS 架設的伺服器集群系統有三個部分組成:

最前端的負載均衡層,用 Load Balancer 表示

中間的伺服器集群層,用 Server Array 表示

最底端的數據共享存儲層,用 Shared Storage 表示

2、LVS 負載均衡機制

LVS 不像 HAProxy 等七層軟負載面向的是 HTTP 包,所以七層負載可以做的 URL 解析等工作,LVS 無法完成。

LVS 是四層負載均衡,也就是說建立在 OSI 模型的第四層——傳輸層之上,傳輸層上有我們熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的負載均衡。因為 LVS 是四層負載均衡,因此它相對於其它高層負載均衡的解決辦法,比如 DNS 域名輪流解析、應用層負載的調度、客戶端的調度等,它的效率是非常高的。

所謂四層負載均衡 ,也就是主要通過報文中的目標地址和埠。七層負載均衡 ,也稱為「內容交換」,也就是主要通過報文中的真正有意義的應用層內容。

LVS 的轉發主要通過修改 IP 地址(NAT 模式,分為源地址修改 SNAT 和目標地址修改 DNAT)、修改目標 MAC(DR 模式)來實現。

3、NAT 模式:網絡地址轉換

NAT(Network Address Translation)是一種外網和內網地址映射的技術。

NAT 模式下,網絡數據報的進出都要經過 LVS 的處理。LVS 需要作為 RS(真實伺服器)的網關。

當包到達 LVS 時,LVS 做目標地址轉換(DNAT),將目標 IP 改為 RS 的 IP。RS 接收到包以後,仿佛是客戶端直接發給它的一樣。RS 處理完,返迴響應時,源 IP 是 RS IP,目標 IP 是客戶端的 IP。這時 RS 的包通過網關(LVS)中轉,LVS 會做源地址轉換(SNAT),將包的源地址改為 VIP,這樣,這個包對客戶端看起來就仿佛是 LVS 直接返回給它的。

4、DR 模式:直接路由

DR 模式下需要 LVS 和 RS 集群綁定同一個 VIP(RS 通過將 VIP 綁定在 loopback 實現),但與 NAT 的不同點在於:請求由 LVS 接受,由真實提供服務的伺服器(RealServer,RS)直接返回給用戶,返回的時候不經過 LVS。

詳細來看,一個請求過來時,LVS 只需要將網絡幀的 MAC 地址修改為某一臺 RS 的 MAC,該包就會被轉發到相應的 RS 處理,注意此時的源 IP 和目標 IP 都沒變,LVS 只是做了一下移花接木。RS 收到 LVS 轉發來的包時,鏈路層發現 MAC 是自己的,到上面的網絡層,發現 IP 也是自己的,於是這個包被合法地接受,RS 感知不到前面有 LVS 的存在。而當 RS 返迴響應時,只要直接向源 IP(即用戶的 IP)返回即可,不再經過 LVS。

DR 負載均衡模式數據分發過程中不修改 IP 地址,只修改 mac 地址,由於實際處理請求的真實物理 IP 地址和數據請求目的 IP 地址一致,所以不需要通過負載均衡伺服器進行地址轉換,可將響應數據包直接返回給用戶瀏覽器,避免負載均衡伺服器網卡帶寬成為瓶頸。因此,DR 模式具有較好的性能,也是目前大型網站使用最廣泛的一種負載均衡手段。

5、LVS 的優點

抗負載能力強、是工作在傳輸層上僅作分發之用,沒有流量的產生,這個特點也決定了它在負載均衡軟體裡的性能最強的,對內存和 cpu 資源消耗比較低。

配置性比較低,這是一個缺點也是一個優點,因為沒有可太多配置的東西,所以並不需要太多接觸,大大減少了人為出錯的機率。

工作穩定,因為其本身抗負載能力很強,自身有完整的雙機熱備方案,如 LVS + Keepalived。

無流量,LVS 只分發請求,而流量並不從它本身出去,這點保證了均衡器 IO 的性能不會受到大流量的影響。

應用範圍比較廣,因為 LVS 工作在傳輸層,所以它幾乎可以對所有應用做負載均衡,包括 http、資料庫、在線聊天室等等。

6、LVS 的缺點

軟體本身不支持正則表達式處理,不能做動靜分離;而現在許多網站在這方面都有較強的需求,這個是 Nginx、HAProxy + Keepalived 的優勢所在。

如果是網站應用比較龐大的話,LVS/DR + Keepalived 實施起來就比較複雜了,相對而言,Nginx / HAProxy + Keepalived 就簡單多了。

二、Nginx

自學資料:nginx中文文檔



Nginx 是一個強大的 Web 伺服器軟體,用於處理高並發的 HTTP 請求和作為反向代理伺服器做負載均衡。具有高性能、輕量級、內存消耗少,強大的負載均衡能力等優勢。

1、Nignx 的架構設計

相對於傳統基於進程或線程的模型(Apache就採用這種模型)在處理並發連接時會為每一個連接建立一個單獨的進程或線程,且在網絡或者輸入/輸出操作時阻塞。這將導致內存和 CPU 的大量消耗,因為新起一個單獨的進程或線程需要準備新的運行時環境,包括堆和棧內存的分配,以及新的執行上下文,當然,這些也會導致多餘的 CPU 開銷。最終,會由於過多的上下文切換而導致伺服器性能變差。

反過來,Nginx 的架構設計是採用模塊化的、基於事件驅動、異步、單線程且非阻塞。

Nginx 大量使用多路復用和事件通知,Nginx 啟動以後,會在系統中以 daemon 的方式在後臺運行,其中包括一個 master 進程,n(n>=1) 個 worker 進程。所有的進程都是單線程(即只有一個主線程)的,且進程間通信主要使用共享內存的方式。

其中,master 進程用於接收來自外界的信號,並給 worker 進程發送信號,同時監控 worker 進程的工作狀態。worker 進程則是外部請求真正的處理者,每個 worker 請求相互獨立且平等的競爭來自客戶端的請求。請求只能在一個 worker 進程中被處理,且一個 worker 進程只有一個主線程,所以同時只能處理一個請求。(原理同 Netty 很像)

2、Nginx 負載均衡

Nginx 負載均衡主要是對七層網絡通信模型中的第七層應用層上的 http、https 進行支持。

Nginx 是以反向代理的方式進行負載均衡的。反向代理(Reverse Proxy)方式是指以代理伺服器來接受 Internet 上的連接請求,然後將請求轉發給內部網絡上的伺服器,並將從伺服器上得到的結果返回給 Internet 上請求連接的客戶端,此時代理伺服器對外就表現為一個伺服器。

Nginx 實現負載均衡的分配策略有很多,Nginx 的 upstream 目前支持以下幾種方式:

輪詢(默認):每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器 down 掉,能自動剔除。

weight:指定輪詢機率,weight 和訪問比率成正比,用於後端伺服器性能不均的情況。

ip_hash:每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決 session 的問題。

fair(第三方):按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

url_hash(第三方):按訪問 url 的 hash 結果來分配請求,使每個 url 定向到同一個後端伺服器,後端伺服器為緩存時比較有效。

3、Nginx 的優點

跨平臺:Nginx 可以在大多數 Unix like OS編譯運行,而且也有 Windows 的移植版本;

配置異常簡單:非常容易上手。配置風格跟程序開發一樣,神一般的配置;

非阻塞、高並發連接:官方測試能夠支撐5萬並發連接,在實際生產環境中跑到2~3萬並發連接數;

事件驅動:通信機制採用 epoll 模型,支持更大的並發連接;

Master/Worker 結構:一個 master 進程,生成一個或多個 worker 進程;

內存消耗小:處理大並發的請求內存消耗非常小。在3萬並發連接下,開啟的10個 Nginx 進程才消耗150M 內存(15M*10=150M);

內置的健康檢查功能:如果 Nginx 代理的後端的某臺 Web 伺服器宕機了,不會影響前端訪問;

節省帶寬:支持 GZIP 壓縮,可以添加瀏覽器本地緩存的 Header 頭;

穩定性高:用於反向代理,宕機的概率微乎其微;

4、Nginx 的缺點

Nginx 僅能支 持http、https 、tcp、 Email等協議,這樣就在適用範圍上面小些,這個是它的缺點;

對後端伺服器的健康檢查,只支持通過埠來檢測,不支持通過 ur l來檢測。不支持 Session 的直接保持,但能通過 ip_hash 來解決;

三、HAProxy

自學資料:HAProxy實戰文檔


HAProxy 支持兩種代理模式 TCP(四層)和HTTP(七層),也是支持虛擬主機的。

HAProxy 的優點能夠補充 Nginx 的一些缺點,比如支持 Session 的保持,Cookie 的引導;同時支持通過獲取指定的 url 來檢測後端伺服器的狀態。

HAProxy 跟 LVS 類似,本身就只是一款負載均衡軟體;單純從效率上來講 HAProxy 會比 Nginx 有更出色的負載均衡速度,在並發處理上也是優於 Nginx 的。HAProxy 支持 TCP 協議的負載均衡轉發,可以對 MySQL 讀進行負載均衡,對後端的 MySQL 節點進行檢測和負載均衡,大家可以用 LVS+Keepalived 對 MySQL 主從做負載均衡。

HAProxy 負載均衡策略非常多:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie)。

文檔來源網絡,僅用作免費交流分享,侵刪!

微信掃描下方二維碼

備註:負載均衡

相關焦點

  • 負載均衡之LVS與Nginx對比
    LVS負載均衡IP隧道模式原理介紹以及配置實戰LVS負載均衡之DR模式原理介紹以及LVS概要文章:LVS負載均衡理論以及算法概要首先要清楚的一點是,LVS是一個四層的負載均衡器,雖然是四層,但並沒有TCP握手以及分手,只是偷窺了IP等信息,而Nginx是一個七層的負載均衡器,所以效率勢必比四層的LVS低很多,但是可操作性比LVS高
  • Nginx+SpringBoot實現負載均衡
    前言本篇文章主要介紹的是Nginx如何實現負載均衡。負載均衡介紹介紹在介紹Nginx的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備,設備商會提供完整成熟的解決方案,比如F5,在數據的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載均衡以Nginx這類軟體為主
  • 詳解負載神器 LVS、Nginx及HAProxy工作原理
    LVS 是四層負載均衡,也就是說建立在 OSI 模型的第四層——傳輸層之上,傳輸層上有我們熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的負載均衡。因為 LVS 是四層負載均衡,因此它相對於其它高層負載均衡的解決辦法,比如 DNS 域名輪流解析、應用層負載的調度、客戶端的調度等,它的效率是非常高的。
  • 使用NGINX和NGINX Plus進行Docker Swarm負載均衡
    您可以創建和擴展服務,執行回滾更新,創建運行狀況檢查等。此外,內置了DNS服務發現和負載均衡,您可以設置覆蓋集群範圍的網絡。Docker Swarm負載均衡拓撲Swarm在所有結點上進行調度、DNS服務發現、擴展和容器負載均衡(在圖中由小框表示)。
  • Nginx負載均衡使用心得
    Nginx負載均衡使用心得 前一段時間在負責實施一個項目,利用nginx的七層負載均衡的良好性能做調度器,後端兩臺PHP應用伺服器,實現靜動態分離處理,在整個系統環境全部部署完後,把應用程式放上去測試時,發現一個問題,現把問題和解決辦法寫出來,與大家一起分享和討論。
  • Nginx 反向代理、負載均衡圖文教程 !
    當然很多都是隨便一說的玩笑話,聽過一笑便可,不必當真,也不必抱怨了好了,今天就直接來說一下主題吧,前端要了解一些運維的Nginx用法,內容不多,簡單看看就好,這兩個功能在工作當中就夠用了,那麼首先來看個問題,什麼是反向代理與負載均衡什麼是反向代理與負載均衡什麼是反向代理當我們有一個伺服器集群,並且伺服器集群中的每臺伺服器的內容一樣的時候,同樣我們要直接從個人電腦訪問到伺服器集群伺服器的時候無法訪問
  • 千萬級負載神器 LVS、Nginx及HAProxy工作原理大圖詳解!
    LVS 是四層負載均衡,也就是說建立在 OSI 模型的第四層——傳輸層之上,傳輸層上有我們熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的負載均衡。因為 LVS 是四層負載均衡,因此它相對於其它高層負載均衡的解決辦法,比如 DNS 域名輪流解析、應用層負載的調度、客戶端的調度等,它的效率是非常高的。所謂四層負載均衡 ,也就是主要通過報文中的目標地址和埠。
  • 誰說前端不需要懂-Nginx反向代理與負載均衡
    今天就直接來說一下主題吧,前端要了解一些運維的Nginx用法,內容不多,簡單看看就好,這兩個功能在工作當中就夠用了,那麼首先來看個問題,什麼是反向代理與負載均衡什麼是反向代理與負載均衡什麼是反向代理當我們有一個伺服器集群,並且伺服器集群中的每臺伺服器的內容一樣的時候,同樣我們要直接從個人電腦訪問到伺服器集群伺服器的時候無法訪問
  • 基於Docker部署 Tomcat集群、 Nginx負載均衡
    博文主要介紹了Tomcat 集群+ Ngixn 負載的Docker環境部署。查看負載方式:–volumes-from 方式重寫Dockerfile文件,構建鏡像FROM nginxLABEL maintainer="uag"ENV REFRESHED_AT
  • 一文帶你認識keepalived,再帶你通關LVS+Keepalived!
    該項目的主要目標是為Linux系統和基於Linux的基礎結構提供負載均衡和高可用性的簡單而強大的功能。負載平衡框架依賴於提供第4層負載平衡的著名且廣泛使用的Linux虛擬伺服器(IPVS)內核模塊。Keepalived實現了一組VIP功能,以根據其運行狀況動態,自適應地維護和管理負載平衡的伺服器池。另一方面,VRRP實現了高可用性 協議。VRRP是路由器故障轉移的基礎。
  • 從0開始,在Linux中配置Nginx反向代理、負載均衡、session共享、動靜分離
    nginx:**高並發處理能力強、擅長處理靜態請求、反向代理、均衡負載。**下面詳細說明Nginx和Apache區別[1]:nginx是輕量級的web服務,比apache佔用更少的內存及資源,且並發能力更強,在高並發下nginx能保持低資源、低消耗、高性能。另外,nginx具有高度模塊化的設計,編寫模塊相對簡單,社區活躍,高性能模塊出品迅速。
  • 負載均衡、分布式、集群的理解以及多臺伺服器代碼如何同步
    所以負載均衡的概念就出現了。負載均衡負載均衡是指基於反向代理能將現在所有的請求根據指定的策略算法,分發到不同的伺服器上。常用實現負載均衡的可以用nginx,lvs。但是現在也有個問題,如果負載均衡伺服器出現問題了怎麼辦?所有冗餘的概念就出現了。冗餘冗餘其實就是兩個或者多臺伺服器 一個主伺服器,一個從伺服器。
  • PHP學習資料推薦(書籍篇)
    根據我自己對php後端認知,以及現在市場需求了解到的,推薦下學習資料,分書籍,視頻和公眾號,博客四類,這次主要推薦書籍,方便大家後面學習提高。     2,算法方面:《數據結構與算法分析-c語言描述》,為什麼是這本,因為這本最短,最能看下去,而且還是經典作品,《算法》《算法導論》雖然經典,但是確實很難看下去,太厚了。     3,c語言方面:《c與指針》《c專家編程》《c陷阱與缺陷》,這三本書比較經典,打一個基礎,方便閱讀redis,nginx和php源碼,以及到後面擴展他們的功能。
  • 大型網站架構系列:負載均衡詳解
    2.4均衡策略 nginx的負載均衡策略可以劃分為兩大類:內置策略和擴展策略。內置策略包含加權輪詢和ip hash,在默認情況下這兩種策略會編譯進nginx內核,只需在nginx配置中指明參數即可。擴展策略有很多,如fair、通用hash、consistent hash等,默認不編譯進nginx內核。
  • 講講億級PV的負載均衡架構!
    負載均衡,大家可能聽過什麼3層負載均衡、4層負載均衡、7層負載均衡什麼的?那這是怎麼分的呢,ok,是根據osi七層網絡模型來分的,例如nginx是工作在應用層,應用層剛好是在第7層,因此nginx又可以稱為7層負載均衡。我本來想一層層慢慢講,從最基礎的網絡協議開始講起,想了想又覺得這種講法不適合速成。
  • 分布式系統的負載均衡
    什麼是負載均衡?記得第一次接觸 Nginx 是在實驗室,那時候在伺服器部署網站需要用 Nginx 。Nginx 是一個服務組件,用來反向代理、負載平衡和 HTTP 緩存等。那麼這裡的 負載均衡 是什麼?負載均衡(LB,Load Balance),是一種技術解決方案。用來在多個資源(一般是伺服器)中分配負載,達到最優化資源使用,避免過載。
  • 一個字「絕」丨Nginx負載均衡解決的問題和實現方式都在這裡啦!
    這不,聊到了Nginx,網際網路項目必備的技能點了,我說你是不是要求太高,用自己的技術水平去要求面試者,他說還真沒有,就是一般性的問題而已,我說你都問了啥,說來聽聽,下面是他的問題:負載均衡是為了解決什麼問題?有哪幾種實現負載均衡的方式?
  • welcome to nginx|nginx是什麼
    >welcome to nginx,歡迎來到 nginx 的世界,如果你是一個專業網站建設人員你可能接觸最多的就是阿帕奇 apache,現在更多的網站建設人員都開始使用 LINUX 伺服器,那麼 LINUX 伺服器更好的會使用到 nginx,那麼什麼是 nginx,nginx 有什麼用,那麼下面 welcome to nginx 的世界,下面小編將帶大家介紹 nginx
  • Nginx裸機、虛擬機、K8S Ingress Controller不同部署方式性能對比
    NGINX Ingress Controller 將值得信賴的 NGINX 開源和 NGINX Plus 軟體負載均衡器與自動化配置相結合,以確保 Kubernetes 集群中的應用程式可靠、安全且高速地交付。為了確定滿足您的性能和擴展需求的最佳且最實惠的本地解決方案,我們提供了一個性能測試指標,用於比較不同環境中的 NGINX 性能。
  • AscenLink負載均衡設備性能分析
    在選取大型負載均衡設備的時候,我們顧慮的因素很多。因為其昂貴的價格,我們更要謹慎對待。下文為讀者們介紹一款設備——AscenLink負載均衡設備。它的性能很突出,讓我們隨著文章一起來看看吧。AscenLink負載均衡設備性能1:VPN負載均衡及容錯採用Xtera領先的VPN負載均衡及容錯技術,兩地間可同時建多條VPN鏈路,增加兩地間VPN鏈路的帶寬和速度,當任何一條鏈路發生故障時,AscenLink可自動引導VPNTunnel至正常的鏈路上,使VPN連線不中斷,達到VPN鏈路的雙向負載均衡及容錯。