侧边栏壁纸
  • 累计撰写 157 篇文章
  • 累计创建 21 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

VIP 后面,LVS 如何找到真正的服务器?LVS 为什么既有 NAT,又有 DR?

YaFuX
2026-08-01 / 0 评论 / 0 点赞 / 2 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

最初,我们只有一台服务器:

客户端
    ↓
203.0.113.10:80
    ↓
Tomcat

随着请求增加,这台服务器开始出现:

连接数上升
CPU 使用率过高
请求排队
响应时间变长

最直接的办法是增加服务器:

Server A
Server B
Server C

但新的问题马上出现了。

三台服务器应该配置同一个 IP 吗?

客户端到底应该访问哪台服务器?

如果客户端只知道一个地址,负载均衡器怎样把流量交给后端?

客户端发给 VIP 的数据包,Real Server 为什么愿意接收?

LVS 会不会和客户端完成 TCP 三次握手?

NAT 模式到底修改了源地址,还是目标地址?

为什么 NAT 模式的响应还要经过负载均衡器?

DR 模式为什么只修改 MAC,不修改目标 IP?

Real Server 配置了 VIP,为什么不能响应 VIP 的 ARP 请求?

DR 模式为什么要求负载均衡器与 Real Server 位于同一二层网络?

后端直接回包时,客户端为什么不会把响应丢掉?

LVS、IPVS、ipvsadm 和 Keepalived 分别是什么?

这些问题最终都指向一个核心:

负载均衡器怎样在不改变客户端访问方式的前提下,把一条连接稳定地交给某台真实服务器?


一、不能复制入口

假设我们直接给三台服务器配置同一个地址:

Server A:203.0.113.10
Server B:203.0.113.10
Server C:203.0.113.10

在同一个网络中,多台普通主机同时宣告同一个 IP,通常会造成地址冲突和邻居解析混乱。

客户端询问:

谁拥有 203.0.113.10?

多个服务器同时回复不同 MAC:

Server A:是我
Server B:是我
Server C:是我

客户端邻居表中的结果可能不断变化:

203.0.113.10
    ↓
一会儿指向 A
一会儿指向 B

因此,后端不能简单地通过“复制同一个普通 IP”完成负载均衡。

更合理的结构是增加一个统一入口:

                 ┌── Server A
客户端 → VIP → LVS ├── Server B
                 └── Server C

客户端永远访问:

VIP

LVS 再从多台 Real Server 中选择一台。


二、先统一四个地址

理解 LVS 数据流之前,先统一四个常见缩写。

1. CIP

CIP
=
Client IP

客户端地址,例如:

198.51.100.20

客户端临时端口假设为:

51000

完整客户端端点:

198.51.100.20:51000

2. VIP

VIP
=
Virtual IP

负载均衡集群对外暴露的统一入口:

203.0.113.100:80

客户端只知道 VIP,不需要知道后端服务器数量和地址。

3. DIP

DIP
=
Director IP

LVS Director 在后端网络中的地址,例如:

10.0.0.1

DIP 常用于 Director 与 Real Server 之间通信。

4. RIP

RIP
=
Real Server IP

真实后端服务器地址:

Server A:10.0.0.11
Server B:10.0.0.12
Server C:10.0.0.13

完整拓扑:

客户端
CIP:198.51.100.20
        │
        │ 访问 VIP
        ▼
LVS Director
VIP:203.0.113.100
DIP:10.0.0.1
        │
        ├── RIP:10.0.0.11
        ├── RIP:10.0.0.12
        └── RIP:10.0.0.13

资料中也正是使用 CIP、VIP、DIP、RIP 描述客户端、统一入口、Director 后端地址和真实服务器。


三、LVS 到底是什么?

这些名词经常被混用。

1. LVS

LVS
=
Linux Virtual Server

它通常指基于 Linux 构建高性能虚拟服务器集群的技术体系。

2. IPVS

IPVS
=
IP Virtual Server

IPVS 是 Linux 内核中的四层负载均衡能力。

它可以针对 TCP、UDP、SCTP 等连接,按照调度规则选择 Real Server,并支持 NAT、直接路由和隧道等转发方式。ipvsadm 的手册也列出了 NAT、Direct Routing 和 IPIP Tunneling 三种主要包转发方式。

3. ipvsadm

ipvsadm 是用户空间管理工具。

它负责配置:

虚拟服务
Real Server
调度算法
转发模式
权重
持久连接

真正处理数据包的是内核中的 IPVS,而不是 ipvsadm 进程。ipvsadm 用于建立、维护和查看内核虚拟服务表。

关系如下:

管理员
    ↓
ipvsadm
    ↓
配置 IPVS 规则
    ↓
Linux 内核转发数据包

四、调度的是连接

客户端开始三次握手:

CIP:51000
    →
VIP:80

第一个 SYN 到达 Director:

SYN
198.51.100.20:51000
    →
203.0.113.100:80

IPVS 根据调度算法选择:

Real Server A

然后建立连接映射:

CIP:51000 → VIP:80
             ↓
          RIP-A

后续属于这条 TCP 连接的数据包,通常都继续交给同一台 Real Server。

否则可能出现:

SYN        → Server A
ACK        → Server B
HTTP Data  → Server C

三台机器各自拥有独立的 TCP 状态,不可能共同完成同一条普通 TCP 连接。

所以四层调度的典型粒度是:

连接

而不是每个 HTTP 请求。


五、LVS 会握手吗?

资料中多次使用了这样的表述:

LVS 不进行握手
客户端直接和 Real Server 握手

这个结论需要更准确地表达。

在经典 IPVS NAT、DR 和 TUN 转发模式中,Director 通常不是像七层反向代理那样建立两条独立 TCP 连接:

客户端连接
    ↓
代理
    ↓
后端连接

它主要转发和改写属于同一条连接的数据包。

TCP 端点仍然是:

客户端
    ↔
选中的 Real Server

但是 Director 并非完全“不参与握手”。

它会看到并处理:

SYN
SYN+ACK
ACK
FIN
RST

并维护 IPVS 连接状态,以确保同一连接的数据包持续映射到正确的 Real Server。Linux 内核文档甚至会根据 NAT 和 Direct Routing 模式下可见的 TCP 最终状态,采用不同的连接重用处理。

因此更准确的说法是:

IPVS 在经典转发模式下通常不作为 TCP 代理终止连接,但会观察、跟踪并转发三次握手以及后续连接数据包。


六、先看 NAT

LVS-NAT 的核心是地址转换。

拓扑:

                 外部网络
                     │
                     ▼
客户端 ───────→ LVS Director
                  VIP:203.0.113.100
                  DIP:10.0.0.1
                     │
                     ▼
                 后端网络
              ┌──────┴──────┐
              ▼             ▼
        10.0.0.11       10.0.0.12
        Server A        Server B

客户端始终访问:

203.0.113.100:80

假设 IPVS 选择:

10.0.0.11:8080

七、请求怎样进入?

客户端原始数据包:

源:
198.51.100.20:51000

目标:
203.0.113.100:80

可以写成:

CIP:51000
    →
VIP:80

Director 选择 Server A 后执行目标地址转换:

目标地址:

VIP:80
    ↓
RIP-A:8080

转换后的数据包:

源:
198.51.100.20:51000

目标:
10.0.0.11:8080

也就是:

CIP:51000
    →
RIP-A:8080

注意源地址通常仍然是 CIP。

因此 Real Server 可以知道真实客户端地址。

请求方向:

客户端发送:

CIP:51000
    →
VIP:80


Director 转换:

CIP:51000
    →
RIP-A:8080


Real Server 收到:

CIP:51000
    →
RIP-A:8080

LVS-NAT 可以同时转换目标 IP 和目标端口,因此:

VIP:80

可以映射到:

RIP:8080

ipvsadm 把这种方式称为 masquerading,也就是 NAT 转发模式。


八、响应为什么必须回来?

Real Server 处理请求后,准备回复:

源:
10.0.0.11:8080

目标:
198.51.100.20:51000

即:

RIP-A:8080
    →
CIP:51000

如果它直接把这个数据包发送给客户端,客户端看到的源地址将是:

10.0.0.11:8080

但客户端建立连接时访问的是:

203.0.113.100:80

客户端期待的连接是:

198.51.100.20:51000
    ↔
203.0.113.100:80

而不是:

198.51.100.20:51000
    ↔
10.0.0.11:8080

因此返回数据还要经过 Director。

Director执行反向转换:

源地址:

RIP-A:8080
    ↓
VIP:80

最终发送给客户端:

VIP:80
    →
CIP:51000

完整回包链路:

Real Server:

RIP-A:8080
    →
CIP:51000

        ↓

LVS Director 反向转换

        ↓

VIP:80
    →
CIP:51000

传统 NAT 需要在两个方向进行对应转换,并维护地址或地址—端口映射状态;基本 NAT 修改 IP 地址,NAPT 则进一步修改 TCP、UDP 端口等传输层标识。


九、NAT 的完整时间线

假设:

CIP  = 198.51.100.20
VIP  = 203.0.113.100
DIP  = 10.0.0.1
RIP  = 10.0.0.11

客户端端口:

51000

虚拟服务端口:

80

Real Server 端口:

8080

请求方向:

客户端
198.51.100.20:51000
        ↓
203.0.113.100:80
        ↓
      Director
        ↓ DNAT
198.51.100.20:51000
        ↓
10.0.0.11:8080
        ↓
   Real Server

响应方向:

Real Server
10.0.0.11:8080
        ↓
198.51.100.20:51000
        ↓
      Director
        ↓ 反向转换
203.0.113.100:80
        ↓
198.51.100.20:51000
        ↓
      客户端

可以压缩成表格:

位置源地址目标地址
客户端发出CIP:51000VIP:80
Director 转发CIP:51000RIP:8080
Real Server 返回RIP:8080CIP:51000
Director 返回客户端VIP:80CIP:51000

十、NAT 怎么配置?

下面只是教学拓扑,生产环境还需要防火墙、健康检查、持久化与高可用配置。

Director:

ip addr add 203.0.113.100/32 dev eth0

sysctl -w net.ipv4.ip_forward=1

创建虚拟服务:

ipvsadm -A \
    -t 203.0.113.100:80 \
    -s rr

添加 Real Server:

ipvsadm -a \
    -t 203.0.113.100:80 \
    -r 10.0.0.11:8080 \
    -m

ipvsadm -a \
    -t 203.0.113.100:80 \
    -r 10.0.0.12:8080 \
    -m

其中:

-A
    添加虚拟服务

-a
    为虚拟服务添加 Real Server

-t
    TCP 服务

-s rr
    Round Robin

-m
    Masquerading / NAT

ipvsadm 手册中,-m 表示 Masquerading,也就是 NAT;-g 则表示 Direct Routing。

Real Server 的返回路由必须确保响应重新经过 Director。

经典教学拓扑通常把 Real Server 默认网关设置为 DIP:

ip route replace default \
    via 10.0.0.1

否则回包绕过 Director,就无法完成反向地址转换。


十一、NAT 慢在哪里?

NAT 模式中:

请求经过 Director
响应也经过 Director

完整路径:

客户端
    ↓
Director
    ↓
Real Server
    ↓
Director
    ↓
客户端

对于典型 Web 请求:

请求:
几百字节或几 KB

响应:
几十 KB、几 MB

流量通常不对称。

例如:

请求:
GET /video.mp4

响应:
500 MB 文件

所有大响应都重新经过 Director:

Server A ─┐
Server B ─┼→ Director → 客户端
Server C ─┘

因此 Director 可能面临:

出站带宽压力
数据包处理压力
转换状态压力

NAT 每个方向都需要执行地址转换和相应校验处理,RFC 3022 也指出地址转换是逐包进行的,并涉及 IP、TCP、UDP 等 Header 与校验和调整。

这并不表示 NAT 模式一定性能差。

它的优势是:

拓扑灵活
Real Server 可位于不同子网
可以转换端口
后端无需配置 VIP

在流量规模适中、响应体不大或拓扑不允许 DR 时,NAT 仍然很实用。


十二、能否绕开回包?

如果想降低 Director 的响应方向压力,可以让 Real Server 直接回复客户端:

请求:

客户端
    ↓
Director
    ↓
Real Server


响应:

Real Server
    ↓
客户端

问题在于客户端访问的是:

VIP

因此响应必须仍以:

VIP

作为源地址。

否则客户端不会把它识别为同一条连接的合法响应。

这就引出了:

LVS-DR
Direct Routing

十三、DR 不改目标 IP

DR 模式下,客户端发送:

CIP:51000
    →
VIP:80

数据到达 Director 后,IPVS 选择 Server A。

与 NAT 不同,DR 不把目标 IP 改成 RIP:

目标 IP 仍然是 VIP

它主要改写或重新封装当前二层 Frame 的目标 MAC:

原目标 MAC:
Director 的 MAC

        ↓

新目标 MAC:
Server A 的 MAC

然后把数据帧发送给 Server A。

数据包内部仍然是:

源 IP:
CIP

目标 IP:
VIP

只是链路层变成:

源 MAC:
Director 出接口 MAC

目标 MAC:
Server A MAC

Direct Routing 允许 Real Server 直接把响应路由回客户端,而不是让所有返回流量重新通过 LVS Director。


十四、DR 的请求链路

假设:

VIP = 203.0.113.100
RIP = 203.0.113.11

客户端发送:

IP Header:

源 IP:
198.51.100.20

目标 IP:
203.0.113.100

第一跳到达 Director:

Ethernet Header:

目标 MAC:
Director MAC

Director 选择 Server A 后重新封装:

Ethernet Header:

源 MAC:
Director MAC

目标 MAC:
Server A MAC


IP Header:

源 IP:
198.51.100.20

目标 IP:
203.0.113.100

注意:

IP Header 没有改

只是:

目标 MAC 改了

这就是经常说的:

DR 动二层,不动三层。

不过更严谨地说,Director 不只是机械替换几个字节,它还需要完成 IPVS 连接查找、调度和正常的链路层转发处理。


十五、服务器为什么收下 VIP?

Server A 的物理地址是:

RIP:
203.0.113.11

但收到的数据包目标 IP 是:

VIP:
203.0.113.100

如果服务器只拥有 RIP,它会认为:

这个数据包不是发给我的

因此,DR 模式下每台 Real Server 还需要在本机配置 VIP。

常见做法是在回环接口配置 /32 地址:

ip addr add \
    203.0.113.100/32 \
    dev lo

于是服务器内核知道:

VIP 也是本机地址

收到:

目标 MAC = Server A MAC
目标 IP  = VIP

的数据帧后,可以继续交给 TCP 层。

但是新的问题又出现了:

Director 和所有 Real Server 都配置 VIP,谁应该响应 VIP 的 ARP?


十六、VIP 不能乱回答

同一个二层网络中,上游设备会询问:

谁拥有 203.0.113.100?

理想情况下,只有当前活动的 Director 回答:

VIP
    →
Director MAC

如果 Real Server 也回答:

VIP
    →
Server A MAC

那么客户端或上游路由器可能绕过 Director,直接把请求发送给 Server A:

客户端
    ↓
Server A

这样 IPVS 调度就失效了。

Red Hat 的 LVS Direct Routing 文档也明确指出,DR 拓扑需要处理 VIP 的 ARP 问题,只有活动的 LVS 节点应该响应 VIP 的 ARP 请求。

所以 Real Server 上的 VIP 必须满足:

对本机协议栈可见
对外部 ARP 不响应

这就是所谓:

隐藏 VIP

但它并不是把 VIP 从内核中删除。

恰恰相反:

内核必须知道 VIP 属于本机

只是不能让 Real Server 抢着向外宣告:

VIP 在我这里

十七、怎样抑制 ARP?

Linux 默认把 IP 地址视为属于整个主机,而不只是某张特定网卡。

在复杂负载均衡环境中,这种行为可能导致主机从非预期接口响应本地地址的 ARP 请求。Linux 内核为此提供了 arp_ignorearp_announcearp_filter 等配置。

一种常见的 LVS-DR 实验配置是:

sysctl -w \
    net.ipv4.conf.all.arp_ignore=1

sysctl -w \
    net.ipv4.conf.all.arp_announce=2

sysctl -w \
    net.ipv4.conf.lo.arp_ignore=1

sysctl -w \
    net.ipv4.conf.lo.arp_announce=2

含义可以简化为:

arp_ignore=1

只有目标 IP
配置在收到请求的接口上时
才响应 ARP

以及:

arp_announce=2

发送 ARP 请求时
尽量使用最适合当前目标和接口的本地地址

不同发行版、网卡拓扑和 VIP 配置方式可能需要调整具体值,生产环境不能只机械复制一组 sysctl


十八、DR 怎样回包?

Server A 收到的连接仍然是:

CIP:51000
    ↔
VIP:80

因为数据包中的目标 IP 从未被改成 RIP。

所以 Server A 返回数据时,自然构造:

源:
VIP:80

目标:
CIP:51000

然后按照自己的路由表直接发送给客户端:

Real Server
    ↓
普通网关
    ↓
互联网
    ↓
客户端

客户端原本访问的就是:

VIP:80

现在收到的响应同样来自:

VIP:80

四元组可以对应:

客户端预期:

CIP:51000
    ↔
VIP:80


实际响应:

VIP:80
    →
CIP:51000

所以客户端能够正常接收。


十九、DR 的完整时间线

请求方向:

客户端:

CIP:51000
    →
VIP:80

        ↓

Director 选择 Server A
只重新封装二层目标 MAC

        ↓

Real Server 收到:

CIP:51000
    →
VIP:80

响应方向:

Real Server:

VIP:80
    →
CIP:51000

        ↓

直接经过普通网关

        ↓

客户端

表格如下:

位置源 IP目标 IP目标 MAC
客户端发出CIPVIP下一跳
到达 DirectorCIPVIPDirector
Director 转给 RSCIPVIP选中 RS
RS 直接响应VIPCIPRS 的下一跳

Director 不再处理大量响应流量:

请求:
经过 Director

响应:
绕过 Director

这正是 DR 在下载流量较大、响应远大于请求的场景中具有吸引力的主要原因。


二十、DR 怎么配置?

假设 Director 与 Real Server 位于同一个二层网络。

Director:

ip addr add \
    203.0.113.100/24 \
    dev eth0

创建虚拟服务:

ipvsadm -A \
    -t 203.0.113.100:80 \
    -s rr

添加 DR Real Server:

ipvsadm -a \
    -t 203.0.113.100:80 \
    -r 203.0.113.11:80 \
    -g

ipvsadm -a \
    -t 203.0.113.100:80 \
    -r 203.0.113.12:80 \
    -g

其中:

-g
    Gatewaying
    Direct Routing

Real Server:

ip addr add \
    203.0.113.100/32 \
    dev lo

再配置 ARP 抑制,并确保服务监听:

VIP:80

或监听所有本地地址:

0.0.0.0:80

ipvsadm 手册指出,Direct Routing 使用 -g;在直接路由和隧道模式中,Real Server 端口通常必须与虚拟服务端口一致。


二十一、为什么通常要同一局域网?

经典 LVS-DR 的转发方式是:

Director
    ↓
把目标 MAC 改成 Real Server MAC
    ↓
发送 Frame

MAC 地址用于当前二层链路。

如果 Real Server 位于另一个路由网络:

Director
    ↓
路由器
    ↓
Real Server

Director 不能简单地把跨网段 Real Server 的 MAC 写入当前 Ethernet Frame。

因为当前链路只认识本广播域内的邻居。

数据一旦经过路由器,链路层 Header 就会被重新构造。

所以经典 DR 拓扑通常要求:

Director 与 Real Server
处于同一个二层广播域

Red Hat 的 DR 文档也将 Direct Routing 描述为对网络拓扑有额外限制的模式,并重点提醒其 ARP 配置问题。

如果后端必须跨越三层网络,可以考虑:

LVS-NAT
LVS-TUN
其他隧道或路由方案

二十二、NAT 与 DR 差在哪?

1. 请求方向

NAT:

CIP → VIP
    ↓
CIP → RIP

DR:

CIP → VIP
    ↓
仍然 CIP → VIP
只改变二层目标

2. 响应方向

NAT:

Real Server
    ↓
Director
    ↓
客户端

DR:

Real Server
    ↓
客户端

3. 地址修改

NAT:

修改 IP
可能修改端口
调整相关校验和

DR:

IP 地址不变
重新封装链路层目标

4. Real Server 是否配置 VIP

NAT:

通常不需要

DR:

需要

5. ARP 问题

NAT:

VIP 通常只在 Director

DR:

Director 和 Real Server 都知道 VIP
必须限制 Real Server 对外响应

6. 网络拓扑

NAT:

Real Server 可以位于不同子网

DR:

经典模式通常要求同一二层网络

7. 端口转换

NAT:

VIP:80
可以映射 RIP:8080

DR:

通常要求相同服务端口

二十三、对比总表

维度LVS-NATLVS-DR
请求经过 Director
响应经过 Director
修改目标 IP
修改端口可以通常不可以
修改二层目标会正常路由核心转发手段
RS 配置 VIP不需要需要
RS 抑制 VIP ARP不需要需要
后端跨子网可以经典模式通常不可以
RS 默认网关通常指向 Director指向正常出口
配置复杂度相对低相对高
大响应场景Director 回程压力大回程可绕过 Director

二十四、Real Server 看见什么?

这也是 NAT 与 DR 的一个关键区别。

NAT 模式

Real Server 收到:

CIP:51000
    →
RIP:8080

因此本地 Socket 是:

RIP:8080

DR 模式

Real Server 收到:

CIP:51000
    →
VIP:80

因此本地 Socket 是:

VIP:80

这就是为什么 DR 模式下 Real Server 必须拥有 VIP。

否则 TCP 层无法把目标为 VIP 的数据包交给本地监听服务。


二十五、VIP 并非消失

资料中存在一种容易误解的说法:

VIP 在底层数据包中不存在

这并不适用于所有阶段和模式。

NAT 模式

客户端到 Director 之前:

目标 IP = VIP

Director 执行 DNAT 后:

目标 IP = RIP

返回时再次恢复为:

源 IP = VIP

DR 模式

从客户端到 Real Server:

目标 IP 始终是 VIP

Real Server 返回:

源 IP 也是 VIP

所以 VIP 不是一个只存在于配置文件中的抽象名称。

它真实出现在数据包的 IP Header 中,只是在不同转发模式和不同路径阶段出现的位置不同。


二十六、Nginx 一定是七层吗?

资料中把:

Nginx = 七层
LVS = 四层

作为入门对比。

这有助于建立初步概念,但不能当成绝对结论。

Nginx 的 HTTP 模块确实可以解析 HTTP 请求,并根据 Host、URI、Header 等信息进行七层代理。

但 Nginx 也提供 Stream 模块,可以代理 TCP、UDP 和 Unix Domain Socket 数据流。

因此准确说法是:

Nginx HTTP
    常用于七层代理

Nginx Stream
    可以进行 TCP/UDP 流代理

IPVS
    是 Linux 内核中的四层负载均衡机制

区别不只是软件名称,更要看:

使用了哪个模块
解析到哪一层
是否终止连接
调度粒度是什么

二十七、算法决定选谁

IPVS 解决的不只是转发方式,还要决定:

这条新连接交给哪台 Real Server?

常见算法包括:

rr
    Round Robin

wrr
    Weighted Round Robin

lc
    Least Connection

wlc
    Weighted Least Connection

sh
    Source Hashing

dh
    Destination Hashing

ipvsadm 支持轮询、加权轮询、最少连接、加权最少连接和多种哈希类算法。

例如:

ipvsadm -A \
    -t 203.0.113.100:80 \
    -s wlc

添加不同权重:

ipvsadm -a \
    -t 203.0.113.100:80 \
    -r 10.0.0.11:80 \
    -m \
    -w 5

ipvsadm -a \
    -t 203.0.113.100:80 \
    -r 10.0.0.12:80 \
    -m \
    -w 2

但权重只是调度依据,不代表系统会自动理解:

CPU 使用率
业务复杂度
数据库压力
响应时间

这些仍需要额外监控和动态控制。


二十八、负载均衡器也会宕机

即使后端有十台服务器,如果只有一台 Director:

客户端
    ↓
唯一 Director
    ↓
十台 Real Server

Director 宕机后,VIP 可能无人接管。

整个集群依然不可访问。

因此还需要:

主 Director
备 Director
浮动 VIP
故障检测
状态同步

Keepalived 通常把:

VRRP
    管理浮动 VIP 和主备切换

健康检查
    管理 Real Server 可用性

IPVS
    进行四层调度

组合起来。Keepalived 官方文档也说明,它基于 IPVS 提供负载均衡,并通过 VRRP 实现高可用。

拓扑:

                    ┌── Director A:MASTER
客户端 → 浮动 VIP ──┤
                    └── Director B:BACKUP

当 A 故障:

VIP
    ↓
迁移到 B

但需要注意:

VIP 切换成功,不代表所有已经建立的连接一定无感继续。

如果备节点没有相应 IPVS 连接状态,旧连接仍可能中断。

IPVS 提供连接同步相关机制,Keepalived 也可以配合 IPVS 同步守护进程,但具体恢复能力仍取决于协议、模式和状态同步配置。


二十九、怎么选?

选择 NAT

适合:

后端不在同一二层网络
需要转换服务端口
希望 Real Server 配置简单
流量规模适中
返回流量不会压垮 Director

选择 DR

适合:

Director 与 RS 在同一二层网络
响应流量远大于请求
希望响应绕过 Director
能够正确配置 VIP 和 ARP
后端服务端口一致

考虑隧道模式

适合:

Real Server 不在同一二层网络
又希望响应直接返回客户端

隧道模式会在原始 IP 数据报外增加隧道封装,把请求发送到远端 Real Server。

这份资料尚未完整展开 TUN,所以本文不继续深入。


三十、常见误区

1. 四层负载均衡完全不看 TCP 状态

错误。

IPVS 会维护连接映射并观察连接状态,否则无法保证同一连接持续进入同一 Real Server。

2. LVS 会和客户端建立一条 TCP,再与后端建立另一条 TCP

经典 IPVS NAT 和 DR 通常不是这种七层或 TCP 代理模型。

它主要转发同一条端到端连接的数据包。

3. NAT 只修改目标 IP

错误。

请求方向会修改目标,响应方向还必须执行反向转换;NAPT 还可能修改端口。

4. NAT 模式的回包可以绕过 Director

通常不行。

绕过 Director 后,响应源地址无法恢复为客户端期待的 VIP。

5. DR 把目标 IP 修改为 RIP

错误。

DR 保留目标 VIP,主要通过链路层把数据帧交给选中的 Real Server。

6. DR 模式下 Real Server 不需要 VIP

错误。

Real Server 必须把目标为 VIP 的数据包识别为本地数据。

7. 隐藏 VIP 就是删除 VIP

错误。

VIP 必须对 Real Server 自身可见,只是不应由 Real Server 对外响应或宣告。

8. 只要把 VIP 配到 lo 就不会有 ARP 问题

不一定。

Linux 的 IP 地址语义属于整个主机,还需要结合 arp_ignorearp_announce 等配置控制行为。

9. DR 可以直接把 MAC 发到任何远端网络

错误。

MAC 地址只服务当前二层链路,经典 DR 通常要求 Director 与 Real Server 同处一个二层网络。

10. DR 响应绕过 Director,所以客户端会拒绝

错误。

Real Server 使用 VIP 作为响应源地址,客户端看到的仍然是它最初连接的服务端点。

11. NAT 模式一定很慢

错误。

NAT 的性能取决于流量、硬件、内核实现和数据包大小。它只是比 DR 多承担了返回路径与地址转换。

12. DR 一定优于 NAT

错误。

DR 有二层拓扑、VIP、ARP 和端口一致性等约束,配置复杂度更高。

13. Nginx 只能做七层负载均衡

错误。

Nginx Stream 可以代理 TCP 和 UDP 数据流。

14. 多台 Real Server 就已经高可用

错误。

Director、VIP、健康检查和连接状态同样可能成为故障点。

15. Keepalived 切换 VIP 后,所有旧连接都会自动恢复

不一定。

已建立连接是否继续,需要考虑 IPVS 连接状态同步以及具体转发模式。


总结

客户端只知道:

CIP
    →
VIP

LVS Director 负责选择:

哪一台 Real Server

IPVS 通常按连接建立映射:

CIP:ClientPort
    ↔
VIP:ServicePort
    ↓
选中的 Real Server

在 NAT 模式中,请求经历:

CIP → VIP
    ↓
CIP → RIP

响应经历:

RIP → CIP
    ↓
VIP → CIP

因此:

请求和响应
都要经过 Director

NAT 的优势是:

支持跨子网
支持端口转换
Real Server 配置简单

限制是:

返回流量也压在 Director 上

在 DR 模式中,请求保持:

CIP → VIP

Director 只通过二层封装把它交给选中的 Real Server:

目标 MAC
    ↓
Real Server MAC

Real Server 必须配置 VIP,并禁止对外抢答 VIP 的 ARP。

响应则直接发送:

VIP → CIP

不再经过 Director。

因此:

请求经过 Director
响应绕过 Director

DR 的优势是降低回包带宽压力,限制则是:

经典拓扑要求同一二层网络
Real Server 必须配置 VIP
必须正确处理 ARP
服务端口通常保持一致

最终选择不应该只看哪一种“更快”,而应该看:

后端是否跨子网
是否需要端口转换
请求与响应流量比例
Director 带宽
网络拓扑
ARP 配置能力
运维复杂度

最后,可以用一句话概括两种模式:

LVS-NAT 通过修改 IP 和端口,让请求与响应都经过负载均衡器;LVS-DR 则保留 VIP,只借助二层地址把请求交给 Real Server,再让 Real Server 以 VIP 身份直接回复客户端。

0

评论区