news 2026/10/10 6:09:23

第五篇:Keepalived + LVS 四层负载均衡高可用实战:DR 模式全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第五篇:Keepalived + LVS 四层负载均衡高可用实战:DR 模式全流程

开篇

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_LB2
  • state BACKUP
  • priority 100
  • unicast_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 模式)是把"负载均衡"和"高可用"合二为一的生产级方案:

  1. LVS 负责转发:virtual_server段定义调度算法、RS 列表、健康检查。
  2. Keepalived 负责 HA:vrrp_instance段让两台 Director 主备,VIP 自动漂移。
  3. RS 负责回包:绑定 lo:0 + 抑制 ARP,实现 DR 模式最高性能。

一套配置解决LB + HA两个问题,是四层高并发的经典选择。如果后面需要更细的七层能力,再在前端叠加 Nginx 即可。

本文为 Keepalived 高可用系列第 5 篇。下一篇(完结篇):Keepalived 脑裂专题与防脑裂实战。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 6:07:00

web.py 快速入门:8 行代码构建你的第一个 Python Web 应用

后端Web框架 【免费下载链接】webpy web.py is a web framework for python that is as simple as it is powerful. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/we/webpy 点击查看 免费下载 web.py 是一个"简单而强大"的 Python Web 框架&#xff0c;其…

作者头像 李华
网站建设 2026/10/10 6:06:45

多重继承与菱形继承:虚继承到底解决了什么

多重继承&#xff08;multiple inheritance&#xff09;是 C 少数几个「别的语言基本不给」的特性。它本身不难用&#xff0c;真正的坑在菱形继承&#xff08;diamond inheritance&#xff09;&#xff1a;当 D 同时继承 B1 和 B2&#xff0c;而这两者又都继承自 A 时&#xff…

作者头像 李华
网站建设 2026/10/10 6:06:38

Linux --传输层协议 UDP

传输层是干什么的&#xff1f;传输层位于网络层之上、应用层之下&#xff0c;核心任务只有一个&#xff1a;负责把数据从发送端传输到接收端。网络层&#xff08;IP&#xff09;负责把数据送到目标主机&#xff0c;但主机上可能同时运行着很多程序&#xff08;浏览器、QQ、微信…

作者头像 李华
网站建设 2026/10/10 6:06:35

pprof 火焰图(Flame Graph)阅读与热点代码重构实战

pprof 火焰图&#xff08;Flame Graph&#xff09;阅读与热点代码重构实战 一、核心概念与架构设计 上一篇用 go tool pprof -top 看到了函数级的耗时排名&#xff0c;但排名有一个致命缺陷&#xff1a;它丢掉了调用关系。fmt.Sprintf 占 8% 的 CPU&#xff0c;这 8% 是谁调用它…

作者头像 李华
网站建设 2026/10/10 6:06:07

工业相机标定实战:内参模型选择与双目标定闭环

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 6:05:57

雪花 ID 传到前端就变了个数?我用全局 Long 转 String 一次收口

先说结论 MyBatis-Plus 默认的雪花算法&#xff08;IdType.ASSIGN_ID&#xff09;生成的是 19 位 Long&#xff0c;而 JS 的 Number 能精确表示的最大整数是 2^53 - 1 9007199254740991&#xff08;16 位&#xff09;。 19 位 > 16 位 → id 以数字形式进 JSON 就必然丢精度…

作者头像 李华