主頁 > 軟體設計 > 一文理清負載均衡(nginx,LVS)的作業原理

一文理清負載均衡(nginx,LVS)的作業原理

2021-05-07 11:15:40 軟體設計

根據規模的提升在不同的階段需要使用不同的技術和架構,具體的需求需要具體分析,如果是中小型的 Web 應用,

  • 榷訓躍小于 1000 萬,使用 nginx 就可以完全滿足了;
  • 大型網站或重要的服務,并且服務比較多時,就可以考慮使用 LVS

Nginx

Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器,

Nginx 特點是占有記憶體少,并發能力強,nginx 的并發能力在同型別的網頁服務器中表現較好,

Nginx 的簡單架構:

一文理清負載均衡(nginx,LVS)的作業原理

Nginx 的架構設計

Nginx 的架構設計采用的是模塊化的,基于事件驅動、異步、單執行緒且非阻塞(epoll 模型)

Nginx 使用多路復用和事件通知,Nginx 啟動后,在后臺以 daemon 的方式在系統中運行,其中會包括一個主(master)行程,n(n≥1)個作業(worker)行程,

所有的行程都是單執行緒(即只有一個主執行緒)的,行程間通信主要使用共享記憶體的方式,

其中,master 行程用于接收外部的請求,發送信號給 worker 行程,同時監控 worker 行程的作業狀態,

worker 行程用來處理外部請求資訊,請求只能在一個 worker 行程中被處理,一個 worker 行程只有一個主執行緒,同時只能處理一個請求,

Nginx 負載均衡

Nginx 負載均衡是對七層網路通信模型中的應用層(HTTP,HTTPS)進行的,

Nginx 是以反向代理的方式進行負載均衡

  • 反向代理:是以代理服務器來接收用戶的請求,然后將請求發給內部網路上的服務器,并將服務器上的結果回傳給請求的客戶端,此時代理服務器就是一個服務器,
  • 負載均衡:就是將這些客戶端的請求按照某種策略分攤到后臺多臺服務器上面,進行處理,

Nginx 的 upstream 目前支持 6 種演算法分配方式:

一文理清負載均衡(nginx,LVS)的作業原理

輪詢

最基本的配置方法,它是 upstream 模塊默認的負載均衡默認策略,每個請求會按時間順序逐一分配到不同的后端服務器,

有如下引數:

一文理清負載均衡(nginx,LVS)的作業原理

在 30 秒內錯誤次數超過 2 次,就認為服務器已經不能訪問了,下次就不會訪問該機器

server 10.168.226.1:8080 max_fails=2 fail_timeout=30s;

server 10.168.226.2:8080 max_fails=2 fail_timeout=30s;

weight

權重方式,在輪詢策略的基礎上指定輪詢的幾率

server 10.168.226.1:8080 weight=1 ;

server 10.168.226.2:8080 weight=2;

注意:

  • 權重越高分配到需要處理的請求越多,
  • 此策略比較適合服務器的硬體配置差別比較大的情況,

ip_hash

指定負載均衡器按斬訓于客戶端 IP 的分配方式,這個方法確保了相同的客戶端的請求一直發送到相同的服務器,以保證 session 會話,

這樣每個訪客都固定訪問一個后端服務器,可以解決 session 不能跨服務器的問題,

ip_hash; # 保證每個訪客固定訪問一個后端服務器

server 10.168.226.1:8080 weight=1 ;

server 10.168.226.2:8080 weight=2;

注意:

ip_hash在nginx1.3版本之后才有的 ip_hash不能與backup同時使用這種策略適合有狀態服務,比如session 當有服務器需要剔除,必須手動down掉,

least_conn

把請求轉發給連接數較少的后端服務器,輪詢演算法是把請求平均的轉發給各個后端服,使它們的負載大致相同,

但是,有些請求占用的時間很長,會導致所在的后端負載較高,這種情況下,least_conn這種方式就可以達到更好的負載均衡效果least_conn;

server 10.168.226.1:8080 weight=1;

server 10.168.226.2:8080 weight=2;

注意:

這種負載均衡策略適合請求處理時間長短不一致造成服務器過載的情況

第三方策略

第三方的負載均衡策略的實作需要安裝第三方插件(upstream_fair)

  • fair安裝服務器端回應時間來分配請求,回應時間段的優先分配fair;server 10.168.226.1:8080 weight=1;
    server 10.168.226.2:8080 weight=2;
  • url_hash按訪問 URL 的 hash 結果來分配請求,是每個 URL 定向知道同一個后端服務器,要配合緩沖命中來使用同一個資源多次求,可能會到達不同的服務器上,導致不必要的多次下載,快取命中率不高以及一些資源時間的浪費,而使用 url_hash,可以使得同一個 URL 會到達同一臺服務器,一段快取了資源,再次請求的時候,就可以從快取中讀取,需要 hash 軟體包
  • hash $request_uri; # 實作每個 URL 定向到同一個后端服務器
  • server 10.168.226.1:8080 weight=1;
    server 10.168.226.2:8080 weight=2;

Nginx 的優點

  • 跨平臺:Nginx 可以在 Linux 上編譯運行,也可以在 window 上運行
  • 配置簡單:直接可以通過簡單修改組態檔,容易上手
  • 非阻塞、高并發:官網理論可以支持 5 萬并發連接,在實際生產環境也可以跑到 2-3 萬的并發
  • 事件驅動:采用 epoll 模型,支持更多的并發連接
  • 記憶體消耗小:記憶體和 CPU 占用率低,(為 Apache 的 1/5-1/10)
  • 內置健康檢查:Nginx 代理的后端的某臺服務器宕機了,會自動不訪問該機器

Nginx 的缺點

  • Nginx 僅能支持 HTTP,HTTPS,tcp,email 等協議
  • 不支持直接保存 session,可以通過 ip_hash 來支持

LVS

LVS 就是 Linux 虛擬(Virtual Server)服務器,從 Linux 內核 2.4 之后,內置了 LVS 的各個功能模塊,就可以直接 使用 LVS 提供的功能,

LVS 的體系架構

一文理清負載均衡(nginx,LVS)的作業原理

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

  • 最前端的負載均衡層,用 Load Balancer 表示
  • 中間的服務器集群層,用 Server Array 表示
  • 最底層的資料共享層,Shard storage 表示

負載均衡機制

LVS 是四層負載均衡,建立在 OSI 模型的第四層——傳輸層之上,傳輸層有 TCP/UDP,相對于其它高層負載均衡的方法,比如 DNS 域名輪詢決議,應用層負載的調度,客戶端的調度等,它的效率都非常高,

  • 四層負載均衡:主要通過報文中的目標地址和埠
  • 七層負載均衡:也稱為“內容交換”,主要通過報文中的 真正有意義的應用層內容,

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

LVS 相關術語

DS:Director Server,指的是前端負載均衡器節點,

RS:Real Server,后端真實的作業服務器,

VIP:向外部直接面向用戶請求,作為用戶請求的目標的 IP 地址,

DIP:Director Server IP,主要用于和內部主機通訊的 IP 地址,

RIP:Real Server IP,后端服務器的 IP 地址,

CIP:Client IP,訪問客戶端的 IP 地址

NAT 模式:網路地址轉換

NAT(network address transaction)是外網和內網地址映射的技術,

NAT 模式下,網路資料的進出都要經過 LVS 處理,LVS 需要作為真實服務器的網關,

一文理清負載均衡(nginx,LVS)的作業原理

  • 當包請求到 LVS 時,LVS 做目標地址轉換(DNAT),將目標 IP 改為 RS 的 IP,
  • RS 處理完,回傳回應時,源 IP 是 RS IP,目標 IP 是客戶端的 IP,
  • RS 的包通過網關(LVS)中轉,LVS 做源地址轉換(SNAT),將包的源地址改為 VIP,這樣,這個包對客戶端來說就像是 LVS 直接回傳給它的,

DR 模式:直接路由

DR 模式下需要 LVS 和 RS 集群系結同一個 VIP,與 NAT 的不同點在于:

請求由 LVS 接受,由真實提供服務的服務器(RS)直接發放給用戶,回傳的時候不經過 LVS,

一文理清負載均衡(nginx,LVS)的作業原理

一個請求程序中,LVS 只需要將網路幀的 Mac 地址修改為某一臺 RS 的 MAC,該請求就去會被轉發到回應的 RS 處理,此時的源 IP 和目標 IP 都沒有變,

RS 收到 LVS 轉發來的請求時,鏈路層發現 Mac 地址是自己的,當上面的網路層,也發現 IP 是自己的,于是這個包被合法的接受,RS 感知不到前面有 RS 的存在,當 RS 回傳回應時,只要直接向源 IP 回傳即可,不再經過 LVS,

DR 負載均衡模式資料分發程序中不修改 IP 地址,只修改 Mac 地址,由于實際處理請求的真實物理 IP 地址和 資料請求目的 IP 地址一致,所以不需要通過負載均衡服務器進行地址轉換,就可以將回應資料直接回傳給瀏覽器,避免服務器網卡帶寬成為瓶頸,

DR 模式具有較好的性能,也是目前大型網站使用最廣泛的一種負載均衡,

LVS 的優點

  • 負載能力強,作業在傳輸層上僅作為分發的作用,沒有流量的產生,對記憶體和 CPU 資源消耗比較低
  • 配置簡單,很容易上手
  • 作業穩定,有完整的雙機熱備方案,如:LVS+Keepalived
  • 無流量,LVS 只分發請求
  • 應用范圍比較廣,LVS 作業在傳輸層,幾乎可以對所有應用做負載均衡,包括 HTTP,資料庫

LVS 的缺點

  • 軟體本身不支持正則運算式,不能做動靜方法分離
  • 網站應用比較龐大的話,LVS 實施起來比較復雜

在這里插入圖片描述

這些資料,對于【軟體測驗】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你

關注我的微信公眾號【程式員二黑】免費獲取

最后,寫給大家:每一個優秀的人,都不是帶著與生俱來的光環的,也不一定是比別人幸運,他們只是在任何一件小事上,都對自己有所要求,不因舒適而散漫放縱,不因辛苦而放棄追求,雕塑自己的程序,必定伴隨著疼痛與辛苦,可那一錘一鑿的自我敲打,終究能讓我們識訓一個更好的自己,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/283208.html

標籤:其他

上一篇:Laxcus集群作業系統的分布計算模型

下一篇:資料倉庫基礎知識學習筆記

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more