高併發解決方法-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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...