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返回,返回時需要修改報文的源地址,然後返回給客戶,完成整個負載排程過程
- DNAT:目標地址轉換,改變的是目標地址
- 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小屋
歡迎關注個人公眾號