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 模式(网络地址转换)

工作流程:

  1. 客户端发送请求到 DS 的 VIP。
  2. DS 收到请求后解包,根据调度算法选择一台 RS,将目标 IP(DIP)修改为该 RS 的 IP。
  3. DS 将修改后的数据包发送给选中的 RS。
  4. RS 收到请求,处理后将响应数据返回给 DS。
  5. DS 再次解包,将源 IP 修改为 VIP,发回客户端。
  6. 客户端收到响应数据。
            客户端
              |
      [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

实验前准备:

  1. 配置静态 IP
  2. 配置主机名并绑定(/etc/hosts)
  3. 时间同步
  4. 关闭 iptables/firewalld 和 SELinux
  5. 配置 yum 源
  6. 客户端准备 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 为例:

  1. 客户端发出请求:
    • SIP: 192.168.1.3 → DIP: 192.168.1.31
  2. DS 收到请求,通过算法选择 RS1(192.168.224.11),进行 DNAT:
    • SIP: 192.168.1.3 → DIP: 192.168.224.11
  3. RS1 处理请求,返回数据给 DS(网关指向 DS):
    • SIP: 192.168.224.11 → DIP: 192.168.1.3
  4. DS 收到回包,自动进行 SNAT(因为入站做了 DNAT,回程自动 SNAT):
    • SIP: 192.168.1.31 → DIP: 192.168.1.3
  5. 客户端收到回包。

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

工作机制:

  1. 当客户端第一次访问 VIP 时,IPVS 记录一条状态为 NONE 的信息,其 expire 值为 persistence_timeout(此处设为 10 秒)。
  2. 在该记录存在期间,同一客户端 IP 的连接都会被分配到同一个后端 RS。
  3. TIME_WAIT 的过期时间是 TCP FIN/WAIT 的超时时间(约 60 秒)。当 NONE 的值减为 0 时,若 TIME_WAIT 仍存在,NONE 会重新变为 60 秒并继续递减,直到 TIME_WAIT 消失后 NONE 才会消失。
  4. 只要 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 为例:

  1. 本机在局域网内广播:"谁是 10.1.1.5,请把你的 MAC 告诉我"。
  2. 只有 10.1.1.5 回应,将自己的 MAC 返回给本机。
  3. 本机得到 10.1.1.5 的 MAC,存入本地 MAC 地址表缓存。
  4. 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

数据包流转过程:

  1. 客户端请求到达 Router:
    • SIP: 192.168.1.3 → DIP: 192.168.1.8
    • SMAC: 客户端 MAC → DMAC: Router 外网口 MAC
  2. Router 上做 DNAT,将目标 IP 改为 VIP:
    • SIP: 192.168.1.3 → DIP: 3.3.3.4
    • DMAC: DS 的 MAC
  3. DS 收到请求,根据算法选择 RS1(假设为 Web1),不修改 IP,只将目的 MAC 改为 Web1 的 MAC:
    • SIP: 192.168.1.3 → DIP: 3.3.3.4
    • SMAC: 客户端 MAC → DMAC: Web1 的 MAC(IP 与 MAC 不对应)
  4. Web1 收到数据包(通过 MAC 地址到达)。由于包的目标 IP 是 3.3.3.4,Web1 需要有这个 IP 才能处理。在 Web1 的 lo:0 上配置 3.3.3.4/32,既可以响应请求,又不会与 DS 的 IP 冲突(lo 是本地回环网卡,不对外通信)。
  5. Web1 处理请求后直接返回给客户端(不经过 DS):
    • SIP: 3.3.3.4 → DIP: 192.168.1.3
    • SMAC: Web1 的 MAC → DMAC: 客户端 MAC
  6. 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 排错与注意事项

  1. NAT 模式必须双网卡:NAT 的本质是从一个网段转换到另一个网段,单网卡无法实现。
  2. NAT 模式 RS 网关必须指向 DS:否则回包不经过 DS,无法进行 SNAT,导致客户端收到的回包源 IP 与请求目标 IP 不一致。
  3. DR 模式所有节点必须在同一广播域:DS 通过修改二层 MAC 地址转发,跨网段无法工作。
  4. DR 模式 RS 必须配置 ARP 抑制:否则 RS 会响应 VIP 的 ARP 请求,造成 IP 冲突,整个集群混乱。
  5. DR 模式 VIP 掩码必须是 /32:防止影响整个网段通信。
  6. DR 模式 RS 网关指向 Router 而非 DS:确保回包直接通过路由器返回客户端,不经过 DS。
  7. DR 模式 DS 需静态绑定 RS 的 MAC:由于 RS 的 ARP 抑制,DS 无法动态获取 RS 的 MAC,需手动 arp -s 绑定。
  8. ipvsadm 规则持久化:使用 ipvsadm -Sn > /etc/sysconfig/ipvsadm 保存规则,配合 systemctl enable ipvsadm 实现开机自动加载。
最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏