LVS简介详解+运行原理+部署+调度算法
·
LVS是Linux内核层实现的高性能、高可用的负载均衡技术,目前是Linux内核的标准模块之一。他的核心作用是将前端的请求流量分发到后端多台真实服务器上,从而提升服务的并发处理能力和可用性。
一、集群和分布式方式
- Scale UP:向上扩展,增强
- Scale Out:向外扩展,增加设备,调度分配问题,Cluster(集群)
集群(Cluster):为了解决某个特定问题将计算机组合形成的单个系统
Cluster的三种类型:
- LB:(负载均衡)由多个主机组成,每个主机只承担一部分访问
- HA:(高可用)
分布式:一个业务被拆分成多个子业务,活着本身就是不听的业务,部署在多台服务器上,分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务
- 分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率
二、LVS运行原理
LVS 官网: http://www.linuxvirtualserver.org/
LVS概念:
- VS:调度器
- RS:真实业务主机
- CIP:客户端主机的IP
- VIP:对外开放的让客户访问的IP
- DIP:调度器负责访问内网的IP
- RIP:真实业务主机IP
1、lvs集群的类型
lvs-nat:修改请求报文的目标IP多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
(1)NAT模式环境设定
- 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发
- RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- VS必须是Linux系统,RS可以是任意OS
在vsnode主机中
[root@vsnode ~]# vmset.sh eth0 172.25.254.100 vsnode
[root@vsnode ~]# vmset.sh eth1 192.168.0.100 vsnode noroute
在RS主机中
# 设定网络
[root@RS1 ~]# vmset.sh eth0 192.168.0.10 RS1 noroute
[root@RS2 ~]# vmset.sh eth0 192.168.0.20 RS2 noroute
# 设定访问业务真实数据
[root@RS1 ~]# dnf install httpd -y
[root@RS2 ~]# dnf install httpd -y
[root@RS1 ~]# systemctl enable --now httpd
[root@RS2 ~]# systemctl enable --now httpd
[root@RS1 ~]# echo RS1 - 192.168.0.10 > /var/www/html/index.html
[root@RS2 ~]# echo RS2 - 192.168.0.20 > /var/www/html/index.html
# 设置RS1和RS2网关(起始并没有网关)
[root@RS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@RS1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@RS2 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@RS2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
在vsnode主机中测试环境
# 测试连通性
[root@vsnode ~]# curl 192.168.0.10
RS1 - 192.168.0.10
[root@vsnode ~]# curl 192.168.0.20
RS2 - 192.168.0.20
(2)NAT模式实现方法
在vsnode主机中
# 1、开启内核路由功能(打开之后两个网卡才能互相通信)
[root@vsnode ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@vsnode ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@vsnode ~]# sysctl -p
net.ipv4.ip_forward = 1
# 先清空策略,保证实验环境干净
[root@vsnode ~]# ipvsadm -C
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 2、编写策略
[root@vsnode ~]# ipvsadm -A -t 172.25.254.100:80 -s wrr
[root@vsnode ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1
[root@vsnode ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.20:80 Masq 1 0 0
# 测试(权重相等的情况下):
[root@vsnode ~]# for i in {1..10};do curl 172.25.254.100;done
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10

# 权重不相等的情况下编写策略
[root@vsnode ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2
# 查看
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 192.168.0.10:80 Masq 2 0 5
-> 192.168.0.20:80 Masq 1 0 5
# 测试(权重不相等的情况下):
[root@vsnode ~]# for i in {1..10};do curl 172.25.254.100;done
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS1 - 192.168.0.10
RS2 - 192.168.0.20
(3)规则持久化
# 利用自定义文件进行持久化
[root@vsnode ~]# ipvsadm-save -n
-A -t 172.25.254.100:80 -s wrr
-a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2
-a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1
[root@vsnode ~]# ipvsadm-save -n > /mnt/ipvs.rule
# 假如不小心清空策略
[root@vsnode ~]# ipvsadm -C
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 就可以使用命令直接进行恢复
[root@vsnode ~]# ipvsadm-restore < /mnt/ipvs.rule
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 192.168.0.10:80 Masq 2 0 0
-> 192.168.0.20:80 Masq 1 0 0
# 利用守护进程进行持久化
[root@vsnode ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 192.168.0.10:80 Masq 2 0 0
-> 192.168.0.20:80 Masq 1 0 0
# 清空策略查看效果
[root@vsnode ~]# ipvsadm -C
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 测试
[root@vsnode ~]# systemctl enable --now ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 192.168.0.10:80 Masq 2 0 0
-> 192.168.0.20:80 Masq 1 0 0
# 如果想实现实时的监控策略的变化,可新开一个shell窗口来进行监控
[root@vsnode ~]# watch -n 1 ipvsadm -Ln
(4)DR(直连路由)模式环境设定
在路由器(router)中
# 环境准备
[root@router ~]# vmset.sh eth0 172.25.254.100 router
[root@router ~]# vmset.sh eth1 192.168.0.100 router noroute
[root@router ~]# systemctl disable --now ipvsadm.service
Removed "/etc/systemd/system/multi-user.target.wants/ipvsadm.service".
[root@router ~]# ipvsadm -C
# 设定内核路由功能
[root@router~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@router~]# sysctl -p
net.ipv4.ip_forward = 1
# 查看是否关闭火墙(已关闭)
[root@router~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 数据转发策略(一来一回)
[root@router ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100
[root@router ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
# 查看
[root@router ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 0.0.0.0/0 0.0.0.0/0 to:192.168.0.100
SNAT all -- 0.0.0.0/0 0.0.0.0/0 to:172.25.254.100
# 扩展:如果面临需要删除策略的命令,上述可以如下图所示(来进行删除):
iptables -t nat -D POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
在vsnode调度器中
[root@vsnode ~]# vmset.sh eth0 192.168.0.50 vsnode noroute
[root@vsnode ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.0.200/24,192.168.0.100
address2=192.168.0.50/24
[root@vsnode ~]# nmcli connection reload
[root@vsnode ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)
# 检测
[root@vsnode ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@vsnode ~]# 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:ad:a1:77 brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 192.168.0.200/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 192.168.0.50/24 brd 192.168.0.255 scope global secondary noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::8127:6803:fad1:925f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
客户端client
[root@client ~]# vmset.sh eth0 172.25.254.99 client noroute
[root@client ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=172.25.254.99/24,172.25.254.100
dns=8.8.8.8;
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
# 测试
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.25.254.100 0.0.0.0 UG 100 0 0 eth0
172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@client ~]# ping 192.168.0.200
PING 192.168.0.200 (192.168.0.200) 56(84) 比特的数据。
64 比特,来自 192.168.0.200: icmp_seq=1 ttl=63 时间=0.675 毫秒
64 比特,来自 192.168.0.200: icmp_seq=2 ttl=63 时间=0.304 毫秒
^C
--- 192.168.0.200 ping 统计 ---
已发送 2 个包, 已接收 2 个包, 0% packet loss, time 1029ms
rtt min/avg/max/mdev = 0.304/0.489/0.675/0.185 ms
在RS1上
# 设定网络
[root@RS1 ~]# vmset.sh eth0 192.168.0.10 RS1 noroute
[root@RS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@RS1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
# 在lo上设定VIP
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/
[root@RS1 system-connections]# ls
eth0.nmconnection eth1.nmconnection
[root@RS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS1 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ethernet]
[ipv4]
address1=127.0.0.1/8
address2=192.168.0.200/32
method=manual
# 重启测试
[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@RS1 system-connections]# 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
inet 192.168.0.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# arp禁止响应
[root@RS1 system-connections]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 system-connections]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 system-connections]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS1 system-connections]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
在RS2中
[root@RS2 ~]# vmset.sh eth0 192.168.0.20 RS2 noroute
[root@RS2 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up eth0
[root@RS2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
#在lo上设定vip
[root@RS2 ~]# cd /etc/NetworkManager/system-connections/
[root@RS2 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS2 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ethernet]
[ipv4]
address1=127.0.0.1/8
address2=192.168.0.200/32
method=manual
[root@RS2 system-connections]# nmcli connection reload
[root@RS2 system-connections]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@RS2 system-connections]# 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
inet 192.168.0.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
#arp禁止响应
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
策略持久化
# 在vsnode中
[root@vsnode ~]# dnf install ipvsadm -y
[root@vsnode ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g
[root@vsnode ~]# 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.0.200:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
[root@vsnode ~]# ipvsadm-save -n
-A -t 192.168.0.200:80 -s rr
-a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
-a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 1
# 没有这一步,是启动不了ipvsadm
[root@vsnode ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@vsnode ~]# systemctl start ipvsadm.service
# 在设成开机自启动
[root@vsnode~]# systemctl enable --now ipvsadm.serice
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
client测试

router测试

vsnode测试

RS1测试

RS2测试

(5)DR模式实现方法
# 环境准备
[root@vsnode ~]# yum install ipvsadm -y
[root@vsnode ~]# 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.0.200:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
[root@vsnode ~]# ipvsadm -C
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 添加策略
[root@vsnode ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g
[root@vsnode ~]# 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.0.200:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
[root@vsnode ~]# ipvsadm-save -n
-A -t 192.168.0.200:80 -s rr
-a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
-a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 1
[root@vsnode ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@vsnode ~]# systemctl enable --now ipvsadm
# 测试(在client中进行测试):
[root@client ~]# for i in {1..10};do curl 192.168.0.200;done
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
RS2 - 192.168.0.20
RS1 - 192.168.0.10
(6)TUN模式
1、客户端发送请求数据包,包内有源IP+vip+dport2、到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS13、RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP)+ port,响应数据包通过网络直接回传给client特点:1、DIP, VIP, RIP都应该是公网地址2、RS的网关一般不能指向DIP3、请求报文要经由Director,但响应不能经由Director4、不支持端口映射5、RS的OS须支持隧道功能
(7)fullnet模式
fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发CIP --> DIPVIP --> RIP1、VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP2、RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client3、请求和响应报文都经由Director4、支持端口映射
三、LVS部署命令(ipvsadm)
程序包:ipvsadmUnit File: ipvsadm.service主程序:/usr/sbin/ipvsadm规则保存工具:/usr/sbin/ipvsadm-save规则重载工具:/usr/sbin/ipvsadm-restore配置文件:/etc/sysconfig/ipvsadm-configipvs调度规则文件:/etc/sysconfig/ipvsadm
1、lvs部署
# 在调度器(vsnode)中部署
[root@vsnode ~]# dnf install ipvsadm.x86_64 -y
# 策略查看(目前无策略)
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 首先刚刚开始启动,会显示启动失败,主要原因就是/etc/sysconfig/ipvsadm文件还不存在
[root@vsnode ~]# systemctl start ipvsadm.service
Job for ipvsadm.service failed because the control process exited with error code.
See "systemctl status ipvsadm.service" and "journalctl -xeu ipvsadm.service" for details.
管理集群服务中的增删改:
-A # 添加-E # 修改-t # tcp服务-u # udp服务-s # 指定调度算法,默认为WLC-p # 设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver-f # firewall mask 火墙标记,是一个数字
# 新增策略
[root@vsnode ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
# 修改策略并查看
[root@vsnode ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr
# 删除对应的策略
[root@vsnode ~]# ipvsadm -D -t 172.25.254.100:80
# 清空策略
[root@vsnode ~]# ipvsadm -C
.管理集群中RealServer的增删改:
-a # 添加realserver-e # 更改realserver-t # tcp协议-u # udp协议-f # 火墙 标签-r # realserver地址-g # 直连路由模式-i # ip隧道模式-m # nat模式-w # 设定权重-Z # 清空计数器-C # 清空lvs策略-L # 查看lvs策略-n # 不做解析--rate :输出速率信息
# 添加策略
[root@vsnode ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m -w 2
[root@vsnode ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20 -m
# 统计流量打到哪里
[root@vsnode ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 172.25.254.100:80 0 0 0 0 0
-> 192.168.0.10:80 0 0 0 0 0
-> 192.168.0.20:80 0 0 0 0 0
# 策略查看
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 192.168.0.10:80 Masq 2 0 0
-> 192.168.0.20:80 Masq 1 0 0
# 清空计数器
[root@vsnode ~]# ipvsadm -Z
# 修改策略并查看
[root@vsnode ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.20 -g
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 192.168.0.10:80 Masq 2 0 0
-> 192.168.0.20:80 Route 1 0 0
# 删除策略
[root@vsnode ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.20
# 清空策略
[root@vsnode ~]# ipvsadm -C
四、LVS调度算法
静态方法:仅根据算法本身进行调度,不考虑RS的负载情况动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1、lvs静态调度算法
- RR:轮询被分别调度
- WRR:加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
- SH:将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
- DH:目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS
2、动态调度算法
-
LC:(最少链接法)负载值=活动链接数*256+非活动链接数
-
WLC:(权重最少链接)负载值=(活动链接数*256+非活动链接数)/权重
-
SED:(初始连接高权重优先)负载值=(活动链接数+1+非活动链接数)*256/权重
-
NQ:第一轮均匀分配,后续SED
-
LBLC:动态的DH算法
-
LBLCR:解决LBLC负载不均衡问题
五、利用火墙标记解决轮询错误
# 1、在rs1和rs2主机中同时开启http和https两种协议
[root@RS1 ~]# dnf install mod_ssl -y
[root@RS2 ~]# dnf install mod_ssl -y
[root@RS1 ~]# systemctl restart httpd
[root@RS2 ~]# systemctl restart httpd
# 2、在vsnode中添加httpd的轮询
[root@vsnode ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
[root@vsnode ~]# 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.0.200:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
TCP 192.168.0.200:443 rr
-> 192.168.0.10:443 Route 1 0 0
-> 192.168.0.20:443 Route 1 0 0
# 3、轮询错误展示(上述设定完成后http和https是独立的service,轮询会出现重复问题)
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
RS1 - 192.168.0.10
RS1 - 192.168.0.10
# 4、解决轮询错误(解决方案:使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载)
[root@vsnode ~]# ipvsadm -C
[root@vsnode ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
[root@vsnode ~]# ipvsadm -A -f 6666 -s rr
[root@vsnode ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[root@vsnode ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 6666 rr
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
# 测试:
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
RS1 - 192.168.0.10
RS1 - 192.168.0.20
六、利用持久化链接实现会话粘滞
# 1、设定LVS调度策略
[root@vsnode ~]# ipvsadm -E -f 6666 -s rr -p 1
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 6666 rr persistent 1
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
# 2、测试:
[root@client ~]# curl 192.168.0.200
RS1 - 192.168.0.10
[root@client ~]# curl 192.168.0.200
RS1 - 192.168.0.10
# 3、观察
[root@vsnode ~]# watch -n 1 ipvsadm -Lnc
Every 1.0s: ipvsadm -Lnc vsnode: Tue Feb 24 16:35:22 2026
IPVS connection entries
pro expire state source virtual destination
IP 00:41 ASSURED 192.168.0.1:0 0.0.26.10:0 192.168.0.10:0
TCP 01:40 FIN_WAIT 192.168.0.1:49909 192.168.0.200:80 192.168.0.10:80
TCP 01:40 FIN_WAIT 192.168.0.1:49910 192.168.0.200:80 192.168.0.10:80
更多推荐



所有评论(0)