使用Lvs+Nginx集群搭建高並發架構的實現示例

高並發站點不僅要考慮網站後端服務的穩定,還需要考慮服務能否接入巨大流量、承受巨大流量,如下圖:

image-20211220234912904

1:流量接入,可以采用Lvs+Nginx集群,這種方式能接入的QPS能高達數百萬

2:通過Lvs實現Nginx集群,Nginx+Tomcat實現後端服務集群,完成瞭從接入層流量處理到後端服務集群高並發處理

1. Lvs介紹

LVS(Linux Virtual Server),即Linux虛擬服務器。它用於多服務器的負載均衡,工作在網絡四層,可以實現高性能,高可用的服務器集群技術,它穩定可靠,即使在集群的服務器中某臺服務器無法正常工作,也不影響整體效果。是基於TCP/IP做的路由和轉發,穩定性和效率極高。

image-20211220235003406

一個LVS集群往往包含以下角色:

1:DS:Director Server。虛擬服務,負責調度

2:RS:Real Server。後端真實的工作服務器。

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

4:DIP:Director Server IP,DS的IP

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

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

2. Lvs 負載均衡模式

lvs提供瞭3種負載均衡模式,每種負載均衡模式適用的場景有差異,我們來講解一下這三種負載均衡模式。

2.1 NAT

用戶的請求到分發器後,通過預設的iptables規則,把請求的數據包轉發到後端的RS上去。RS需要設定網關為分發器的內網IP。用戶請求的數據包和返回給用戶的數據包全部經過分發器,所以分發器稱為瓶頸。在NAT模式中,隻需要分發器有公網IP即可,所以比較節省公網IP資源。

image-20211220235042901

2.2 TUN

這種模式需要有一個公共的IP配置在分發器和所有的RS上,我們把它叫做VIP。客戶端請求的目標IP為VIP,分發器接收到請求數據包後,會對數據包做一個加工,會把目標IP改為RS的IP,這樣數據包就到瞭RS上。RS接收數據包後,會還原原始數據包,這樣目標IP為VIP,因為所有RS上配置瞭這個VIP,所以他會認為是它自己。

image-20211220235059900

2.3 DR模式

和IP Tunnel較為相似,不同的是,它會把數據包的MAC地址修改為RS的MAC地址。真實服務器將響應直接返回給客戶。

這種方式沒有IP隧道的開銷,對集群中的真實服務期也沒有必須支持IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連在同一物理網段上。

image-20211220235116751

3. Lvs DR模式配置

綜合上面分析,我們可以得出結論,DR模式性能效率比較高,安全性很高,因此一般公司都推薦使用DR模式。我們這裡也配置DR模式實現Lvs+Nginx集群。

我們準備瞭3臺機器:首先確保三臺機器都安裝瞭Nginx。

1:192.168.183.133	(DS)		192.168.183.150   對外提供服務
2:192.168.183.134	(RS)		192.168.183.150   真實服務處理業務流程 
3:192.168.183.135	(RS)		192.168.183.150   真實服務處理業務流程

VIP:192.168.183.150

3.1 Vip配置

關閉網絡配置管理器(每臺機器都要做)

systemctl stop NetworkManager
systemctl disable NetworkManager

配置虛擬IP(VIP 192.168.183.133中配置)

/etc/sysconfig/network-scripts創建文件ifcfg-ens33:1,內容如下:

BOOTPROTO=static
DEVICE=ens33:1
ONBOOT=yes
IPADDR=192.168.183.150
NETMASK=255.255.255.0

重啟網絡服務:

service network restart

我們可以看到在原來的網卡上面添加瞭一個虛擬IP 150。

image-20211220235428594

同時需要對192.168.183.134192.168.183.135構建虛擬機IP,但隻是用於返回數據,而不能被用戶訪問到,這時候需要操作ifcfg-lo

IPADDR=127.0.0.1,這裡127.0.0.1屬於本地回環地址,不屬於任何一個有類別地址類。它代表設備的本地虛擬接口,所以默認被看作是永遠不會宕掉的接口。

NETMASK=255.255.255.255

192.168.183.134
ifcfg-lo拷貝一份ifcfg-lo:1,並修改ifcfg-lo:1配置,內容如下:

image-20211220235808269

刷新lo:

ifup lo

查看IP可以發現lo下多瞭150ip。

image-20211220235845587

192.168.100.133知行和上面相同的操作。

3.2 LVS集群管理工具安裝

ipvsadm用於對lvs集群進行管理,需要手動安裝。DS安裝即可。

安裝命令:

yum install ipvsadm

版本查看:

ipvsadm -Ln

效果如下:

image-20211221000148927

3.3 地址解析協議

192.168.183.134192.168.183.135中操作。

arp_ignore和arp_announce參數都和ARP協議相關,主要用於控制系統返回arp響應和發送arp請求時的動作。這兩個參數很重要,特別是在LVS的DR場景下,它們的配置直接影響到DR轉發是否正常。

arp-ignore:arp_ignore參數的作用是控制系統在收到外部的arp請求時,是否要返回arp響應(0~8,2-8用的很少)

配置文件:/etc/sysctl.conf,將如下文件拷貝進去:

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

刷新配置:

sysctl -p

添加路由:此時如果無法識別route,需要安裝相關工具yum install net-tools

route add -host 192.168.183.150 dev lo:1

添加瞭一個host地址,目的是用於接收數據報文,接收到瞭數據報文後會交給lo:1處理。(防止關機失效,需要將上述命令添加到/etc/rc.local中)

添加完host後,可以查看一下:route -n,能明顯看到效果。

上述配置我們同樣要在192.168.183.135中配置。

3.4 集群配置

ipvsadm命令講解:

ipvsadm -A:用於創建集群
ipvsadm -E:用於修改集群
ipvsadm -D:用於刪除集群
ipvsadm -C:用於清除集群數據
ipvsadm -R:用於重置集群配置規則
ipvsadm -S:用於保存修改的集群規則
ipvsadm -a:用於添加一個rs節點
ipvsadm -e:用於修改一個rs節點
ipvsadm -d:用於刪除一個rs節點

添加集群TCP服務地址:(外部請求由該配置指定的VIP處理)

ipvsadm -A -t 192.168.183.150:80 -s rr

參數說明:

  • -A:添加集群配置
  • -t:TCP請求地址(VIP)
  • -s:負載均衡算法

負載均衡算法:

算法 說明
rr 輪詢算法,它將請求依次分配給不同的rs節點,也就是RS節點中均攤分配。這種算法簡單,但隻適合於RS節點處理性能差不多的情況
wrr 加權輪訓調度,它將依據不同RS的權值分配任務。權值較高的RS將優先獲得任務,並且分配到的連接數將比權值低的RS更多。相同權值的RS得到相同數目的連接數。
Wlc 加權最小連接數調度,假設各臺RS的全職依次為Wi,當前tcp連接數依次為Ti,依次去Ti/Wi為最小的RS作為下一個分配的RS
Dh 目的地址哈希調度(destination hashing)以目的地址為關鍵字查找一個靜態hash表來獲得需要的RS
SH 源地址哈希調度(source hashing)以源地址為關鍵字查找一個靜態hash表來獲得需要的RS
Lc 最小連接數調度(least-connection),IPVS表存儲瞭所有活動的連接。LB會比較將連接請求發送到當前連接最少的RS.
Lblc 基於地址的最小連接數調度(locality-based least-connection):將來自同一個目的地址的請求分配給同一臺RS,此時這臺服務器是尚未滿負荷的。否則就將這個請求分配給連接數最小的RS,並以它作為下一次分配的首先考慮。

DS中配置rs(2個)節點:

ipvsadm -a -t 192.168.183.150:80 -r 192.168.183.134:80 -g
ipvsadm -a -t 192.168.183.150:80 -r 192.168.183.135:80 -g

參數說明:

  • -a:給集群添加一個節點
  • -t:指定VIP地址
  • -r:指定real server地址
  • -g:表示LVS的模式為dr模式

添加瞭節點後,我們通過ipvsadm -Ln查看,可以看到多瞭2個節點。

此時集群列表中客戶端請求數據和TCP通信數據會持久化保存,為瞭更好看到效果,我們可以把時間設置成2秒保存,如下命令:

ipvsadm --set 2 2 2

此時我們請求http://192.168.183.150/測試

可以發現請求會在兩臺Nginx輪詢切換。

到此這篇關於使用Lvs+Nginx集群搭建高並發架構的實現示例的文章就介紹到這瞭,更多相關Lvs Nginx集群搭建高並發內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: