主頁 > 軟體設計 > 【系統設計】你管這破玩意兒叫負載均衡?

【系統設計】你管這破玩意兒叫負載均衡?

2021-10-10 07:56:54 軟體設計

文章目錄

  • What and Why
  • 七層負載均衡Nginx
    • 初入江湖:加一層Nginx
    • 小試牛刀:動靜分離CDN
    • 瓶頸分析:socket連接池
  • 四層負載均衡LVS
    • LVS的作業原理 之 NAT,網路地址轉換
    • LVS的作業原理 之 DR(Direct Router,直接路由)、
    • 解決NAT模式下的單點問題FullNAT

What and Why

負載均衡和反向代理其實是非常融合的概念,在后端的設計,為了提高系統的可用性,我們往往會使用多個服務器實體給 client 提供服務,但是這些對于客戶端是不應該有感知的,也就是說客戶端在發送請求的時候,是通過一個網址,網址在進行DNS的決議以后會被發送到一個固定的IP地址上(先不考慮DNS的路由選擇),

反向代理的目的就是接受 client發送過來的請求,并將請求轉發到配置到的多個路由實體上,轉發的規則就是負載均衡演算法,

七層負載均衡Nginx

初入江湖:加一層Nginx

沒有什么是加一層解決不了的,在我們的網路層之前,我們可以加一層Nginx進行代理和轉發,Nginx的性能本身還是非常好的,因為使用了master-worker設計,epoll的IO,以及協程機制,當然這些不是本文的討論重點,當然一般為了安全,實際在流量打到 server 前再做一層鑒權操作,鑒權通過了我們才讓它打到 server 上,我們把這一層叫做網關
在這里插入圖片描述

小試牛刀:動靜分離CDN

在實際的后端業務種,可以將請求分為動態請求(需要去資料庫中查詢或者執行邏輯)和靜態請求(如 js,css檔案),不管是動態請求,還是靜態資源請求都打到 tomcat 了,這樣在流量大時會造成 tomcat 承受極大的壓力,其實對于靜態資源的處理 tomcat 不如 Nginx,tomcat 每次都要從磁盤加載檔案比較影響性能,而 Nginx 有 proxy cache 等功能可以極大提升對靜態資源的處理能力,

當然對于靜態資源最好的方案就是存放在CDN上,還可以考慮地理上的就近接入,

同時也需要避免一些單點問題,比如我們前面的Nginx是一個典型的單點,我們可以部署兩臺Nginx,以主備的形式存在,備 Nginx 會通過 keepalived 機制(發送心跳包) 來及時感知到主 Nginx 的存活,發現宕機自己就頂上充當主 Nginx 的角色,
在這里插入圖片描述

瓶頸分析:socket連接池

看起來這樣的架構確實不錯,但要注意的是 Nginx 是七層(即應用層)負載均衡器 ,這意味著如果它要轉發流量首先得和 client 建立一個 TCP 連接,并且轉發的時候也要與轉發到的上游 server 建立一個 TCP 連接,而我們知道建立 TCP 連接其實是需要耗費記憶體(TCP Socket,接收/發送快取區等需要占用記憶體)的,客戶端和上游服務器要發送資料都需要先發送暫存到到 Nginx 再經由另一端的 TCP 連接傳給對方,

因此在 Nginx 的負載能力受限于機器I/O,CPU記憶體等一系列配置,一旦連接很多(比如達到百萬)的話,Nginx 抗負載能力就會急劇下降,

通過對問題的分析我們可以看出,Nginx的強大之處在于非常豐富的整合,自己做到的了反向代理、負載均衡、提供了快取靜態資源的shared dict、lua腳本等,但是在高流量的壓力下,這種豐富的整合反而成為了軟肋,我們希望有一個功能更為單一,性能更強大的選擇,

四層負載均衡LVS

我們希望有一個類似Nginx的路由器,但是只負責轉發包,不需要真正的建立連接,這樣就不需要維護額外的TCP連接,

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

我們在 Nginx 上再加了一層 LVS,以讓它來承接我們的所有流量,當然為了保證 LVS 的可用性,我們也采用主備的方式部署 LVS,另外采用這種架構如果 Nginx 容量不夠我們可以很方便地進行水平擴容,于是我們的架構改進如下:

在這里插入圖片描述

LVS的作業原理 之 NAT,網路地址轉換

我們可以想象一個網路資料包,由源IP,目的IP,源埠,目的埠組成了TCP四元組,可以唯一的確認一條鏈接,
在這里插入圖片描述
首先調度器(LB)接收到客戶的請求資料包時(請求的目的IP為VIP、對外公網IP),根據調度演算法決定將請求發送給哪個后端的真實服務器(RS),然后調度就把客戶端發送的請求資料包的目標IP地址及埠改成后端真實服務器的IP地址(RIP),這樣真實服務器(RS)就能夠接收到客戶的請求資料包了,

真實服務器回應完請求后,查看默認路由(NAT模式下我們需要把RS的默認路由設定為LB服務器,)把回應后的資料包發送給LB,LB再接收到回應包后,把包的**源地址改成對外地址(VIP)**然后發送回給客戶端,

LVS 只是起到了修改 IP 地址并且轉發資料包的功能而已,由于它在資料包的進出程序中都修改了 IP 地址,我們稱這模式為 NAT(Network Address Translation,網路地址轉換) 模式,可以看到這種作業模式下,網路請求包和網路回應包都要經過 LVS,

  • 缺點:性能問題,因為所有資料包的進出都要經過它,這讓它成為了很大的瓶頸,隨著 RS 水平擴展數量越來越多, LVS 遲早要掛掉,

LVS的作業原理 之 DR(Direct Router,直接路由)、

這個方案的核心思路在于:

首先 LVS 還是要承載所有的請求流量(接收所有資料包),然后再根據負載均衡演算法轉發給 RS

RS 處理完后是不經過 LVS,直接將資料包轉發給路由器再發給客戶端的,意味著 RS 必須要有與 LVS 同樣的 VIP(四元組不能變),另外由以上拓撲圖可知,它們也必須在同一個子網里(嚴格地說,應該是同一個 vlan,因為是通過交換機通信的),這就意味著 LVS 和 RS 都必須要有兩個 IP,一個 VIP,一個子網 IP

為了實作這兩種網卡,需要使用到物理網卡eth和虛擬網卡lo,標記紅色的IP地址為VIP,
在這里插入圖片描述

arp_ignore = 1

首先我們知道 LVS 和 RS 都位于同一個子網,子網一般稱為以太網,主要用 mac 地址來通信,位于 ISO 模型的二層,一開始內網的機器互相不知道彼此的 mac 地址,需要通過 arp 機制來根據 IP 獲取其對應的 mac,獲取之后首先會在本地的 arp 表記錄此 IP 對應的 mac(下次就直接在本地快取查找 mac),然后會在包頭上附上 IP 對應的 mac,再將包傳輸出去,交換機就會找到對應的機器了,

所以當客戶端請求 VIP 后,請求到達了上圖中的路由器,路由器要轉發給此 IP 對應的機器,于是它首先發起了一個 arp 請求希望拿到 VIP 對應的 mac 地址,

由于請求都要經過 LVS,所以只讓 LVS 回應 arp,抑制住另外兩臺 RS 對 VIP 的 arp 回應即可,不過請求到達 LVS 后,LVS 還要將包轉發給 RS(假設為 RS2 吧),此時也要用到 arp 來獲取 RS 的 mac 地址,但是注意從 LVS 發起的 arp 請求目的 IP 變成了 RS2 的內網 IP:115.205.4.217(系結在物理網卡 eth0 上),

綜上所述, RS 不能回應目的 IP 為虛擬網卡系結的 VIP 的 arp 請求,但能回應目的 IP 為物理網卡系結的 IP 的 arp 請求,這就是為什么 RS 需要把 VIP 系結在虛擬網卡上,而把內網 IP 系結在物理網卡上的真實原因,就是為了 arp 回應的需要,

通過對RS配置arp_ignore = 1,實作只回應目的 IP 為接收網卡(即物理網卡)上的 IP 的 arp 請求(會忽略目的 IP 為虛擬網卡 上 VIP 的 arp 請求)并且需要讓資料包使用 lo 介面發送

在使用了以上設定以后,所有的請求通過APR決議都會達到LVS上,然后LVS將資料包發送給RS2;RS2在處理完以后將資料包通過lo網口發出,

arp_announce=2

在RS將資料包發送給網關的程序中,同樣需要一次ARP尋找到對應的網關的mac地址,而在ARP協議中需要添加上自己的IP和mac地址的,這里對于RS并不能正常的填寫上自己發送請的lo地址(這個RS的lo地址和LVS的eth地址是一眼給的),否則網卡會更新ARP快取導致之后的請求無法被正確的路由到LVS上,所以 RS2 要發 arp 獲取網關的 mac 時使用的源 IP 應該為其物理網卡(eth0)對應的 IP(即 115.205.4.217)

在DR模式下,需要配置arp_announce=2表示的是忽略 IP 資料包的源 IP 地址,選擇該發送網卡上最合適的本地地址作為 arp 請求的源 IP 地址

解決NAT模式下的單點問題FullNAT

NAT 的基礎上又衍生出了 FullNAT,FullNAT 其實就是為了公有云而生的,
在這里插入圖片描述
NAT 模式下,LVS 只將資料包的目標 IP 改成了 RS 的 IP,而在 FullNAT 模式下,LVS 還會將源 IP 地址也改為 LVS 的內網 IP(修改 IP 主要由 LVS 的內核模塊 ip_vs 來操作),注意上圖 LVS 內網 IP 和 RS 的 IP 是可以在不同網段下的,通常在公有云平臺上,它們是部署在 intranet 即企業內網中的,這樣的話 LVS 就可以跨網段和 RS 通信了,也避免了 LVS 的單點瓶頸,多臺 LVS 都可以將請求轉發給 RS

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

標籤:其他

上一篇:正向代理、反向代理和負載均衡

下一篇:除了 Websocket ,服務端還有什么辦法能向瀏覽器主動推送資訊?

標籤雲
其他(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