开篇
Keepalived 不只是"VIP 漂移工具"——它天生就是为 LVS(Linux Virtual Server)设计的。很多人不知道,Keepalived 的看家本领就是管理 LVS 集群,实现四层负载均衡 + 高可用的一体化方案。
本文作为 Keepalived 系列第 5 篇,带你用Keepalived 直接管理 LVS(DR 模式),搭建一套能抗高并发的四层负载均衡入口。区别于第 1 篇的 Nginx 应用层高可用,这里是纯四层(TCP/UDP)转发,性能极高,适合数据库、缓存、微服务等对吞吐要求高的场景。
一、为什么用 LVS + Keepalived,而不是 Nginx?
| 对比 | LVS(四层) | Nginx(七层) |
|---|---|---|
| 工作层级 | 传输层(TCP/UDP) | 应用层(HTTP) |
| 吞吐性能 | 极高,转发近乎内核态 | 中,需处理应用协议 |
| 可做 URL 路由 | 不能 | 能(七层特性) |
| 会话保持 | 靠调度算法 | 靠 sticky/cookie |
| 适用 | 数据库、缓存、海量连接 | Web、API 网关、SSL |
结论:海量 TCP 连接、要求极致吞吐 → LVS;需要按 URL 分流、SSL 卸载 → Nginx。两者也可叠加(LVS 在前,Nginx 在后)。
而 Keepalived 的价值在于:它直接读写 LVS 规则(通过内核接口),既能配virtual_server,又能做 LVS 调度器的 HA。一套配置,LB 和高可用全搞定。
二、LVS 三种工作模式对比
| 模式 | 请求/响应路径 | 是否需要 VIP 在 RS 上 | 优缺点 |
|---|---|---|---|
| DR(直接路由) | 请求→LB,响应→RS 直接回客户端 | 需要(RS 也配 VIP,但抑制 ARP) | 性能最高、最常用 |
| NAT | 请求和响应都经过 LB | 不需要 | 简单,但 LB 成瓶颈 |
| TUN(隧道) | 请求→LB,响应→RS 直接回 | 需要 | 支持跨网段,配置复杂 |
生产首选 DR 模式:LB 只改 MAC 不改数据包,响应由 RS 直接回,LB 压力最小,吞吐最高。
三、DR 模式架构设计
+------------------+ |
| 客户端 | |
| 访问 VIP | |
+--------+---------+ |
| |
(VIP 192.168.1.100) |
| |
+--------+---------+ <<< Director (LB主) |
| LB1 (MASTER) | 192.168.1.11 / priority 150 |
+-------------------+ keepalived + LVS规则 |
| |
+-----------+-----------+ |
| | |
+--------+-------+ +-------+--------+ |
| RS1 | | RS2 | <<< Real Server (真实服务) |
| 192.168.1.21 | | 192.168.1.22 | 都配 VIP + 抑制ARP |
| Nginx/Web | | Nginx/Web | |
+----------------+ +----------------+ |
- Director(LB):LB1=192.168.1.11(主),LB2=192.168.1.12(备),它们跑 Keepalived + LVS,负责把流量分发给 RS。
- Real Server(RS):192.168.1.21 / 192.168.1.22,真正的业务服务器,都配了 VIP 但抑制 ARP 响应。
- VIP:192.168.1.100。
DR 模式的精髓:VIP 既在 Director 上,也在每个 RS 上。但 RS 通过抑制 ARP 让自己"看不见"VIP,避免和 Director 抢应答,最终只有持有 VIP 的 Director 对外响应。这样 RS 能直接用 VIP 回包(因为 VIP 就在本地)。
四、Real Server 配置(RS1、RS2 都做)
4.1 给 RS 绑定 VIP 并抑制 ARP
编辑/etc/init.d/lvs_rs.sh(或写成 systemd),RS 上执行:
bash
#!/bin/bash |
VIP=192.168.1.100 |
# 绑定 VIP 到回环口(lo),用于回包 |
ip addr add $VIP/32 dev lo label lo:0 |
# 抑制 ARP:不对外宣告 VIP,不响应 VIP 的 ARP 请求 |
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore |
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce |
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore |
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce |
# 开启路由转发 |
echo 1 > /proc/sys/net/ipv4/ip_forward |
bash
chmod +x /etc/init.d/lvs_rs.sh |
/etc/init.d/lvs_rs.sh |
arp_ignore=1:只回答目标 IP 是本机接口上地址的 ARP。arp_announce=2:尽量使用能直接路由到目标的最优本地地址。这两项是 DR 模式 RS 的标配。
4.2 在 RS 上启动真实服务
bash
yum install -y nginx |
echo "<h1>Backend from 192.168.1.21</h1>" > /usr/share/nginx/html/index.html # RS1 |
echo "<h1>Backend from 192.168.1.22</h1>" > /usr/share/nginx/html/index.html # RS2 |
systemctl start nginx |
五、Director(LB)配置
5.1 确认内核支持 ip_vs
bash
modprobe ip_vs |
lsmod | grep ip_vs |
5.2 安装并让 Keepalived 管理 LVS
bash
yum install -y keepalived ipvsadm |
ipvsadm -L -n # 查看 LVS 规则 |
5.3 keepalived.conf(LB 主节点)
Keepalived 通过virtual_server块管理 LVS,核心配置如下:
conf
global_defs { |
router_id KEEPALIVED_LB1 |
} |
vrrp_instance VI_LB { |
state MASTER |
interface eth0 |
virtual_router_id 90 |
priority 150 |
advert_int 1 |
authentication { |
auth_type PASS |
auth_pass Lvs8848 |
} |
unicast_src_ip 192.168.1.11 |
unicast_peer { |
192.168.1.12 |
} |
virtual_ipaddress { |
192.168.1.100/24 dev eth0 label eth0:0 |
} |
track_interface { |
eth0 |
} |
} |
# ===== LVS 负载均衡规则(这是 Keepalived 管 LVS 的核心)===== |
virtual_server 192.168.1.100 80 { |
delay_loop 6 # 健康检查间隔(秒) |
lb_algo rr # 调度算法:rr=轮询, wlc=加权最少连接 |
lb_kind DR # 工作模式:DR |
persistence_timeout 60 # 会话保持时间(秒),0=关闭 |
protocol TCP # 协议 TCP / UDP |
real_server 192.168.1.21 80 { |
weight 1 # 权重 |
TCP_CHECK { # 健康检查方式 |
connect_timeout 3 |
nb_get_retry 3 |
delay_before_retry 3 |
} |
} |
real_server 192.168.1.22 80 { |
weight 1 |
TCP_CHECK { |
connect_timeout 3 |
nb_get_retry 3 |
delay_before_retry 3 |
} |
} |
} |
5.4 备份 LB 节点配置
复制主节点配置,改四处:
router_id KEEPALIVED_LB2state BACKUPpriority 100unicast_src_ip 192.168.1.12,unicast_peer { 192.168.1.11 }
virtual_server段保持完全一致(LB 主备管理同一套 LVS 规则)。
5.5 启动
bash
keepalived -t |
systemctl start keepalived |
systemctl enable keepalived |
六、验证:负载均衡 + 健康检查 + 高可用
6.1 查看 LVS 规则是否生效
bash
ipvsadm -L -n |
# 输出示例 |
IP Virtual Server version 1.2.1 |
Prot LocalAddress:Port Scheduler Flags |
-> RemoteAddress:Port Forward Weight ActiveConn InActConn |
TCP 192.168.1.100:80 rr |
-> 192.168.1.21:80 Route 1 0 0 |
-> 192.168.1.22:80 Route 1 0 0 |
看到两条Route(DR 模式)且均为Route转发,说明 LVS 规则已加载。
6.2 验证负载均衡
bash
# 多次访问 VIP,应轮询到两台 RS |
for i in $(seq 1 6); do curl -s http://192.168.1.100; echo; done |
# 输出应交替出现: |
# Backend from 192.168.1.21 |
# Backend from 192.168.1.22 |
6.3 验证健康检查(RS 宕机自动摘除)
bash
# 停掉 RS1 的 nginx |
ssh 192.168.1.21 'systemctl stop nginx' |
# 稍等(delay_loop 6 秒内),再查 LVS 规则 |
ipvsadm -L -n |
# RS1 应被移除,只剩 RS2 |
流量自动全部转向 RS2,RS1 恢复 nginx 后自动加回。
6.4 验证 Director 高可用(LB 主宕机)
bash
# 停掉 LB1 的 keepalived 或直接断网 |
systemctl stop keepalived # 或 systemctl stop network |
观察 LB2:
bash
tail -f /var/log/messages | grep -i keepalived |
# 应出现 Entering MASTER STATE + gratuitous ARP |
ip addr show eth0 | grep 192.168.1.100 # VIP 漂到 LB2 |
ipvsadm -L -n # LB2 接管 LVS 规则 |
curl -s http://192.168.1.100 # 业务仍正常,轮询两台RS |
VIP 漂移 + LVS 规则由新主接管,对外完全无感,负载均衡服务不中断。
七、关键参数速查与排障
7.1 调度算法怎么选
| 算法 | 说明 | 适用 |
|---|---|---|
| rr | 轮询,均匀分配 | 各 RS 性能相当 |
| wrr | 加权轮询 | RS 性能不一 |
| wlc | 加权最少连接 | 长连接场景(如数据库) |
| sh / dh | 源/目标地址哈希 | 需固定节点、会话保持 |
7.2 健康检查方式
| 方式 | 说明 |
|---|---|
| TCP_CHECK | 建 TCP 连接探测端口 |
| HTTP_GET | 请求 URL 并校验状态码/内容 |
| MISC_CHECK | 执行自定义脚本 |
7.3 排障要点
| 现象 | 处理 |
|---|---|
| RS 不参与转发 | 检查 RS 的 arp_ignore/arp_announce、是否绑定 lo:0 |
| VIP ping 不通 | Director 上 VIP 是否绑定;ip addr确认 |
| LVS 规则没生效 | modprobe ip_vs;keepalived -t 校验 |
| 访问出现 502/超时 | 看 RS nginx 是否起、健康检查是否通过 |
| 两台 LB 都持 VIP | 心跳不通,改单播或放行 VRRP |
八、总结
Keepalived + LVS(DR 模式)是把"负载均衡"和"高可用"合二为一的生产级方案:
- LVS 负责转发:
virtual_server段定义调度算法、RS 列表、健康检查。 - Keepalived 负责 HA:
vrrp_instance段让两台 Director 主备,VIP 自动漂移。 - RS 负责回包:绑定 lo:0 + 抑制 ARP,实现 DR 模式最高性能。
一套配置解决LB + HA两个问题,是四层高并发的经典选择。如果后面需要更细的七层能力,再在前端叠加 Nginx 即可。
本文为 Keepalived 高可用系列第 5 篇。下一篇(完结篇):Keepalived 脑裂专题与防脑裂实战。