LVS 负载均衡集群
本文系统讲解 LVS(Linux Virtual Server)负载均衡集群:集群类型、四层/七层负载均衡概念、LVS 三种工作模式(NAT/TUN/DR)、十种调度算法(重点 8 种)、
ipvsadm命令详解、会话保持(sh 算法与 persistent 持久连接)、ARP 协议原理、DR 模式下的 ARP 抑制,以及 NAT 与 DR 两种模式的完整实战配置。
1. 集群概述
集群(cluster)是由两台或多台计算机(称为节点 node 或成员 member)共同执行任务的一组服务器。
常见集群类型:
| 类型 | 缩写 | 说明 |
|---|---|---|
| 负载均衡集群 | LB(Load Balance) | 按一定算法将请求调度到不同节点,解决单台服务器压力过大的问题 |
| 高可用集群 | HA(High Available) | 通过冗余节点保证服务持续可用 |
| 高性能计算集群 | HPC | 将多台计算机的计算能力组合,处理大规模计算任务 |
| 存储集群 | — | 如 GFS 共享存储,提供统一的存储访问 |
1.1 负载均衡集群架构
客户端
|
调度器(LB 服务器) ---- 备调度器
| | |
web1 web2 web3 (Real Servers)
负载均衡集群一般用于请求负载分发,即按一定算法把不同的请求调度给不同的节点,这些节点提供相同的服务。
负载均衡集群需要关注的几个要点:
- 调度算法:如 rr(轮询)等,决定请求如何分配。
- 健康检查:检测后端节点是否存活,故障节点自动剔除。
- 会话保持:同一客户端的请求始终调度到同一后端,方式包括 session 复制、利用 memcache 等缓存保存 session 信息、session 粘贴。
- 数据一致性:通过 rsync 同步、drbd 存储同步、共享存储(NFS)、分布式存储(GlusterFS)等保证各节点数据一致。
2. 常用负载均衡方式
2.1 客户手动选择
如下载网站提供多个镜像站点,由用户手动选择:
下载地址一
下载地址二
2.2 基于 HTTP 跳转
通过 location 跳转或 rewrite 跳转实现,例如:
www.sina.com/sports/cba/
www.sina.com/sports/nba/
2.3 DNS 轮询
对同一个域名添加多条 A 记录:
dig www.sina.com
缺点:
- 可靠性低:没有健康检查,若一个 A 记录节点挂了,DNS 仍会解析到该节点。
- 负载分配不均衡,没有多种调度算法。
- 即使修改了 DNS 记录,由于 DNS 缓存机制,整个网络需要很长时间才能生效。
2.4 四层/七层负载均衡
| 层级 | 对应 OSI 层 | 调度依据 |
|---|---|---|
| 四层负载均衡 | 传输层 | IP + 端口(TCP/UDP) |
| 七层负载均衡 | 应用层 | HTTP 内容(URL、Host、Header 等) |
硬件解决方案(一般为四层调度,部分支持七层):
- F5 BIG-IP
- Citrix NetScaler
- Cisco CSS
软件解决方案:
| 软件 | 工作层次 | 说明 |
|---|---|---|
| LVS | 四层 | 调度算法丰富 |
| Keepalived | 四层 | 内置 LVS 管理,RHEL7 自带 |
| Nginx | 四层/七层 | 灵活的 Web 服务器和负载均衡器 |
| Haproxy | 四层/七层 | 特色在于七层调度 |
| Squid / Varnish | 七层 | 缓存加基本调度,主要用于静态页面,不能完全归于负载均衡软件 |
OSI 七层模型:应用层、表示层、会话层、传输层(IP、PORT)、网络层、数据链路层、物理层。
软件调度的优势:
- 软件成本低
- 硬件技术支持不够迅速时软件可快速迭代
- 软件可控性强
3. LVS 简介
LVS(Linux Virtual Server,Linux 虚拟服务器) 是一个开源的负载均衡项目,工作在 Linux 内核的四层(传输层),通过 IPVS(IP Virtual Server)内核模块实现。简单来讲,LVS 可以看作通过 Linux 系统中的 NAT 等技术实现的负载均衡。
3.1 常见术语
| 术语 | 全称 | 说明 |
|---|---|---|
| CIP | Client IP | 客户端 IP 地址 |
| VIP | Virtual IP Address | 虚拟 IP,面向客户端的服务 IP |
| DIP | Director IP | 调度器(Director)的 IP |
| RIP | Real Server IP | 真实服务器的 IP |
| DS | Director Server | 负载均衡调度器 |
| RS | Real Server | 真实数据服务器(不单单是 Web) |
| SIP | Source IP | 源 IP,请求发起方的 IP 地址 |
| ARP | Address Resolution Protocol | 地址解析协议,根据 IP 获取 MAC 地址 |
3.2 LVS 三种工作模式
NAT 模式(网络地址转换)
工作流程:
- 客户端发送请求到 DS 的 VIP。
- DS 收到请求后解包,根据调度算法选择一台 RS,将目标 IP(DIP)修改为该 RS 的 IP。
- DS 将修改后的数据包发送给选中的 RS。
- RS 收到请求,处理后将响应数据返回给 DS。
- DS 再次解包,将源 IP 修改为 VIP,发回客户端。
- 客户端收到响应数据。
客户端
|
[DS(双网卡)]
外网IP 内网IP
| |
RS1 RS2
(网关指向 DS 内网IP)
- 优点:集群中的 RS 只需支持 TCP/IP 协议,可使用内网 IP,安全性好。
- 缺点:进出流量都经过 DS,当请求量大时 DS 容易成为瓶颈。
- 注意:NAT 模式要求 DS 必须双网卡(内外网不同网段)。若整个架构在同一网段,LVS 也能调度,但 RS 回包会直接到达客户端而不经过 DS(因为同一网段直通),导致回包源 IP 与请求目标 IP 不一致而失败。
TUN 模式(IP 隧道)
实际网络中,客户端请求包体积小,而服务端响应包因携带数据体积较大。TUN 模式的原理是 DS 收到请求包后,将原始 IP 包封装在新的 IP 包中(IP 隧道),转发给 RS;RS 收到后解封装,直接将响应返回给客户端,无需再经过 DS。
- 优点:DS 只处理请求包,RS 直接返回应答包,减轻 DS 压力,支持更高并发。
- 缺点:要求集群中所有机器都支持 IP 隧道协议(tun),可能导致部分服务器不可用;RS 必须有公网 IP。
DR 模式(直接路由)
DS 和 RS 使用同一个 VIP(必须在同一网段/广播域),只有 DS 对 VIP 的 ARP 请求进行响应,所有 RS 对 VIP 的 ARP 请求保持静默。网关将对 VIP 的请求全部发给 DS。DS 收到数据包后,根据调度算法选择 RS,将二层帧的目的 MAC 改为 RS 的 MAC(IP 不变),直接分发给 RS。RS 收到后处理完成,由于 IP 一致,直接将响应返回给客户端,无需经过 DS。
- 优点:和 TUN 一样 DS 只处理入站流量,但不需要隧道封装,没有隧道协议限制,性能最高。
- 缺点:DS 和 RS 必须在同一广播域(同一交换机);需要解决 ARP 冲突问题。
三种模式对比:
| 模式 | 修改内容 | RS 网关 | RS 是否需要公网 IP | DS 瓶颈 | 要求 |
|---|---|---|---|---|---|
| NAT | 目标 IP(入)+ 源 IP(出) | 指向 DS | 否 | 大(进出都经过) | DS 双网卡 |
| TUN | 封装新 IP 头 | 指向路由器 | 是 | 小(只进不出) | 所有节点支持 tun |
| DR | 目的 MAC | 指向路由器 | 否(VIP 在 lo) | 小(只进不出) | 同一广播域,需 ARP 抑制 |
4. LVS 调度算法
LVS 共有十种调度算法,常用的有以下 8 种:
| 算法 | 全称 | 说明 |
|---|---|---|
rr |
Round-Robin | 轮询,均等地对待每台真实服务器 |
wrr |
Weighted Round-Robin | 加权轮询,根据 RS 的处理能力调度,可动态调整权值 |
lc |
Least-Connection | 最少连接,连接数少的服务器多分配 |
wlc |
Weighted Least-Connection | 加权最少连接,同时考量服务器处理能力和连接数,最常用,也是 LVS 默认算法 |
lblc |
Locality-Based Least-Connection | 基于局部性的最少连接,主要用于 Cache 集群 |
lblcr |
Locality-Based Least-Connection with Replication | 带复制的基于局部性的最少连接,主要用于 Cache 集群 |
dh |
Destination Hashing | 目标地址散列,将同一目标地址的请求调度到同一 RS,提高缓存命中率 |
sh |
Source Hashing | 源地址散列,同一源 IP 的请求调度到同一 RS,实现会话粘贴 |
4.1 加权与静默模式(quiesce)
假设 RS 池中有三台服务器:A 权值为 1,B 权值为 3,C 权值为 2。若 C 宕机,A 和 B 会平均分担 C 的负载。当 C 重新上线时,LVS 路由器会视其为没有连接的服务器,将所有新请求一股脑发送到 C,直到其连接数与 A、B 持平。
为防止此现象,可将虚拟服务器设为 quiesce(静默模式):当有新服务器节点上线时,将最小连接表重置为 0,LVS 路由器会像所有 RS 刚加入集群一样重新路由请求。
4.2 各算法应用场景说明
dh(目标地址散列):若调度器后端是缓存服务器(如 Squid)而非真正的应用服务器,dh 会尽可能把相同请求或同一用户的请求转发到同一台缓存服务器,以提高缓存命中率(类似 Nginx 的 url_hash)。
sh(源地址散列):同一源 IP 的请求始终调度到同一 RS,保持会话一致(类似 Nginx 的 ip_hash)。但若后端 RS 挂掉,与它连接的所有会话都会中断。建议使用持久连接(persistent)替代。
lblc:在 dh 基础上考虑后端服务器的连接数(dh + lc)。
lblcr:在 lblc 基础上,若某用户第一次访问被调度到缓存服务器 A,第二次访问时 A 负载很大而 B 空闲,则会打破原规则将请求调度给 B。
5. ipvsadm 命令
ipvsadm 是 LVS 的管理工具,用于配置和查看 IPVS 规则。
5.1 安装
yum install ipvsadm -y
5.2 常用命令参数
| 参数 | 说明 |
|---|---|
-A |
添加一个虚拟服务(Add) |
-E |
修改一个虚拟服务(Edit) |
-D |
删除一个虚拟服务(Delete) |
-a |
添加一台真实服务器(add-server) |
-e |
修改一台真实服务器(edit-server) |
-d |
删除一台真实服务器(delete-server) |
-t |
指定 TCP 服务(VIP:Port) |
-u |
指定 UDP 服务(VIP:Port) |
-s |
指定调度算法(rr、wrr、lc、wlc、sh、dh 等) |
-r |
指定真实服务器地址(RIP:Port) |
-m |
使用 NAT 模式(Masquerade) |
-g |
使用 DR 模式(Gateway / Direct Routing) |
-i |
使用 TUN 模式(IPIP encapsulation) |
-w |
指定权重(Weight) |
-p [N] |
持久连接超时时间(秒),默认 300 秒 |
-l / -L |
列出规则列表 |
-n |
以数字形式显示 IP 和端口(不反解) |
-c |
显示连接表(connection table) |
-S |
以规则格式输出(可用于保存) |
-C |
清空所有规则 |
-Z |
清零计数器 |
5.3 规则管理示例
# 添加虚拟服务,VIP 为 192.168.1.31:80,使用 rr 算法
ipvsadm -A -t 192.168.1.31:80 -s rr
# 添加真实服务器(NAT 模式)
ipvsadm -a -t 192.168.1.31:80 -r 192.168.224.11:80 -m
ipvsadm -a -t 192.168.1.31:80 -r 192.168.224.12:80 -m
# 修改调度算法为 sh
ipvsadm -E -t 192.168.1.31:80 -s sh
# 修改算法为 rr 并设置持久连接 10 秒
ipvsadm -E -t 192.168.1.31:80 -s rr -p 10
# 删除某条真实服务器规则
ipvsadm -d -t 192.168.1.31:80 -r 192.168.224.11:80
# 清空所有规则
ipvsadm -C
5.4 查看规则
# 查看调度规则
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.31:80 rr
-> 192.168.224.11:80 Masq 1 0 0
-> 192.168.224.12:80 Masq 1 0 0
字段说明:
| 字段 | 说明 |
|---|---|
Forward |
转发模式:Masq(NAT)、Route(DR)、Tunnel(TUN) |
Weight |
权重 |
ActiveConn |
活动连接数 |
InActConn |
非活动连接数 |
5.5 保存与启动规则
# 保存规则到文件
ipvsadm -Sn > /etc/sysconfig/ipvsadm
# 启动并设置开机自启
systemctl start ipvsadm
systemctl enable ipvsadm
systemctl status ipvsadm
/etc/sysconfig/ipvsadm文件中保存的规则会在ipvsadm服务启动时自动加载。删除规则时(ipvsadm -d),也会同步删除保存文件中的对应规则。
6. LVS-NAT 模式实战
6.1 实验环境
基于 CentOS 7.3:
| 角色 | 网络配置 | 说明 |
|---|---|---|
| Client | 单网卡 NAT(外网 192.168.1.0/24) | 访问客户端,使用 curl 或浏览器 |
| DS(LVS) | 双网卡:外网 192.168.1.31 + 内网 192.168.224.10 | 负载均衡调度器 |
| RS1(Web1) | 单网卡仅主机 192.168.224.11 | 真实服务器,网关指向 DS 内网 IP |
| RS2(Web2) | 单网卡仅主机 192.168.224.12 | 真实服务器,网关指向 DS 内网 IP |
实验前准备:
- 配置静态 IP
- 配置主机名并绑定(/etc/hosts)
- 时间同步
- 关闭 iptables/firewalld 和 SELinux
- 配置 yum 源
- 客户端准备 curl 或 elinks 命令
6.2 配置 DS(LVS 调度器)
第一步:开启 IP 转发
vim /etc/sysctl.conf
添加或修改:
net.ipv4.ip_forward = 1
使配置生效:
sysctl -p
第二步:安装 ipvsadm
yum install ipvsadm -y
第三步:配置调度规则
# 添加虚拟服务,使用 rr 轮询算法
ipvsadm -A -t 192.168.1.31:80 -s rr
# 添加真实服务器(-m 表示 NAT 模式)
ipvsadm -a -t 192.168.1.31:80 -r 192.168.224.11:80 -m
ipvsadm -a -t 192.168.1.31:80 -r 192.168.224.12:80 -m
以上规则表示:访问 192.168.1.31:80 的请求会以 rr 算法调度到 192.168.224.11:80 和 192.168.224.12:80。如果服务端口不同,按实际端口修改即可。
注意:在某些版本中,若 eth0 使用 192.168.1.2/24 而 eth0:0 使用 192.168.2.65/24,使用 eth0:0 的网段做实验可能会出现卡住的问题。
第四步:查看规则
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.31:80 rr
-> 192.168.224.11:80 Masq 1 0 0
-> 192.168.224.12:80 Masq 1 0 0
第五步:保存规则并启动服务
ipvsadm -Sn > /etc/sysconfig/ipvsadm
cat /etc/sysconfig/ipvsadm
-A -t 192.168.1.31:80 -s rr
-a -t 192.168.1.31:80 -r 192.168.224.11:80 -m -w 1
-a -t 192.168.1.31:80 -r 192.168.224.12:80 -m -w 1
systemctl start ipvsadm
systemctl enable ipvsadm
systemctl status ipvsadm
6.3 配置 RS(Web 服务器)
在 Web1 和 Web2 上分别操作。
Web1(192.168.224.11):
yum install httpd httpd-devel -y
echo 'web1' > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
# 临时添加网关(永久生效请写入网卡配置文件)
route add default gw 192.168.224.10
Web2(192.168.224.12):
yum install httpd httpd-devel -y
echo 'web2' > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
route add default gw 192.168.224.10
两台 Web 服务器的网关必须指向 DS 的内网 IP(192.168.224.10),否则回包无法经过 DS 进行 SNAT 转换。
6.4 客户端测试
curl 192.168.1.31
验证结果:web1 和 web2 的主页内容轮询出现。
实际生产环境中,两台 Web 服务器的数据应保持一致,可通过 rsync、drbd、NFS、GlusterFS 等方式实现数据同步。测试时为了方便区分才设置不同内容。
6.5 NAT 模式数据包流转分析
以客户端 192.168.1.3 访问 VIP 192.168.1.31 为例:
- 客户端发出请求:
- SIP: 192.168.1.3 → DIP: 192.168.1.31
- DS 收到请求,通过算法选择 RS1(192.168.224.11),进行 DNAT:
- SIP: 192.168.1.3 → DIP: 192.168.224.11
- RS1 处理请求,返回数据给 DS(网关指向 DS):
- SIP: 192.168.224.11 → DIP: 192.168.1.3
- DS 收到回包,自动进行 SNAT(因为入站做了 DNAT,回程自动 SNAT):
- SIP: 192.168.1.31 → DIP: 192.168.1.3
- 客户端收到回包。
7. 会话保持
7.1 sh 算法实现永久会话粘贴
使用 sh(源地址散列)算法,同一客户端 IP 的请求永远调度到同一 RS(类似 Nginx 的 ip_hash):
ipvsadm -E -t 192.168.1.31:80 -s sh
ipvsadm -ln
TCP 192.168.1.31:80 sh
-> 192.168.224.11:80 Masq 1 0 11
-> 192.168.224.12:80 Masq 1 0 0
测试结果:若客户端第一次访问的是 Web1,则永远访问 Web1(即使 Web1 挂了仍访问 Web1)。
7.2 persistent 实现非永久会话保持
通过 -p 参数设置持久连接超时时间(单位:秒),在指定时间内同一客户端的请求调度到同一 RS:
ipvsadm -E -t 192.168.1.31:80 -s rr -p 10
ipvsadm -ln
TCP 192.168.1.31:80 rr persistent 10
-> 192.168.224.11:80 Masq 1 0 0
-> 192.168.224.12:80 Masq 1 0 0
7.3 persistent 连接跟踪分析
使用 -c 参数查看连接表:
ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:06 NONE 192.168.1.3:0 192.168.1.31:80 192.168.224.11:80
TCP 01:56 TIME_WAIT 192.168.1.3:39353 192.168.1.31:80 192.168.224.11:80
工作机制:
- 当客户端第一次访问 VIP 时,IPVS 记录一条状态为
NONE的信息,其expire值为persistence_timeout(此处设为 10 秒)。 - 在该记录存在期间,同一客户端 IP 的连接都会被分配到同一个后端 RS。
TIME_WAIT的过期时间是 TCP FIN/WAIT 的超时时间(约 60 秒)。当NONE的值减为 0 时,若TIME_WAIT仍存在,NONE会重新变为 60 秒并继续递减,直到TIME_WAIT消失后NONE才会消失。- 只要
NONE存在,同一客户端的访问都会分配到同一 RS。
也就是说,客户端第一次被调度到 Web1 后,大约需要等待 2 × 60 + 10 = 130 秒后再次访问,才可能被调度到另一台 RS。
测试总结:假设第一次访问 Web1,在持久时间内始终访问 Web1(若 Web1 挂了,在此期间仍访问 Web1);持久时间过后,按 rr 算法访问 Web2。
8. ARP 协议原理
ARP(Address Resolution Protocol,地址解析协议)用于根据 IP 地址获取对应的 MAC 地址。
8.1 ARP 工作过程
以本机 ping 10.1.1.5 为例:
- 本机在局域网内广播:"谁是 10.1.1.5,请把你的 MAC 告诉我"。
- 只有 10.1.1.5 回应,将自己的 MAC 返回给本机。
- 本机得到 10.1.1.5 的 MAC,存入本地 MAC 地址表缓存。
- Linux 下 ARP 缓存默认 15 分钟。在缓存有效期内,直接从缓存查找;过期后重新广播。
8.2 查看 ARP 缓存
arp -a
client2.example.com (192.168.224.12) at 00:0c:29:56:0e:c6 [ether] on ens33
client1.example.com (192.168.224.11) at 00:0c:29:72:d8:8d [ether] on ens33
gateway (192.168.224.2) at 00:50:56:fb:89:c6 [ether] on ens33
? (192.168.1.4) at 28:d9:8a:83:5e:89 [ether] on ens37
? (192.168.1.101) at <incomplete> on ens37
ip neigh
192.168.224.12 dev ens33 lladdr 00:0c:29:56:0e:c6 STALE
192.168.224.11 dev ens33 lladdr 00:0c:29:72:d8:8d REACHABLE
192.168.224.2 dev ens33 lladdr 00:50:56:fb:89:c6 REACHABLE
192.168.1.2 dev ens37 FAILED
地址解析过程:
DNS ARP
域名/主机名 ---> IP ---> MAC
9. LVS-DR 模式实战
9.1 DR 模式原理
LVS-DR(Direct Routing,直接路由)模式下,请求经过 DS,但响应不经过 DS,直接通过路由器返回给客户端,从而减轻 DS 的压力。
客户端 192.168.1.3
|
192.168.1.8
[Router/Firewall]
3.3.3.3
|
+-------------+-------------+
| |
[LVS Director] 3.3.3.4 (DS 也有 VIP 3.3.3.4)
| |
+----+----+ +----+----+
| | | |
web1 web2 (RS 网关指向 Router)
3.3.3.5 3.3.3.33 lo:0 3.3.3.4/32
lo:0 3.3.3.4/32
数据包流转过程:
- 客户端请求到达 Router:
- SIP: 192.168.1.3 → DIP: 192.168.1.8
- SMAC: 客户端 MAC → DMAC: Router 外网口 MAC
- Router 上做 DNAT,将目标 IP 改为 VIP:
- SIP: 192.168.1.3 → DIP: 3.3.3.4
- DMAC: DS 的 MAC
- DS 收到请求,根据算法选择 RS1(假设为 Web1),不修改 IP,只将目的 MAC 改为 Web1 的 MAC:
- SIP: 192.168.1.3 → DIP: 3.3.3.4
- SMAC: 客户端 MAC → DMAC: Web1 的 MAC(IP 与 MAC 不对应)
- Web1 收到数据包(通过 MAC 地址到达)。由于包的目标 IP 是 3.3.3.4,Web1 需要有这个 IP 才能处理。在 Web1 的
lo:0上配置 3.3.3.4/32,既可以响应请求,又不会与 DS 的 IP 冲突(lo 是本地回环网卡,不对外通信)。 - Web1 处理请求后直接返回给客户端(不经过 DS):
- SIP: 3.3.3.4 → DIP: 192.168.1.3
- SMAC: Web1 的 MAC → DMAC: 客户端 MAC
- Web1 和 Web2 没有外网网段路由,所以网关指向 Router 的内网口 IP 3.3.3.3(不能指向 DS 的 3.3.3.4,因为 DR 模式回包不经过 DS)。
9.2 实验环境
建议使用干净的虚拟机:
| 角色 | 主机名 | 网络配置 | 网卡模式 |
|---|---|---|---|
| Client | 物理机 | 192.168.1.3 | NAT |
| Router | Client3 | 192.168.1.8(ens37)+ 3.3.3.3(ens33) | 双网卡 |
| LVS(DS) | Server | 3.3.3.4 | 仅主机 |
| Web1(RS1) | Client1 | 3.3.3.5 | 仅主机 |
| Web2(RS2) | Client2 | 3.3.3.33 | 仅主机 |
注意:网卡名称需与实际一致,MAC 地址也需与实际一致。
9.3 配置 Router
第一步:开启 IP 转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
第二步:配置 iptables DNAT/SNAT 规则
yum install iptables-services iptables -y
# 清空原有规则
iptables -F -t nat
iptables -F
# 从外网口(ens37)进来访问 80 端口的包,DNAT 到 LVS 的 VIP
iptables -t nat -A PREROUTING -p tcp --dport 80 -i ens37 -j DNAT --to-destination 3.3.3.4
# 从内网口(ens33)出去的包,SNAT 为 Router 的内网 IP
# 使 192.168.1.3 访问 192.168.1.8 时,变成 3.3.3.3 访问 3.3.3.4
iptables -t nat -A POSTROUTING -p tcp --dport 80 -o ens33 -j SNAT --to-source 3.3.3.3
SNAT 规则的作用是让 LVS 调度器能回包给客户端。如果不做 SNAT,也可以在 LVS 调度器上添加到 3.3.3.3 的默认网关(
route add default gw 3.3.3.3),因为 DNAT 的目标机器需要有网关才能回包。
第三步:保存规则并启动服务
iptables-save > /etc/sysconfig/iptables
systemctl start iptables.service
systemctl enable iptables.service
注意:设置转发规则后,只能从外网机器以外网 IP 访问转发端口,本地访问无效(因为规则中指定了进出网卡)。
9.4 配置 LVS 调度器(DS)
# 安装 ipvsadm(若之前做过 NAT 实验,先清空规则)
yum install ipvsadm -y
ipvsadm -C
配置 DR 模式调度规则(-g 表示 DR/路由模式):
ipvsadm -A -t 3.3.3.4:80 -s rr
ipvsadm -a -t 3.3.3.4:80 -r 3.3.3.5:80 -g
ipvsadm -a -t 3.3.3.4:80 -r 3.3.3.33:80 -g
-g表示使用直接路由模式。LVS 调度器将数据包分发给 RS 时,只修改目的 MAC 地址,不修改目标 IP。
查看规则:
ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 3.3.3.4:80 rr
-> 3.3.3.5:80 Route 1 0 0
-> 3.3.3.33:80 Route 1 0 0
Forward列为Route即表示 DR 模式。
保存规则并启动:
ipvsadm -Sn > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl enable ipvsadm
9.5 配置 Web 服务器(RS)
以下操作在 Web1 和 Web2 上分别执行(每台 Web 服务器都要做)。
第一步:安装并启动 httpd
为了测试方便,两台 Web 设置不同的主页内容(生产环境应使用共享存储保证数据一致)。
Web1:
yum -y install httpd
systemctl start httpd
echo web1 > /var/www/html/a.html
Web2:
yum -y install httpd
systemctl start httpd
echo web2 > /var/www/html/a.html
配置完成后,在 Router 和 LVS 上分别 curl 两台 Web,确保网络连通:
curl 3.3.3.5/a.html
curl 3.3.3.33/a.html
第二步:在 lo:0 上配置 VIP
ifconfig lo:0 3.3.3.4 netmask 255.255.255.255
注意掩码必须是 255.255.255.255(/32)。
- 这一步非常重要:DR 模式转发过来的包目标 IP 不变(仍是 3.3.3.4),只是通过 RS 的 MAC 地址投递,所以 Web 服务器上也必须有 3.3.3.4 这个 IP 才能处理请求。
- 使用
lo:0配置 VIP 是为了避免与 DS 的物理网卡 IP 产生 ARP 广播冲突。- 若要永久生效,可编写
/etc/sysconfig/network-scripts/ifcfg-lo:0配置文件。
为什么 netmask 是 255.255.255.255 而不是 255.255.255.0?
如果使用 255.255.255.0,那么整个 3.3.3.0/24 网段都无法与 Web 服务器通信。而我们只需要让 DS 和 Web 之间不通过 VIP 直接通信即可(后续通过 arp -s 绑定解决)。
第三步:配置默认网关指向 Router
route add default gw 3.3.3.3
网关指向 Router 的内网口,回包时跳过 DS,直接通过 Router 返回客户端,以提高 DS 性能。
如果 Router 上做了 SNAT,这个网关可以不加——可通过分析数据包变化过程理解原因。
永久生效请写入网卡配置文件。
第四步:配置 ARP 抑制(sysctl 方式)
vim /etc/sysctl.conf
添加以下四行:
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
参数解释:
| 参数 | 值 | 含义 |
|---|---|---|
arp_ignore |
1 | 系统只回应目的 IP 是本地入接口 IP 的 ARP 请求,对广播包(目的为 VIP 但非入接口 IP)不响应 |
arp_announce |
2 | 系统忽略 IP 包的源地址,根据目标主机选择最合适的本机地址作为 ARP 请求的源地址 |
这两个参数确保 RS 不会对外宣告 VIP 的 MAC 地址,从而让 VIP 的 ARP 请求只由 DS 响应。
第五步:配置 arptables(ARP 防火墙方式)
除了 sysctl 参数,还可以使用 arptables 直接丢弃目的地址为 VIP 的 ARP 包:
yum install arptables_jf -y
# 丢弃所有目标地址为 VIP 的 ARP 包
arptables -A INPUT -d 3.3.3.4 -j DROP
# 保存规则
arptables-save -n > /etc/sysconfig/arptables
systemctl start arptables
systemctl enable arptables
第四步(sysctl)和第五步(arptables)都是为了解决 DR 模式下的 ARP 问题,二选一即可,两步都做也可以。
9.6 在 DS 上永久绑定 RS 的 MAC 地址
配置完 RS 的 ARP 抑制后,会出现一个问题:DS 无法 ping 通 RS。
原因:DS(3.3.3.4)去 ping RS(3.3.3.5)时,请求包能到达 RS,但 RS 回包时发现源 IP 是 3.3.3.4(即自己的 lo:0 VIP),会直接把包交给 lo 而不返回给 DS。
解决方法:在 DS 上静态绑定 RS 的 MAC 地址(可写入 /etc/rc.local 实现开机自动绑定)。
# 先查看 RS 的 MAC 地址(在 RS 上用 ip addr 查看)
# 在 DS 上绑定
arp -s 3.3.3.5 00:0c:29:72:d8:8d
arp -s 3.3.3.33 00:0c:29:56:0e:c6
MAC 地址请根据实际环境替换。这些 MAC 地址即使之前通信过,也会在约 15 分钟后从 ARP 缓存中消失。
9.7 客户端测试
在客户端(192.168.1.3)上访问:
curl 192.168.1.8/a.html
验证结果:web1 和 web2 的内容轮询出现。
注意:必须在外网客户端以外网 IP 方式访问,在网关/Router 本机上无法访问(因为 iptables 规则指定了进出网卡)。
9.8 验证现象
- 在 LVS(DS)上无法 ping 通 Web1 和 Web2,因为这两台机器配置了与 DS 相同的 VIP,ARP 被抑制,无法回应 ICMP 请求。这是 DR 模式的正常现象。
- 可以在 DS 上通过
ipvsadm -lnc查看连接调度情况。
10. LVS 排错与注意事项
- NAT 模式必须双网卡:NAT 的本质是从一个网段转换到另一个网段,单网卡无法实现。
- NAT 模式 RS 网关必须指向 DS:否则回包不经过 DS,无法进行 SNAT,导致客户端收到的回包源 IP 与请求目标 IP 不一致。
- DR 模式所有节点必须在同一广播域:DS 通过修改二层 MAC 地址转发,跨网段无法工作。
- DR 模式 RS 必须配置 ARP 抑制:否则 RS 会响应 VIP 的 ARP 请求,造成 IP 冲突,整个集群混乱。
- DR 模式 VIP 掩码必须是 /32:防止影响整个网段通信。
- DR 模式 RS 网关指向 Router 而非 DS:确保回包直接通过路由器返回客户端,不经过 DS。
- DR 模式 DS 需静态绑定 RS 的 MAC:由于 RS 的 ARP 抑制,DS 无法动态获取 RS 的 MAC,需手动
arp -s绑定。 - ipvsadm 规则持久化:使用
ipvsadm -Sn > /etc/sysconfig/ipvsadm保存规则,配合systemctl enable ipvsadm实现开机自动加载。
此处评论已关闭