LVS 負載均衡

来源:https://www.cnblogs.com/askajohnny/archive/2022/12/15/16985321.html
-Advertisement-
Play Games

LVS 負載均衡 本篇主要介紹一下 lvs 是什麼 以及它的 nat 模式的搭建 配合nginx來演示 1.概述 LVS 是 Linux Virtual Server 的簡寫 (Linux 虛擬伺服器 ), 是由章文嵩博士主導, 它虛擬出一個伺服器集群,然後進行負載均衡的項目, 目前LVS 已經被集 ...


LVS 負載均衡

本篇主要介紹一下 lvs 是什麼 以及它的 nat 模式的搭建 配合nginx來演示

image-20221212163331884

1.概述

LVS 是 Linux Virtual Server 的簡寫 (Linux 虛擬伺服器 ), 是由章文嵩博士主導, 它虛擬出一個伺服器集群,然後進行負載均衡的項目, 目前LVS 已經被集成到Linux內核模塊中了, 外部請求到達LVS後它會根據不同的調度演算法把請求分發到具體的後端真實伺服器, 又根據LVS不同的工作模式 後端伺服器會選擇不同的方式將 響應數據返回, LVS工作模式分為 NAT模式, TUN模式, DR模式

2.思考

為什麼有LVS , 當我們有了 nginx的時候 直接把nginx暴露出去不就行了嗎, nginx 也是負載均衡器啊 ??

因為Nginx工作在 7 層 而 LVS工作在四層 效率高 , 如果你單個把nginx暴露出去 單台nginx 承受不了壓力,需要集群, LVS則充當了Nginx的集群調度者,所有的請求都通過LVS ,僅作請求分發用,沒有流量, 正常不會出現故障

為什麼四冊比七層效率高?

四層是TCP層,使用IP+埠四元組的方式。只是修改下IP地址,然後轉發給後端伺服器,TCP三次握手是直接和後端連接的。只不過在後端機器上看到的都是與代理機的IP的established而已,LVS中沒有握手。

7層代理則必須要先和代理機三次握手後,才能得到7層(HTT層)的具體內容,然後再轉發。意思就是代理機必須要與client和後端的機器都要建立連接。顯然性能不行,但勝在於七層,人工可操作性高,能寫更多的轉發規則。

nginx 支撐 1w - 10w併發;

lvs 支撐 10w - 50w;

F5 支撐 200w - 1000w;

3.LVS NAT 模式

NAT 模式(即:網路地址映射)其工作原理是:客戶端訪問LVS時,LVS通過重寫請求報文的目標地址,且根據預設的調度演算法,將請求分派給後端真實伺服器,真實伺服器接收到請求處理後,發出響應報文也需要通過LVS返回,返回時需要修改報文的源地址,然後返回給客戶,完成整個負載調度過程

  1. DNAT:目標地址轉換,改變的是目標地址
  2. SNAT:源地址轉換,改變的是源地址

NAT 模式就是使用 SNAT 和 DNAT 技術完成報的轉發,NAT 方式可支持任何的操作系統,以及私有網路,並且只需一個 Internet IP 地址,非常節省成本,但是整個系統的性能受到限制。因為NAT模式 響應報文也要經過LVS 會影響LVS 的性能, 不過有DR模式 (Direct Route) 後面有機會在討論

環境準備

角色 IP地址 主機名 服務或工具
Director (LVS) VIP(ens256):172.30.2.151, DIP(ens160):172.16.225.222 lvs ipvsadm
RS1 RIP1(ens160):172.16.225.111 nginxRs1 nginx
RS2 RIP2(ens160):172.16.225.110 nginxRs2 nginx

image-20221212145904380

  • CIP 客戶端的 IP
  • VIP 是功能變數名稱解析的 IP,是集群對外的公網 IP
  • DIP 用來和後端真實伺服器進行數據交互的 IP,請求報文轉發給後端伺服器從此口出去 ( DIP RIP 需要在同一個網段中)
  • RIP 真實伺服器的 IP

4.LVS NAT 模式搭建環境

下麵開始搭建 LVS 的 NAT模式環境

4.1 LVS伺服器網卡配置

LVS 需要2個網卡 一個是對外的 用於作為VIP , 一個是內部網路 和 後端真實IP 一個網段的,我這裡用虛擬機模擬 VIP用橋接網卡 , DIP用僅主機網卡即可

image-20221212150339614

網路配置在 /etc/sysconfig/network-scripts 就不詳細說了

cat ifcfg-ens160

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=ens160
UUID=7d9bac74-252c-49fd-b174-8c4aa6ee65b6
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.222
NETMASK=255.255.255.0
DSN1=114.114.114.114
# 這裡作為DIP 不配置GATEWAY 不讓外網直接訪問這個ip

cat ifcfg-ens256

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=ens256
DEVICE=ens256
ONBOOT=yes
IPADDR=172.30.2.151
GATEWAY=172.30.2.2  
NETMASK=255.255.255.0
DSN1=114.114.114.114

4.2 真實nginxRs1 配置

註意點 就是把要把網關配置為 DIP

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.110
GATEWAY=172.16.225.222 # 註意要把網關改成 DIP 的 因為DNAT後需要去處理分發過來的請求
#GATEWAY=172.16.225.2 
NETMASK=255.255.255.0
DNS1=114.114.114.114

並且在這個機器上配置好 一個nginx

4.3 真實nginxRs2 配置

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.111
GATEWAY=172.16.225.222 # 註意要把網關改成 DIP 的 因為DNAT後需要去處理分發過來的請求
#GATEWAY=172.16.225.2 
NETMASK=255.255.255.0
DNS1=114.114.114.114

並且在這個機器上配置好 一個nginx

4.4 配置LVS 的 ipvs模塊 (通過ipvsadm配置)

ipvs模塊是已經集成到 linux內核了,可以通過ipvsadm 工具去

開啟ip_forward , 開啟路由轉發

# 開啟ip_forward
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

sysctl -p
#安裝LVS管理工具
yum -y install ipvsadm

# 可以通過 ipvsadm -Ln 查看虛擬服務, 此時是沒有配置的

image-20221211081456306

#使用 ipvsadm 命令設置轉發規則  
#-A 添加虛擬伺服器
#-t 表示 TCP 的服務 VIP:PORT
#-s 指定調度演算法 rr 表示 round-robin 平均輪循
#-a 表示添加 real server 的地址
#-r 指定 real server 的 IP 地址
#-m 表示 masquerade 也就是 NAT 方式的 LVS  
#-g 表示 dr模式 後面有機會說
[root@lvs ~] ipvsadm -A -t 172.30.2.151:80 -s rr
[root@lvs ~] ipvsadm -a -t 172.30.2.151:80:80 -r 172.16.225.110 -m
[root@lvs ~] ipvsadm -a -t 172.30.2.151:80:80 -r 172.16.225.111 -m

再次查看 可以看到配置如下

image-20221212152441964

簡單的 curl 測試一下 : 可以看到效果已經出來了 我們訪問了 172.30.2.151 這個 vip 輪訓路由到後端2台真實伺服器的nginx了

image-20221212153135269

ab 壓測一下: 使用ab工具壓測一下

要註意 ab test 是根據返回請求的內容來判斷 是否成功 如果2次返回的數據不同則算作 Failed requests, 我一開始把兩個nginx.html 區分了內容 所以有一半都是錯誤的請求... 要註意哦!

# 把 最大文件描述符調大一點 執行如下命令 mac 中
echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf
sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536
ulimit -n 65536 65536   

也要註意nginx的伺服器的 ulimit -n 以及 nginx.conf中的 worker_connections #每個進程允許的最多連接數

image-20221212161417959

ipvsadm -Ln -c  # 查看 ipvs 連接請求情況

image-20221212161640805

總結

本篇主要介紹了LVS 是什麼它做負載均衡和Nginx的區別,以及它的NAT網路模式的搭建配置, LVS作為集群的入口它是4層網路轉發 不解析url 只是把 ip 跟換一下, 是nginx的10幾倍性能, 並且它的DR模式 會更加提高性能

有了LVS 後 可以把它作為nginx集群的入口 , 可以支持很高的併發, 並且可以在LVS 前面再添加F5硬體負載均衡 (F5 一差不多一個奧迪Q5...)

最後手動搭建了一個 LVS 的NAT模式 體驗了一下使用 ipvsadm 工具搭建一個 lvs集群 ,需要註意的是 NAT模式它的返回是要通過LVS伺服器的所以性能在LVS三種模式中是比較低的, 可以後期改成 DR模式 直接通過後端真實伺服器給客戶端返回結果 不再經過LVS

LVS 的NAT模式 後端伺服器的網關需要配置 為DIP 並且 後端伺服器的IP和DIP要在一個網段中 保證通過 DNAT 可以到達

歡迎大家訪問 個人博客 Johnny小屋
歡迎關註個人公眾號

歡迎關註個人公眾號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 01-骰子游戲 游戲出自Udemy的JS課程中提到的一個游戲,課程主要是對JS部分進行詳細的從0開始的講解,本篇文章是對整個游戲的分析,包括HTMK,CSS和JS,也主要對JS進行刨析。 游戲鏈接:https://pig-game-v2.netlify.app/ 游戲規則:開始玩家1點擊ROLL D ...
  • 自研api服務註冊中心,模擬eureka的實現原理實現,相容舊feign的調用模式。支持服務故障轉移,負載均衡,註冊中心,rpc調用。整體代碼簡單,非常容易定製化改動。支持HttpUrlConnection,HttpClient建立的連接池及擴展。 1)支持輪訓模式負載均衡及擴展。 2)支持消費者端... ...
  • 函數對象 =》C語言中的函數指針 函數對象 儘管函數指針被廣泛用於實現函數回調,但C++還提供了一個重要的實現回調函數的方法,那就是函數對象。函數對象(也稱“函數符”)是重載了“()”操作符的普通類對象。因此從語法上講,函數對象與普通的函數行為類似。 用函數對象代替函數指針有幾個優點: 首先,因為對 ...
  • 隨著業務發展,我們的系統可能面臨著改造升級。改造過程中往往避免不了數據模型的變動,這時候需要將老表老模型遷移到新表新模型,並且還要保證歷史數據的遷移以及映射。 這就帶來了一個問題,老表老模型如何遷移到新表新模型,以下是常用的兩種方案 | 方案 | 是否支持回切 | 優點 | 缺點 | | | | | ...
  • 標準容器->容器適配器 什麼叫適配器? 1:適配器底層沒有自己的數據結構,它是另外一個容器的封裝,它的方法, 全部由底層依賴的容器進行實現的.像標準庫中的stack 如下圖 2:沒有實現自己的迭代器 容器適配器 stack,queue,priotity_queue 沒有迭代器 stacks1; 棧, ...
  • 1.控制語句 1.1.判斷語句 if...elif...else #if 語句(比較/邏輯/成員均可) #字元串/列表/元組/字典 為空返回False,非空返回True #條件成立返回True,不成立返回False ar = "" list = [] tuple = () dic = {} if a ...
  • 如何開發微信小程式 小程式:學習微信開發的語言(前端html、css、js、vue.js) 微信開發者工具 API:restful介面(Python+django+drf框架)。 pycharm 環境搭建 python環境搭建 虛擬環境 django drf pycharm 小程式環境 在微信公眾平 ...
  • data analysis 什麼是數據分析 是把隱藏在一些看似雜亂無章的數據背後的信息提煉出來,總結出所研究對象的內在規律 使得數據的價值最大化 分析用戶的消費行為 制定促銷活動的方案 制定促銷時間和粒度 計算用戶的活躍度 分析產品的回購力度 分析廣告點擊率 決定投放時間 制定廣告定向人群方案 決定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...