LVS 負載均衡

2022-12-15 18:01:59

LVS 負載均衡

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

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

  • 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用僅主機網路卡即可

網路設定在 /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 檢視虛擬服務, 此時是沒有設定的

#使用 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

再次檢視 可以看到設定如下

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

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 #每個程序允許的最多連線數

ipvsadm -Ln -c  # 檢視 ipvs 連線請求情況

總結

本篇主要介紹了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小屋
歡迎關注個人公眾號