高併發解決方法-LVS、LVS-NAT、LVS-DR

来源:https://www.cnblogs.com/xuxuxuxuxu/archive/2023/09/01/17673002.html
-Advertisement-
Play Games

# 高併發解決方法-LVS、LVS-NAT、LVS-DR ## 前言: 集群功能分類: 1.LB Load Balancing,負載均衡(增加處理能力),有一定高可用能力,但不是高可用集群,是以提高服務的**併發處理**能力為根本著重點。**LVS** 2.HA High Availability ...


高併發解決方法-LVS、LVS-NAT、LVS-DR

前言:

集群功能分類:

1.LB Load Balancing,負載均衡(增加處理能力),有一定高可用能力,但不是高可用集群,是以提高服務的併發處理能力為根本著重點。LVS

2.HA High Availability 高可用集群(增加服務可用性),是以提升服務的始終線上能力為著重點,不會因為宕機而導致服務不可用。Keepalived

大型網站高併發解決方案LVS

負載均衡

(Load Balance)負載均衡,當然這是一個簡單的概括,比如,我有10台機器都提供web服務,那麼我如何均衡的利用這10台機器呢,讓這10台機器保證高性能、高可用、高併發就是負載均衡要考慮和要做的事情。

實現負載均衡一般可以使用順序、比重、流量、服務類別等進行分配,負載均衡的部署方式也分為路由和服務直接返回模式

負載均衡的主要方式

1.http重定向

2.DNS負載均衡

優點:
將負載均衡的工作交給了DNS,省卻了網站管理維護負載均衡伺服器的麻煩,同時許多DNS還支持基於地理位置的功能變數名稱解析,將功能變數名稱解析成距離用戶地理最近的一個伺服器地址,加快訪問速度嗎,改善性能。
缺點:
目前的DNS解析是多級解析,每一級DNS都可能化緩存記錄A,當某一伺服器下線後,該伺服器對應的DNS記錄A可能仍然存在,導致分配到該伺服器的用戶訪問失敗。
DNS負載均衡的控制權在功能變數名稱服務商手裡,網站可能無法做出過多的改善和管理。
不能夠按伺服器的處理能力來分配負載。DNS負載均衡採用的是簡單的輪詢演算法,不能區分伺服器之間的差異,不能反映伺服器當前運行狀態,所以其的負載均衡效果並不是太好。
可能會造成額外的網路問題。為了使本DNS伺服器和其他DNs伺服器及時交互,保證DNSs數據及時更新,使地址能隨機分配,一般都要將DNS的刷新時間設置的較小,但太小將會使DNS流量大增造成額外的網路問題。

3.反向代理負載均衡

4.ip負載均衡

優點:在響應請求時速度較反向伺服器負載均衡要快。
缺點。如法處理更高級的請求

5.數據鏈路層負載均衡

優點:不需要負載均衡伺服器進行IP地址的轉換。數據響應時,不需要經過負載均衡伺服器。
缺點:負載均衡伺服器的網卡帶寬要求較高。

四層負載和七層負載

所謂四層就是基於IP+埠的負載均衡,主要代表有lvs。
七層負載也稱內容交換,就是基於URL等應用層信息.的負載均衡,主要代表有nginx。

關於代理

正向代理

反向代理

LVS概述

LVS是Linux Virtual Server 也就是Linux虛擬伺服器

LVS工作在一臺server上提供Directory(負載均衡器)的功能,本身並不提供服務,只是把特定的請求轉發給對應的real server(真正提供服務的主機),從而實現集群環境中的負載均衡。

LVS工作模式:

NAT轉發模式

1.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP(客戶端lP),後面統稱為CIP,目標地址為VIP(負載均衡器前端地址,後面統稱為VIP)。
2.負載均衡器收到報文後,發現請求的是在規則裡面存在的地址,那麼它將客戶端請求報文的目標IP地址改為了後端伺服器的RIP地址並將報文根據演算法發送出去。
R.報文送到Real Server後,由於報文的目標地址是自己,所以會響應該請求,並將響應報文返還給LVS。
4.然後LVS將此報文的源地址修改為本機併發送給客戶端。

優點:

網路隔離安全,節約IP地址

還有DR直接路由模式、TUN-IP隧道模式、FULL-NAT等...

LVS-NAT實戰案例

準備:

client: VMNET0 192.168.31.86

LVS: VMNET0 192.168.31.143
VMNET2 192.168.198.128

web1: VMNET 2 192.168.198.129

web2: VMNET 2 192.168.198.130

關閉防護牆 關閉selinux

步驟:

1.web1配置網站和路由

yum install -y httpd  //先使用NAT網路連接 安裝好httpd
systemctl start httpd
systemctl enable httpd  //完成後切換為vmnet2僅主機網路
echo "web1" > /var/www/html/index.html
route add default gw 192.168.198.128  //配置真實伺服器的網路出口 -net外部網路 gw網關

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2a55dccb-7784-4b4e-a5e2-4004033803fa"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.198.129
NETMASK=255.255.255.0
GATEWAY=192.168.198.128  //只允許LVS的vmnet2通過
DNS1=114.114.114.114

2.web2配置網站和路由

yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "web2" > /var/www/html/index.html
route add default gw 192.168.198.128  //配置真實伺服器的網路出口 -net外部網路 gw網關

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2a55dccb-7784-4b4e-a5e2-4004033803fa"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.198.130
NETMASK=255.255.255.0
GATEWAY=192.168.198.128
DNS1=114.114.114.114

3.LVS-NAT配置路由功能和負載策略

[root@localhost ~]# vim /etc/sysctl.conf  //啟動路由轉發功能
net.ipv4.ip_forward = 1

[root@localhost ~]# sysctl -p  //查詢路由轉發功能是否開啟

yum install -y ipvsadm  //安裝LVS
ipvsadm -A -t 192.168.31.32:80 -s rr  //-A 對外提供地址 -t tcp協議 -s rr 使用rr策列輪詢策略
ipvsadm -a -t 192.168.31.32:80 -r 192.168.192.129:80 -m  //-a對內真實伺服器 -r真實伺服器地址 
ipvsadm -a -t 192.168.31.32:80 -r 192.168.192.130:80 -m 

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
BOOTPROTO=static
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.198.128
NETMASK=255.255.255.0

4.client測試

[root@localhost ~]# curl 192.168.198.129   //測試 直接curl realserver內網 是不行的  如果可以說明realserver並不在內網
curl: (7) Failed to connect to 192.168.198.129: 網路不可達
[root@localhost ~]# curl 192.168.198.130
curl: (7) Failed to connect to 192.168.198.130: 網路不可達

[root@localhost ~]# curl 192.168.31.143   //測試 curl LVSserver 正確是把請求通過DIP轉發到realserver
web22222
[root@localhost ~]# curl 192.168.31.143
web111111

DR轉發模式

Director Server作為群集的訪問入口,但不作為網關使用,後端伺服器池中的Real Server與Director Server在同一個物理網路中,發送給客戶機的數據包不需要經過Director Server。為了響應對整個群集的訪問,DS(前端負載均衡節點伺服器)與RS(後端真實伺服器)都需要配置有VIP地址

每個Real Server上都有兩個IP:VIP(負載均衡對外提供訪問的 IP 地址)和RIP(負載均衡後端的真實伺服器 IP 地址),但是VIP是隱藏的,就是不能提供解析等功能,只是用來做請求回覆的源IP的,Director上只需要一個網卡,然後利用別名來配置兩個IP:VIP和DIP(負載均衡與後端伺服器通信的 IP 地址),在DIR接收到客戶端的請求後,DIR根據負載演算法選擇一臺rs sever的網卡mac作為客戶端請求包中的目標mac,通過arp轉交給後端RS serve處理,後端再通過自己的路由網關回覆給客戶端

特點:
1.Director Server 和 Real Server 必須在同一個物理網路中
2.Real Server 可以使用私有地址,也可以使用公網地址,如果使用公網地址,可以通過互聯網對 RIP 進行直接訪問
3.Director Server作為群集的訪問入口,但不作為網關使用
4.所有的請求報文經由 Director Server,但回覆響應報文不能經過 Director Server
5.Real Server 的網關不允許指向 Director Server IP,即Real Server發送的數據包不允許經過 Director Server
6.Real Server 上的 lo 介面配置 VIP 的 IP 地址

優點:
負載均衡器只負責將請求包分發給物理伺服器,而物理伺服器將應答包直接發給用戶。所以,負載均衡器能處理很巨大的請求量,這種方式,一臺負載均衡能為 超過100台的物理伺服器服務,負載均衡器不再是系統的瓶頸。

LVS-DR模式實戰

準備:

四台統一網段的ip 關閉selinux 關閉防火牆

client:192.168.70.132
LVS:192.168.70.130
web1:192.168.70.133
web1:192.168.70.134

步驟:

1.LVS增加VIP

ifconfig  //查看網卡

ifconfig ens33:0 192.168.70.131 broadcast 192.168.70.255 netmask 255.255.255.0 up  //添加新ip

route add -host 192.168.70.131  //添加路由

2.LVS開啟路由轉發

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1  // 開啟路由轉發功能
net.ipv4.conf.all.send_redirects = 0  //禁止轉發重定向報文
net.ipv4.conf.ens33.send_redirects = 0  //禁止ens33轉發重定向報文
net.ipv4.conf.default.send_redirects = 0  //禁止轉發預設重定向報文

3.LVS設置路由轉發規則/規則(設置ipvsadm)

yum install ipvsadm -y
ipvsadm -C  //清除ipvs規則
ipvsadm -A -t 192.168.70.131:80 -s rr  //添加vip規則
ipvsadm -a -t 192.168.70.131:80 -r 192.168.70.133:80 -g
ipvsadm -a -t 192.168.70.131:80 -r 192.168.70.134:80 -g
ipvsadm -ln  //檢查

ipvsadm-save > /etc/sysconfig/ipvsadm  //讓配置的規則永久生效
systemctl enable ipvsadm

4.配置web集群

設置子網掩碼32(兩台web都一樣如下配置)

yum install -y httpd
echo web1 > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd

ifconfig lo:0 192.168.70.131/32  //在本地迴環介面(lo)上添加一個邏輯IP地址 /32表示這個地址的掩碼為255.255.255.255,即單IP.因為在LVS-DR模式下,需要在每台真實伺服器上都設置一個虛擬IP(VIP),但是兩一樣ip會衝突,這樣當負載均衡器下線時,真實伺服器可以接管VIP,繼續提供服務。

設置內核參數

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore  //忽略arp響應,只有噹噹目標IP與本機介面地址匹配時,才響應ARP請求。
這樣可以防止介面收到發往其他IP的ARP請求時也錯誤響應。

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce  //介面會主動對所有接收到的ARP請求進行回應,即使目標IP不是本地IP。

5.client測試

curl 192.168.70.131

可以在LVS看詳細狀態

ipvsadm -Lnc

對以上兩種模式的補充:

我們在配置ipvsadm時 rr表示虛擬服務演算法的選擇

靜態調服方法:

1.rr 輪詢演算法 均等的對待每一臺伺服器,不管伺服器上實際的連接數量和系統負載

2.wrr 加權輪詢 根據真實伺服器的不同處理能力,動態地調整其許可權,來調度訪問請求

動態調服方法

3.lr 最少連接 調度器通過”最少連接“調度演算法動態地將網路請求調度到已建立的鏈接數最少的伺服器上

4.wlc 加權最少連接 調度器可以自動問詢真實伺服器的負載情況,並動態地調整其許可權

命令補充:

管理虛擬服務
ipvsadm -E -t 192.168.70.131:80 -s wrr  //修改演算法
ipvsadm -D -t 192.168.70.131:80  //刪除指定虛擬服務
ipvsadm -C  //全部清空
管理真實服務
ipvsadm -a -t 192.168.70.131:80 -r 192.168.70.133 -g -w 5  //增加真實伺服器的權重
ipvsadm -e -t 192.168.70.131:80 -r 192.168.70.133 -g -w 2  //修改真是伺服器的權重
ipvsadm -d -t 192.168.70.131:80 -r 192.168.70.133  //刪除真實伺服器

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

-Advertisement-
Play Games
更多相關文章
  • 程式設計領域的`設計模式的六大設計原則` + `合成復用原則`(Composite Reuse Principle) ,都是一些很**泛**的思想(它們既可以指這個,也可以代指那個),無法生搬硬套,無法做到很具體的指導。我的建議是,有空多看幾遍、多思考看看怎麼能運用在實際項目中,在未來時**保佑** ...
  • ## 前言 一款app,消息頁面有:錢包通知、最近訪客等各種通知類別,每個類別可能有新的通知消息,實現已讀、未讀功能,包括多少個未讀,這個是怎麼實現的呢?比如用戶A訪問了用戶B的主頁,難道用rabitmq給B發通知消息嗎?量大了成本受得了嗎?有沒有成本低的方案呢 ![img](https://img ...
  • 來源:進擊雲原生 ### 1、檢測兩台伺服器指定目錄下的文件一致性 ``` #!/bin/bash ###################################### 檢測兩台伺服器指定目錄下的文件一致性 ##################################### #通過對 ...
  • 向ES發送請求時,如何創建請求對象呢?官方推薦的builder patter,在面對複雜的請求對象結構時還好用嗎?有沒有更加直觀簡潔的方法,盡在本文一網打盡 ...
  • # Bread.Mvc [Bread.Mvc](https://gitee.com/rizo/bread-mvc) 是一款完全支持 Native AOT 的 MVC 框架,搭配同樣支持 AOT 的 Avalonia,讓你的開發事半功倍。項目開源在 Gitee,歡迎 [Star](https://gi ...
  • ## 前言 **`Visual Studio`** 開發工具的熟練使用,能夠潛在的提升我們工作效率,而且一些開發技巧的使用,會讓我們的工作顯得那麼方便快捷。那麼你知道VS中有哪些你不知道的使用小技巧呢?接下來,我們就來探索VS中的**“任務列表”**的使用。 任務列表是使用 `TODO` 、 `HA ...
  • # .Net 6/Net Core Vue Element Uniapp前後端分離低代碼快速開發框架 這是一個能提高開發效率的開發框架,全自動生成PC與移動端(uniapp)代碼;支持移動ios/android/h5/微信小程式。 # 一、框架能做什麼 1、前後端分離項目 2、純後端項目 3、移動端 ...
  • ## 前言 在軟體系統中,當創建一個類的實例的過程很昂貴或很複雜,並且我們需要創建多個這樣類的實例時,如果我們用new操作符去創建這樣的類實例,這就會增加創建類的複雜度和創建過程與客戶代碼複雜的耦合度。如果採用工廠模式來創建這樣的實例對象的話,隨著產品類的不斷增加,導致子類的數量不斷增多,也導致了相 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...