文章目錄
- 一、lvs的三種模式及其原理
- 1.1 LVS簡介
- 1.2 三種LVS作業模式詳細
- NAT
- DR
- TUN
- 二、實體
- DR模式
- NAT模式
一、lvs的三種模式及其原理
1.1 LVS簡介
LVS(linux virtual server)是linux虛擬服務器,目前LVS模塊已經被集成在linux內核中了,該專案在linux內核中實作了基于ip的資料請求負載均衡調度方案,終端互聯網用戶從外部訪問公司的外部負載均衡服務器,終端用戶的web請求會發送給LVS調度器,調度器根據自己欲設演算法將該請求發送給后端的某臺web服務器,比如輪詢調度法,一共有8中調度方法,LVS作業模式可以分為NAT模式、TUN模式和DR模式,
1.2 三種LVS作業模式詳細
NAT

實作原理程序
① 用戶請求資料包經過層層網路,到達 lvs 網卡,此時資料包源 IP 是 CIP,目的 IP 是 VIP,
② 經過網卡進入網路層 prerouting 位置,根據目的 IP 查找路由,確認是本機 IP,將資料包轉發到 INPUT 上,此時源、目的 IP 都未發生變化,
③ 到達 lvs 后,通過目的 IP 和目的 port 查找是否為 IPVS 服務,若是 IPVS 服務,則會選擇一個 RS 作為后端服務器,將資料包目的 IP 修改為 RIP,并以 RIP 為目的 IP 查找路由資訊,確定下一跳和出口資訊,將資料包轉發至 output 上,
④ 修改后的資料包經過 postrouting 和鏈路層處理后,到達 RS 服務器,此時的資料包源 IP 是 CIP,目的 IP 是 RIP,
⑤ 到達 RS 服務器的資料包經過鏈路層和網路層檢查后,被送往用戶空間 nginx 程式,nginx 程式處理完畢,發送回應資料包,由于 RS 上默認網關配置為 lvs 設備 IP,所以 nginx 服務器會將資料包轉發至下一跳,也就是 lvs 服務器,此時資料包源 IP 是 RIP,目的 IP 是 CIP,
⑥ lvs 服務器收到 RS 回應資料包后,根據路由查找,發現目的 IP 不是本機 IP,且 lvs 服務器開啟了轉發模式,所以將資料包轉發給 forward 鏈,此時資料包未作修改,
⑦ lvs 收到回應資料包后,根據目的 IP 和目的 port 查找服務和連接表,將源 IP 改為 VIP,通過路由查找,確定下一跳和出口資訊,將資料包發送至網關,經過復雜的網路到達用戶客戶端,最終完成了一次請求和回應的互動,
NAT 模式雙向流量都經過 LVS,因此 NAT 模式性能會存在一定的瓶頸,不過與其它模式區別的是,NAT 支持埠映射,且支持 windows 作業系統,
DR

其實 DR 是最常用的作業模式,因為它的強大的性能,下邊以一次請求和回應資料流的程序來描述 DR 模式的具體原理,
實作原理程序
① 當客戶端請求 www.sina.com.cn 主頁,經過 DNS 決議到 IP 后,向新浪服務器發送請求資料,資料包經過層層網路到達新浪負載均衡 LVS 服務器,到達 LVS 網卡時的資料包:源 IP 是客戶端 IP 地址 CIP,目的 IP 是新浪對外的服務器 IP 地址,也就是 VIP;此時源 MAC 地址是 CMAC,其實是 LVS 連接的路由器的 MAC 地址(為了容易理解記為 CMAC),目標 MAC 地址是 VIP 對應的 MAC,記為 VMAC,
② 資料包到達網卡后,經過鏈路層到達 PREROUTING 位置(剛進入網路層),查找路由發現目的 IP 是 LVS 的 VIP,就會遞送到 INPUT 鏈上,此時資料包 MAC、IP、Port 都沒有修改,
③ 資料包到達 INPUT 鏈,INPUT 是 LVS 主要作業的位置,此時 LVS 會根據目的 IP 和 Port 來確認是否是 LVS 定義的服務,如果是定義過的 VIP 服務,就會根據配置的 Service 資訊,從 RealServer 中選擇一個作為后端服務器 RS1,然后以 RS1 作為目標查找 Out 方向的路由,確定一下跳資訊以及資料包要通過哪個網卡發出,最后將資料包通過 INET_HOOK 到 OUTPUT 鏈上(Out 方向剛從四層進入網路層),
④ 資料包通過 POSTROUTING 鏈后,從網路層轉到鏈路層,將目的 MAC 地址修改為 RealServer 服務器 MAC 地址,記為 RMAC;而源 MAC 地址修改為 LVS 與 RS 同網段的 selfIP 對應的 MAC 地址,記為 DMAC,此時,資料包通過交換機轉發給了 RealServer 服務器(注:為了簡單圖中沒有畫交換機),
⑤ 請求資料包到達 RealServer 服務器后,鏈路層檢查目的 MAC 是自己網卡地址,到了網路層,查找路由,目的 IP 是 VIP(lo 上配置了 VIP),判定是本地主機的資料包,經過協議堆疊后拷貝至應用程式(比如這里是 nginx 服務器),nginx 回應請求后,產生回應資料包,以目的 VIP 為 dst 查找 Out 路由,確定嚇一跳資訊和發送網卡設備資訊,發送資料包,此時資料包源、目的 IP 分別是 VIP、CIP,而源 MAC 地址是 RS1 的 RMAC,目的 MAC 是下一跳(路由器)的 MAC 地址,記為 CMAC(為了容易理解,記為 CMAC),然后資料包通過 RS 相連的路由器轉發給真正客戶端,
從整個程序可以看出,DR 模式 LVS 邏輯非常簡單,資料包通過路由方式直接轉發給 RS,而且回應資料包是由 RS 服務器直接發送給客戶端,不經過 LVS,我們知道一般請求資料包會比較小,回應報文較大,經過 LVS 的資料包基本上都是小包,上述幾條因素是 LVS 的 DR 模式性能強大的主要原因,
TUN

實作原理與程序
① 用戶請求資料包經過多層網路,到達 lvs 網卡,此時資料包源 IP 是 cip,目的 ip 是 vip,
② 經過網卡進入網路層 prerouting 位置,根據目的 ip 查找路由,確認是本機 ip,將資料包轉發到 input 鏈上,到達 lvs,此時源、目的 ip 都未發生變化,
③ 到達 lvs 后,通過目的 ip 和目的 port 查找是否為 IPVS 服務,若是 IPVS 服務,則會選擇一個 rs 作為后端服務器,以 rip 為目的 ip 查找路由資訊,確定下一跳、dev 等資訊,然后 IP 頭部前邊額外增加了一個 IP 頭(以 dip 為源,rip 為目的 ip),將資料包轉發至 output 上,
④ 資料包根據路由資訊經最終經過 lvs 網卡,發送至路由器網關,通過網路到達后端服務器,
⑤ 后端服務器收到資料包后,ipip 模塊將 Tunnel 頭部卸載,正常看到的源 ip 是 cip,目的 ip 是 vip,由于在 tunl0 上配置 vip,路由查找后判定為本機 ip,送往應用程式,應用程式 nginx 正常回應資料后以 vip 為源 ip,cip 為目的 ip 資料包發送出網卡,最終到達客戶端,
Tunnel 模式具備 DR 模式的高性能,又支持跨機房訪問,聽起來比較完美了,
二、實體
// 在調度器主機上面過濾ipvs
[root@DR ~]# grep -iA 2 'ipvs' /boot/config-4.18.0-193.el8.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m
# CONFIG_NETFILTER_XT_MATCH_L2TP is not set
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
--
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
--
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
--
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8
--
# IPVS MH scheduler
#
CONFIG_IP_VS_MH_TAB_INDEX=12
--
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
有ipvs,證明支持lvs
環境說明:
| 主機名 | Dip | Vip | 職責 |
|---|---|---|---|
| DR | 192.168.91.132 | 192.168.58.200 | 調度器 |
| RS1 | 192.168.91.133 | 服務器(RS) | |
| RS2 | 192.168.91.135 | 服務器(RS) |
DR模式
準備作業:
DR
//關閉防火墻和selinux
[root@DR ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# vi /etc/selinux/config
SELINUX=disabled
[root@DR ~]# setenforce 0
[root@DR ~]# reboot
//添加一個臨時網卡作為"Vip"
[root@DR ~]# ip addr add 192.168.91.200/24 dev ens160
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:cd:a4:aa brd ff:ff:ff:ff:ff:ff
inet 192.168.91.132/24 brd 192.168.91.255 scope global dynamic noprefixroute ens160
valid_lft 1572sec preferred_lft 1572sec
inet 192.168.91.200/24 scope global secondary ens160
valid_lft forever preferred_lft forever
inet6 fe80::f1de:a72e:4bf:9503/64 scope link noprefixroute
valid_lft forever preferred_lft forever
//下載ipvsadm
[root@DR ~]# yum -y install ipvsadm
RS1
// 關閉防火墻和selinux
[root@RS1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS1 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@RS1 ~]# reboot
// 下載httpd服務,添加網頁內容
[root@RS1 ~]# yum -y install httpd
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:* [root@RS1 ~]# echo "amu" > /var/www/html/index.html
[root@RS1 ~]# curl 127.0.0.1
amu
RS2
// 關閉防火墻和selinux
[root@RS2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS2 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@RS2 ~]# reboot
// 下載httpd服務,添加網頁內容
[root@RS2 ~]# yum -y install httpd
[root@RS2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
[root@RS2 ~]# echo "gf" > /var/www/html/index.html
[root@RS2 ~]# curl 127.0.0.1
gf
RS1,RS2上配置apr內核引數
RS配置apr內核引數
[root@RS1 ~]# cat /etc/sysctl.conf # 末尾添加兩行
net.ipv4.conf.all.arp_ignore = 1 # 將對應網卡設定為只回應目標IP為自身介面地址的ARP請求
net.ipv4.conf.all.arp_announce = 2 設定RIP
[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS2 ~]# cat /etc/sysctl.conf # 末尾添加兩行
net.ipv4.conf.all.arp_ignore = 1 # 將對應網卡設定為只回應目標IP為自身介面地址的ARP請求
net.ipv4.conf.all.arp_announce = 2 # 設定RIP
[root@RS2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
RS1,RS2上配置VIP
// RS1添加臨時網卡設立Vip
[root@RS1 ~]# ip addr add 192.168.91.200/24 dev ens160
[root@RS1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:9f:8b:bc brd ff:ff:ff:ff:ff:ff
inet 192.168.91.133/24 brd 192.168.91.255 scope global dynamic noprefixroute ens160
valid_lft 1656sec preferred_lft 1656sec
inet 192.168.91.200/24 scope global secondary ens160
valid_lft forever preferred_lft forever
inet6 fe80::d7db:4688:7fc5:fbcc/64 scope link noprefixroute
valid_lft forever preferred_lft forever
// RS2添加臨時網卡設立Vip
[root@RS2 ~]# ip addr add 192.168.91.200/24 dev ens32
[root@RS2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:5b:3b:74 brd ff:ff:ff:ff:ff:ff
inet 192.168.91.135/24 brd 192.168.91.255 scope global dynamic noprefixroute ens32
valid_lft 958sec preferred_lft 958sec
inet 192.168.91.200/24 scope global secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::29db:511:eca0:9fec/64 scope link noprefixroute
valid_lft forever preferred_lft forever
DR 上配置轉發規則
DR
[root@DR ~]# ipvsadm -A -t 192.168.91.200:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.91.200:80 -r 192.168.91.133:80 -g
[root@DR ~]# ipvsadm -a -t 192.168.91.200:80 -r 192.168.91.135:80 -g
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.91.200:80 -s rr
-a -t 192.168.91.200:80 -r 192.168.91.133:80 -g -w 1
-a -t 192.168.91.200:80 -r 192.168.91.135:80 -g -w 1
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm


NAT模式
環境說明:
| 主機名 | Dip | Vip | 職責 |
|---|---|---|---|
| DR | 192.168.91.132 | 192.168.58.200 | 調度器 |
| RS1 | 192.168.91.133 | DR網關 | 服務器(RS) |
| RS2 | 192.168.91.135 | DR網關 | 服務器(RS) |
準備作業
DR
//關閉防火墻和selinux
[root@DR ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# vi /etc/selinux/config
SELINUX=disabled
[root@DR ~]# setenforce 0
[root@DR ~]# reboot
//添加一個臨時網卡作為"Vip"
[root@DR ~]# ip addr add 192.168.91.200/24 dev ens160
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:cd:a4:aa brd ff:ff:ff:ff:ff:ff
inet 192.168.91.132/24 brd 192.168.91.255 scope global dynamic noprefixroute ens160
valid_lft 1572sec preferred_lft 1572sec
inet 192.168.91.200/24 scope global secondary ens160
valid_lft forever preferred_lft forever
inet6 fe80::f1de:a72e:4bf:9503/64 scope link noprefixroute
valid_lft forever preferred_lft forever
//下載ipvsadm
[root@DR ~]# yum -y install ipvsadm
// 查看DR網關
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
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=ens160
UUID=ff6e1ed4-e92b-413e-804c-480e5ddd7fb3
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.91.132
PREFIX=24
GATEWAY=192.168.91.2 //網關
DNS1=114.114.114.114
IPV6_PRIVACY=no
RS1
// 關閉防火墻和selinux
[root@RS1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS1 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@RS1 ~]# reboot
// 下載httpd服務,添加網頁內容
[root@RS1 ~]# yum -y install httpd
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:* [root@RS1 ~]# echo "amu hello" > /var/www/html/index.html
[root@RS1 ~]# curl 127.0.0.1
amu hello
RS2
// 關閉防火墻和selinux
[root@RS2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS2 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@RS2 ~]# reboot
// 下載httpd服務,添加網頁內容
[root@RS2 ~]# yum -y install httpd
[root@RS2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
[root@RS2 ~]# echo "gf hello" > /var/www/html/index.html
[root@RS2 ~]# curl 127.0.0.1
gf hello
配置RS主機網關
RS1
[root@RS1 ~]# sed -ri 's/^(GATEWAY=).*/\192.168.91.2/' /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
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=ens160
UUID=37a2c72f-e00b-4c82-b130-867e4b827d54
DEVICE=ens160
ONBOOT=no
IPADDR=192.168.91.133
PREFIX=24
GATEWAY=192.168.91.2
DNS1=114.114.114.114
IPV6_PRIVACY=no
RS2
[root@RS2 ~]# sed -ri 's/^(GATEWAY=).*/\192.168.91.2/' /etc/sysconfig/network-scripts/ifcfg-ens32
[root@RS2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
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=ens32
UUID=324fa695-5716-4706-84ec-6b2777061c43"
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.91.135
PREFIX=24
GATEWAY=192.168.91.2
DNS1=114.114.114.114
IPV6_PRIVACY=no
DR上配置轉發規則
##DR
[root@DR ~]# vi /etc/sysctl.conf
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1
# 配置轉發規則
[root@DR ~]# ipvsadm -A -t 192.168.91.200:80 -s rr
[root@DR ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.91.200:80 rr
[root@DR ~]# ipvsadm -a -t 192.168.91.200:80 -r 192.168.91.133:80 -m
[root@DR ~]# ipvsadm -a -t 192.168.91.200:80 -r 192.168.91.135:80 -m
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.91.200:80 -s rr
-a -t 192.168.91.200:80 -r 192.168.91.133:80 -m -w 1
-a -t 192.168.91.200:80 -r 192.168.91.135:80 -m -w 1
檢測
[root@DR ~]# curl 192.168.91.133
amu hello
[root@DR ~]# curl 192.168.91.135
gf hello
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317871.html
標籤:其他
上一篇:Nginx代理mysql埠
