LVS 負載均衡 本篇主要介紹一下 lvs 是什麼 以及它的 nat 模式的搭建 配合nginx來演示 1.概述 LVS 是 Linux Virtual Server 的簡寫 (Linux 虛擬伺服器 ), 是由章文嵩博士主導, 它虛擬出一個伺服器集群,然後進行負載均衡的項目, 目前LVS 已經被集 ...
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小屋
歡迎關註個人公眾號