LVS技术知识详解(知识点+相关实验部署)
1.LVS相关知识
1.1 LVS简介
LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是http://www.linuxvirtualserver.org/,现在 LVS 已经是 Linux 内核标准的一部分。
LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。
1.2 LVS体系结构
LVS 架构从逻辑上可分为Load Balance(负载调度器)、Real Server(Server 集群层)和Shared Storage(共享存储层)。
第一层:Load Balance(负载调度器),它是访问整个群集系统的唯一入口,对外使用所有服务器共有的虚拟IP地址,也成为群集IP地址。
负载均衡器:是服务器群集系统的单个入口点,可运行 IPVS,该 IPVS 在 Linux 内核或KTCPVS 内部实现 IP 负载均衡技术,在 Linux 内核中实现应用程序级负载平衡。使用 IPVS 时,要求所有服务器提供相同的服务和内容,负载均衡器根据指定的调度算法和每个服务器的负载将新的客户端请求转发到服务器。无论选择哪个服务器,客户端都应获得相同的结果。使用 KTCPVS 时,服务器可以具有不同的内容,负载均衡器可以根据请求的内容将请求转发到其他服务器。由于 KTCPVS 是在 Linux 内核内部实现的,因此中继数据的开销很小,因此仍可以具有较高的吞吐量。
第二层:Real Server(Server 集群层),群集所提供的应用服务,比如:HTTP、FTP服务器池来承担,每个节点具有独立的真实IP地址,只处理调度器分发过来的客户机请求。
服务器群集的节点可根据系统所承受的负载进行分担。当所有服务器过载时,可添加多台服务器来处理不断增加的工作负载。对于大多数 Internet 服务(例如Web),请求通常没有高度关联,并且可以在不同服务器上并行运行。因此,随着服务器群集的节点数增加,整体性能几乎可以线性扩展。
第三层:Shared Storage(共享存储层),为服务器池中的所有节点提供稳定、一致的文件存储服务,确保整个群集的统一性,可使用 NAS 设备或提供 NFS (Network File System)网络文件系统共享服务的专用服务器。
共享存储:可以是数据库系统,网络文件系统或分布式文件系统。服务器节点需要动态更新的数据应存储在基于数据的系统中,当服务器节点并行在数据库系统中读写数据时,数据库系统可以保证并发数据访问的一致性。静态数据通常保存在网络文件系统(例如 NFS 和 CIFS)中,以便可以由所有服务器节点共享数据。但是,单个网络文件系统的可伸缩性受到限制,例如,单个NFS / CIFS 只能支持 4 到 8 个服务器的数据访问。对于大型集群系统,分布式/集群文件系统可以用于共享存储,例如 GPFS,Coda 和 GFS,然后共享存储也可以根据系统需求进行扩展。
1.3 LVS相关术语
- LB (Load Balancer 负载均衡)
- HA (High Available 高可用)
- Failover (失败切换)
- Cluster (集群)
- LVS (Linux Virtual Server Linux 虚拟服务器)
- DS (Director Server),指的是前端负载均衡器节点
- RS (Real Server),后端真实的工作服务器
- VIP (Virtual IP),虚拟的IP地址,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
- DIP (Director IP),主要用于和内部主机通讯的 IP 地址
- RIP (Real Server IP),后端服务器的 IP 地址
- CIP (Client IP),访问客户端的 IP 地址
访问流程:CIP <--> VIP == DIP <--> RIP
1.4 LVS工作模式
LVS有4种工作模式模式(NAT,TUN,DR,fullnat), 但fullnat工作模式默认不支持
LVS-NAT(Network Address Translation):在该模式下,负载均衡器不仅需要修改请求报文的目标地址,还需要修改响应报文的源地址,适用于小规模集群。
LVS-DR(Direct Routing):在该模式下,负载均衡器只修改请求报文的目标MAC地址,而不修改IP地址,后端服务器直接将响应报文发回客户端,适用于大规模集群。
LVS-TUN(IP Tunneling):该模式通过IP隧道将请求转发到后端服务器,后端服务器直接将响应报文发回客户端,适用于地理位置分散的集群。
1.5 LVS工作原理
LVS-NAT工作原理
调度器接收客户端请求后,会修改请求报文的目标 IP 地址(即 VIP)为后端真实服务器的 IP 地址(RIP),同时记录这个连接。真实服务器处理完请求后,将响应报文返回给调度器,调度器再把响应报文的源 IP 地址修改回 VIP,最后发送给客户端。整个过程中,客户端只和调度器有网络交互,对真实服务器无感知。
LVS-DR工作原理
调度器接收到客户端请求后,会通过修改数据帧的 MAC 地址(把目标 MAC 地址改为后端真实服务器的 MAC 地址),将请求转发给真实服务器。真实服务器处理完请求后,直接把响应报文发送给客户端。和 TUN 模式一样,真实服务器需要配置 VIP,并且能直接和客户端通信。不过与 TUN 模式不同的是,DR 模式是通过修改 MAC 地址来转发请求,而不是封装 IP 报文。
LVS-TUN工作原理
调度器收到客户端请求后,会在原有的 IP 报文外面再封装一层新的 IP 头,新 IP 头的目标地址是后端真实服务器的 IP 地址。真实服务器收到这个封装后的报文后,会解封装获取原始请求,然后直接将响应报文发送给客户端(源 IP 地址为 VIP)。这种模式要求真实服务器和调度器都得有公网 IP,且真实服务器能直接和客户端通信。
LVS-fullnat工作原理
该模式是对 NAT 模式的改进。调度器在接收客户端请求后,会同时修改请求报文的源 IP 地址(改为调度器的 IP 地址)和目标 IP 地址(改为后端真实服务器的 IP 地址)。真实服务器处理完请求后,将响应报文发送给调度器,调度器再把响应报文转发给客户端。这种模式的优势在于,调度器和真实服务器可以不在同一个网段,而且真实服务器可以使用私有 IP 地址。
4种工作模式的对比
特性 | NAT 模式 | TUN 模式 | DR 模式 | fullnat模式 |
---|---|---|---|---|
转发机制 | 修改 IP 包的源 / 目标 IP 地址 | 在原 IP 包外封装新 IP 头 | 修改 MAC 地址 | 同时修改源和目标 IP 地址 |
请求流向 | 客户端 → 调度器 → 真实服务器 | 客户端 → 调度器 → 真实服务器 | 客户端 → 调度器 → 真实服务器 | 客户端 → 调度器 → 真实服务器 |
响应流向 | 真实服务器 → 调度器 → 客户端 | 真实服务器 → 客户端 | 真实服务器 → 客户端 | 真实服务器 → 调度器 → 客户端 |
真实服务器网关配置 | 需要指向调度器 | 无需指向调度器 | 无需指向调度器 | 需要指向调度器 |
真实服务器 IP 类型 | 公网或私网 IP | 公网 IP | 公网或私网 IP | 私网 IP |
网络拓扑要求 | 调度器与真实服务器 需同网段 | 调度器与真实服务器 可跨网段 | 调度器与真实服务器 需同网段 | 调度器与真实服务器 可跨网段 |
调度器压力 | 高(处理所有请求和响应) | 中(仅处理请求) | 低(仅处理请求) | 中(处理所有请求和响应) |
性能 | 较低(转发效率低) | 高(直接路由响应) | 最高(直接路由响应) | 中(NAT 改进版) |
部署复杂度 | 低(单网卡即可) | 高(需支持 IP 隧道) | 中(需配置 ARP 抑制) | 中(需支持双向 NAT) |
典型应用场景 | 小规模集群,RS 为私有 IP | 大规模互联网服务 | 大规模高性能集群 | 跨网段部署的私有云环境 |
1.6 LVS调度算法
LVS调度算法分为两种:静态调度算法和动态调度算法
静态调度算法:即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。
动态调度算法:调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。
静态调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,lblc,lblcr,SED,NQ
rr | 轮询:Round Robin,将收到的访问请求按顺序轮流分配给群集中的各节点真实服务器中,不管服务器实际的连接数和系统负载。 |
wrr | 加权轮询:Weighted Round Robin,根据真实服务器的处理能力轮流分配收到的访问请求,调度器可自动查询各节点的负载情况,并动态跳转其权重,保证处理能力强的服务器承担更多的访问量。 |
dh | 目标地址散列调度算法:DH,该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。 |
sh | 源地址散列调度算法:SH,与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。 |
wlc | 加权最少连接:Weighted Least Connections,服务器节点的性能差异较大的情况下,可以为真实服务器自动调整权重,权重较高的节点将承担更大的活动连接负载。 |
lc | 最少连接:Least Connections,根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数少的节点,如所有服务器节点性能都均衡,可采用这种方式更好的均衡负载。 |
lblc | 基于局部性的最少连接:LBLC,基于局部性的最少连接调度算法用于目标 IP 负载平衡,通常在高速缓存群集中使用。如服务器处于活动状态且处于负载状态,此算法通常会将发往 IP 地址的数据包定向到其服务器。如果服务器超载(其活动连接数大于其权重),并且服务器处于半负载状态,则将加权最少连接服务器分配给该 IP 地址。 |
lblcr | 复杂的基于局部性的最少连接:LBLCR,具有复杂调度算法的基于位置的最少连接也用于目标IP负载平衡,通常在高速缓存群集中使用。与 LBLC 调度有以下不同:负载平衡器维护从目标到可以为目标提供服务的一组服务器节点的映射。对目标的请求将分配给目标服务器集中的最少连接节点。如果服务器集中的所有节点都超载,则它将拾取群集中的最少连接节点,并将其添加到目标服务器群中。如果在指定时间内未修改服务器集群,则从服务器集群中删除负载最大的节点,以避免高度负载。 |
SED | 最短延迟调度:SED,最短的预期延迟调度算法将网络连接分配给具有最短的预期延迟的服务器。如果将请求发送到第 i 个服务器,则预期的延迟时间为(Ci +1)/ Ui,其中 Ci 是第 i 个服务器上的连接数,而 Ui 是第 i 个服务器的固定服务速率(权重) 。 |
NQ | 永不排队调度:NQ,从不队列调度算法采用两速模型。当有空闲服务器可用时,请求会发送到空闲服务器,而不是等待快速响应的服务器。如果没有可用的空闲服务器,则请求将被发送到服务器,以使其预期延迟最小化(最短预期延迟调度算法)。 |
在4.15版本内核以后新增调度算法
FO | (Weighted Fai Over)调度算法,常用作灰度发布。在此算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_FOVERLOAD标志)的且权重最高的真实服务器,进行调度,当服务器承接大量链接,对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主机中 |
OVF | (Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:1.未过载(未设置IP_VS_DEST_F OVERLOAD标志) 2.真实服务器当前的活动连接数量小于其权重值 3.其权重值不为零 |
2.LVS相关实验部署
实验环境均为红帽9.1的虚拟主机
2.1 lvs软件相关信息
- 程序包:ipvsadm
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
- ipvs调度规则文件:/etc/sysconfig/ipvsadm
2.1.1 ipsadm常见参数
选项 | 作用 |
-A | 添加一个虚拟服务,使用IP地址、端口号、协议来唯一定义一个虚拟服务 |
-E | 编辑一个虚拟服务 |
-D | 删除一个虚拟服务 |
-C | 清空虚拟服务表 |
-R | 从标准输入中还原虚拟服务规则 |
-S | 保存虚拟服务规则值标准输出,输出的规则可以使用-R导入还原 |
-a | 在虚拟服务中添加一台真实服务器 |
-e | 在虚拟服务中编辑一台真实服务器 |
-d | 在虚拟服务中减少一台真实服务器 |
-L | 显示虚拟服务列表 |
-t | 使用TCP服务,该参数后需要跟主机与端口信息 |
-u | 使用UDP服务,该参数会需要跟主机与端口信息 |
-s | 指定LVS所采用的的调度算法 |
-r | 设置真实服务器IP地址与端口信息 |
-g | 设置LVS工作模式为DR直连路由模式 |
-i | 设置LVS工作模式为TUN隧道模式 |
-m | 设置LVS工作模式为NAT地址转换模式 |
-w | 设置指定服务器的权重 |
-c | 连接状态,需要配合-L使用 |
-n | 数字格式输出 |
2.1.2 试例
管理虚拟服务
添加地址为172.25.254.100:80的虚拟服务,指定调度算法为轮询。
ipvsadm -A -t 172.25.254.100:80 -s rr
修改虚拟服务的算法为加权轮询
ipvsadm -E -t 172.25.254.100:80 -s wrr
删除一个虚拟服务
ipvsadm -D -t 172.25.254.100:80
管理真实服务
添加一个真实服务器,使用DR模式,设置权重为2
ipvsadm -a -t 172.25.254.100:80 -r 192.168.1.10:80 -g -w 2
修改真实服务器的权重为5
ipvsadm -e -t 172.25.254.100:80 -r 192.168.1.10:80 -g -w 5
删除一个真实服务器
ipvsadm -d -t 172.25.254.100:80 -r 192.168.1.10:80
2.2 LVS部署NAT模式
2.2.1 实验环境
主机名 | IP | vip | 角色 |
---|---|---|---|
client | NAT:172.25.254.10 | 测试机 | |
lvs | 仅主机-eth1:192.168.1.100 | NAT-eth0:172.25.254.100 | 调度器 |
rs1 | 仅主机:192.168.1.10,GW:192.168.1.100 | null | 真实服务器 |
rs2 | 仅主机:192.168.1.20,GW:192.168.1.100 | null | 真实服务器 |
2.2.2 实验步骤
2.2.2.1 实验基础环境
client
lvs
lvs调度器有两块网卡,多一块“仅主机”网卡去连接两台真实服务器
RS
rs1和rs2的网卡都是“仅主机”模式
2.2.2.2 追加配置
(1)在lvs中启用内核路由功能,让内外网能进行一定程度的通信
[root@lvs ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 启用配置
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
(2)在lvs中安装ipvsadm
[root@lvs ~]# dnf install ipvsadm -y
(3)在rs1和rs2中关闭防火墙,并安装httpd模拟提供服务
rs1
[root@rs1 ~]# systemctl disable --now firewalld.service # 关闭防火墙
[root@rs1 ~]# dnf install httpd -y # 安装httpd
[root@rs1 ~]# echo "welcome to 192.168.1.10" > /var/www/html/index.html # 生成默认测试页文件
[root@rs1 ~]# systemctl enable --now httpd # 开启http服务rs2
[root@rs2 ~]# systemctl disable --now firewalld.service
[root@rs2 ~]# dnf install httpd -y
[root@rs2 ~]# echo "welcome to 192.168.1.20" > /var/www/html/index.html
[root@rs2 ~]# systemctl enable --now httpd
在lvs中访问两台RS检测http服务是否生效
(4)在lvs中添加调度策略
# 添加调度策略
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.1.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.1.20:80 -m# 查看调度策略
[root@lvs ~]# 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 rr-> 192.168.1.10:80 Masq 1 0 0-> 192.168.1.20:80 Masq 1 0 0# 在火墙中放行web服务,不然客户端会访问失败
[root@lvs ~]# firewall-cmd --permanent --add-service=http
success
[root@lvs ~]# firewall-cmd --reload
success
(5)可选操作
# 保存规则
# /etc/sysconfig/下原本是没有ipvsadm这个文件的,执行第一条命令会自动创建
[root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t 172.25.254.100:80 -s rr
-a -t 172.25.254.100:80 -r 192.168.1.10:80 -m -w 1
-a -t 172.25.254.100:80 -r 192.168.1.20:80 -m -w 1# 删除所有规则
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn# 重新导入规则
[root@lvs ~]# ipvsadm -R < /etc/sysconfig/ipvsadm
[root@lvs ~]# 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 rr-> 192.168.1.10:80 Masq 1 0 0-> 192.168.1.20:80 Masq 1 0 0
(6)客户端访问测试
连续访问10次
2.3 LVS部署DR模式
2.3.1 实验环境
主机名 | IP | vip | 角色 |
---|---|---|---|
client | NAT:172.25.254.10 | 测试机 | |
router | 仅主机-eth1:192.168.1.100 | NAT-eth0:172.25.254.100 | 路由器 |
lvs | 仅主机:192.168.1.200,GW:192.168.1.100 | lo:192.168.1.220 | 调度器 |
rs1 | 仅主机:192.168.1.10,GW:192.168.1.100 | lo:192.168.1.220 | 真实服务器 |
rs2 | 仅主机:192.168.1.20,GW:192.168.1.100 | lo:192.168.1.220 | 真实服务器 |
2.3.2 实验步骤
2.3.2.1 实验基础环境
client
router
router路由器有两块网卡,多一块“仅主机”网卡去连接lvs调度器
lvs
lvs的网卡变为“仅主机”模式
RS
rs1和rs2的网卡还是“仅主机”模式
2.3.2.2 追加配置
(1)router启用内核路由功能
# 开启路由内核功能
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
(2)对router的防火墙进行配置,不然客户端访问会失败
[root@router ~]# firewall-cmd --permanent --add-masquerade
success
# 让配置在当前的会话中生效
[root@router ~]# firewall-cmd --reload
success
(3)在lvs、rs1、rs2上关闭防火墙,并配置环回ip用作vip
ip addr add dev lo 192.168.1.220/32
# 该命令用于配置环回IP,但为临时配置,重启系统后失效
# 且只能用ip a查看,ifconfig看不到该信息
lvs
[root@lvs ~]# systemctl disable --now firewalld.service
[root@lvs ~]# ip addr add dev lo 192.168.1.220/32rs1
[root@rs1 ~]# systemctl disable --now firewalld.service
[root@rs1 ~]# ip addr add dev lo 192.168.1.220/32rs2
[root@rs2 ~]# systemctl disable --now firewalld.service
[root@rs2 ~]# ip addr add dev lo 192.168.1.220/32
(4)在lvs中安装ipvsadm,并添加调度策略
安装ipvsadm
[root@lvs ~]# dnf install ipvsadm -y# 添加调度策略
[root@lvs ~]# ipvsadm -A -t 192.168.1.220:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.1.220:80 -r 192.168.1.10:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.1.220:80 -r 192.168.1.20:80 -g# 查看调度策略
[root@lvs ~]# 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.1.220:80 rr-> 192.168.1.10:80 Route 1 0 0-> 192.168.1.20:80 Route 1 0 0
(5)在rs1和rs2中安装httpd模拟提供服务
rs1
[root@rs1 ~]# dnf install httpd -y
[root@rs1 ~]# echo "welcome to 192.168.1.10" > /var/www/html/index.html
[root@rs1 ~]# systemctl enable --now httpdrs2
[root@rs2 ~]# dnf install httpd -y
[root@rs2 ~]# echo "welcome to 192.168.1.20" > /var/www/html/index.html
[root@rs2 ~]# systemctl enable --now httpd
在lvs中访问两台RS检测http服务是否生效
(6)在RS1和RS2中解决vip响应问题
DR 模式的核心设计是:
调度器和所有真实服务器(RS)都需要配置相同的 VIP调度器用 VIP 接收客户端请求,RS 用 VIP 作为响应的源 IP 直接返回给客户端。但这种 “同一 VIP 在多台机器上存在” 的情况,会引发两个关键问题:
ARP 广播冲突:当客户端或网络中的其他设备发送 ARP 请求(询问 “VIP 对应的 MAC 地址是什么”)时,若所有 RS 都响应,会导致客户端收到多个 MAC 地址,可能直接将请求发送给某台 RS 而非调度器,绕过负载均衡。
响应路径错误:若 RS 对 VIP 的 ARP 响应配置不当,可能导致客户端后续请求直接发给 RS,而非通过调度器分发,破坏负载均衡策略。
因此需要对RS做关于vip的arp限制
rs1
# 解决vip响应问题
[root@rs1 ~]# echo "net.ipv4.conf.all.arp_ignore=1" >> /etc/sysctl.conf
[root@rs1 ~]# echo "net.ipv4.conf.all.arp_announce=2" >> /etc/sysctl.conf
[root@rs1 ~]# echo "net.ipv4.conf.lo.arp_ignore=1" >> /etc/sysctl.conf
[root@rs1 ~]# echo "net.ipv4.conf.lo.arp_announce=2" >> /etc/sysctl.conf
# 启用配置
[root@rs1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2rs2
[root@rs2 ~]# echo "net.ipv4.conf.all.arp_ignore=1" >> /etc/sysctl.conf
[root@rs2 ~]# echo "net.ipv4.conf.all.arp_announce=2" >> /etc/sysctl.conf
[root@rs2 ~]# echo "net.ipv4.conf.lo.arp_ignore=1" >> /etc/sysctl.conf
[root@rs2 ~]# echo "net.ipv4.conf.lo.arp_announce=2" >> /etc/sysctl.conf
[root@rs2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
(7)客户端访问测试
2.4 防火墙标记解决调度问题
在实际环境中,服务器不可能只提供一种服务,以http 和 https 为例,当我们在 RS 中同时开放 80 和 443 端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题:当我第一次访问 80 被轮询到 RS1 后,下次访问 443 仍然可能会被轮询到 RS1 上。
2.4.1 问题重现
环境使用上一个实验“LVS部署DR模式”做完的环境
(1)在rs1和rs2中安装mod_ssl并重启httpd服务(rs安装mod_ssl模块 是为了让rs支持https)
[root@rs1 ~]# dnf install mod_ssl -y
[root@rs1 ~]# systemctl restart httpd[root@rs2 ~]# dnf install mod_ssl -y
[root@rs2 ~]# systemctl restart httpd
(2)查看httpd端口
(3)添加关于https的调度策略
[root@lvs ~]# ipvsadm -A -t 192.168.1.220:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.1.220:443 -r 192.168.1.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.1.220:443 -r 192.168.1.20:443 -g# 查看调度策略
[root@lvs ~]# 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.1.220:80 rr-> 192.168.1.10:80 Route 1 0 0-> 192.168.1.20:80 Route 1 0 0
TCP 192.168.1.220:443 rr-> 192.168.1.10:443 Route 1 0 0-> 192.168.1.20:443 Route 1 0 0
(4)测试错误结果
2.4.2 解决方法
(1)先把原来的策略删除
[root@lvs ~]# ipvsadm -C# 查看策略,此时为空
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
(2)在lvs调度器中配置防火墙标记,人为设定80和443是一个整体
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.1.220 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66# 查看结果
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK tcp -- 0.0.0.0/0 192.168.1.220 multiport dports 80,443 MARK set 0x42Chain INPUT (policy ACCEPT)
target prot opt source destinationChain FORWARD (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destinationChain POSTROUTING (policy ACCEPT)
target prot opt source destination
(3)重新配置调度策略
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.1.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.1.20 -g[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr-> 192.168.1.10:0 Route 1 0 0-> 192.168.1.20:0 Route 1 0 0
(4)客户端访问测试
可以看到,问题解决