在现代互联网架构中,负载均衡和高可用性是确保服务稳定可靠的关键要素。今天我们来深入探讨LVS的DR(Direct Routing)模式与Keepalived的完美结合,看看它们如何共同构建高性能、高可用的服务架构。
什么是LVS?
LVS(Linux Virtual Server)是由章文嵩博士发起的开源项目,现在已经是Linux内核的一部分。它通过在操作系统内核层面实现负载均衡,将多台服务器组成一个高性能、高可用的虚拟服务器。
LVS支持三种主要工作模式:
NAT模式:通过地址转换实现负载均衡
TUN模式:通过IP隧道实现跨网络的负载均衡
DR模式:直接路由模式,性能最佳
| 模式 | 原理 | 优缺点 |
| NAT |
Director 改变数据包目标IP并转发, RS响应包回到Director再发客户端 |
优点:节点可任意OS;缺点: Director是瓶颈 |
| DR |
Director 改变目标MAC地址,RS直接 响应客户端 |
优点:Director不处理响应;缺 点:节点需与Director同网段 |
| TUN |
Director 封装IP包到隧道,RS解封直 接响应客户端 |
优点:Director不处理响应;缺 点:节点需支持IP隧道 |
一、LVS DR模式深度解析
1、DR模式的工作原理和优缺点
DR模式是LVS中最常用且性能最高的模式。它的核心思想是:数据包进来时经过负载均衡器,但回去时直接由真实服务器响应客户端,不经过负载均衡器。
1、工作流程:
客户端发送请求到VIP(Virtual IP)
负载均衡器接收请求,根据调度算法选择一台真实服务器
负载均衡器将数据帧的MAC地址改为真实服务器的MAC地址
真实服务器接收到数据包,处理请求
真实服务器直接通过网关将响应返回给客户端
2、DR模式的优缺点
优点:
高性能:响应数据直接返回客户端,不经过负载均衡器
支持高并发:负载均衡器不会成为网络瓶颈
扩展性强:可以轻松添加更多真实服务器
缺点:
真实服务器和负载均衡器必须在同一局域网
需要配置ARP抑制,配置相对复杂
2、DR模式部署步骤
1、服务器规划
DR 服务器:192.168.10.23
Web 服务器1:192.168.10.16
Web 服务器2:192.168.10.17
vip:192.168.10.180
2、环境架构


3、配置负载调度器(Director Server)
1、系统配置
systemctl stop firewalld.service
setenforce 0
modprobe ip_vs
yum -y install ipvsadm
2、配置虚拟IP
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
# 内容
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
ifup ens33:0
ifconfig ens33:0
3、调整内核参数
vim /etc/sysctl.conf
# 添加
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
4、配置 LVS 服务及调度
ipvsadm -C
ipvsadm -A -t 192.168.10.180:80 -s rr
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.16:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.17:80 -g
ipvsadm -ln # 查看节点状态,Route代表DR模式
4、配置节点服务器(Real Server)
1、配置 VIP 到 lo 接口
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
# 内容
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
ifup lo:0
ifconfig lo:0
route add -host 192.168.10.180 dev lo:0
2、ARP 参数调整,避免MAC冲突
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
3、安装 Web 服务
# 192.168.10.16
echo 'this is 192.168.10.16 web01!' > /var/www/html/index.html
# 192.168.10.17
echo 'this is 192.168.10.17 web02!' > /var/www/html/index.html
5、测试 LVS 群集
在客户端浏览器访问:http://192.168.10.180/
应轮询显示不同节点页面内容。
注意:LVS-DR 用户访问http://192.168.10.180/ 下次刷新时 延迟50秒

3、LVS调度算法
固定调度:rr、wrr、dh、sh
动态调度:lc、wlc、lblc
| 算法 | 描述 |
| rr |
轮询,每个RS均摊 |
| wrr |
加权轮询,权重高的分配多 |
| dh |
目的地址哈希分配 |
| sh |
源地址哈希分配 |
| lc |
最少连接数 |
| wlc |
加权最少连接 |
| lblc |
基于地址的最少连接 |
4、Nginx vs LVS vs HAProxy 区别
|
特性 |
Nginx |
LVS (Linux Virtual Server) |
HAProxy |
| 定位 |
Web 服务器 + 反向代理 + 负载均衡 |
内核级四层负载均衡 |
专业负载均衡器(四层 +七层) |
| 工作层级 |
四层(TCP)+ 七层 (HTTP/HTTPS) |
四层(TCP/UDP,传输层) |
四层 + 七层 |
| 性能 |
高(软件级,单机可达 十万级并发) |
极高(内核态,百万级并发) 高 |
高(接近 Nginx,但更专 注负载均衡) |
| 绞尽脑汁 |
– 静态资源服务- 反向代 理- 缓存- 支持 HTTP/HTTPS 负载均衡 |
– 高性能转发- 调度算法丰富 (RR、LC、SH…)- 内核态转 发,几乎无性能损耗 |
– 专注于负载均衡- 健康检 查更强大- 支持会话保 持、SSL 卸载等 |
| 健康价检查 |
简单(TCP/HTTP) |
依赖 Keepalived 或其他工具 |
强大(多协议、多方式) |
| 配置复杂度 | 简单 |
较复杂(需 ipvsadm/keepalived 配合) |
中等(配置文件灵活) |
| 适用场景 |
Web 代理、动静分离、 中小型集群 |
超大规模集群、核心四层调度 |
高可用集群、对健康检查 要求高的业务 |
| 优缺点 |
优点:功能多,易上手 缺点:七层性能不如 LVS/HAProxy |
优点:性能最强,稳定缺点:只 能四层,配置偏复杂 |
优点:专业负载均衡,健 康检查强缺点:不自带 Web 服务 |
总结:
Nginx:轻量、全能,适合 Web 服务和中小型负载均衡。
LVS:极致性能,适合四层超大规模集群,但功能单一。
HAProxy:专业负载均衡器,四层+七层都行,健康检查能力最强
二、LVS+Keepalived群集
1、Keepalived:高可用的守护者
Keepalived是一个基于VRRP协议的高可用解决方案,它可以检测服务器状态,并在主服务器故障时自动切换到备份服务器。
1、Keepalived的核心功能
健康检查:定期检查真实服务器的健康状态
故障转移:主节点故障时自动切换到备份节点
虚拟IP管理:管理VIP在节点间的漂移
LVS 集群管理
2 、VRRP 工作原理
MASTER 节点发送心跳(通告)给 BACKUP 节点。
BACKUP 节点收不到心跳时,接管 VIP。
MASTER 恢复时,可抢回 VIP(抢占模式)或不抢回(非抢占模式)。
默认多播地址:224.0.0.18
优先级决定 MASTER 节点(数值越大优先)。
3 、Keepalived 主要模块
| 模块 | 功能 |
| core |
核心进程、配置文件加载解析 |
| vrrp |
VRRP 协议实现,高可用 |
| check |
健康检查,支持 TCP/HTTP/脚本检查 |
2、脑裂问题与防护
1、脑裂(Split Brain)
两个节点失去心跳连接,均认为对方挂掉。
后果:
共享资源冲突
数据损坏(如数据库)
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为
2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢
“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边
“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。
2、原因
1. 心跳线故障(断线、老化)
高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老
化)。
2. 网卡/驱动故障
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
3. 心跳网络设备故障
因心跳线间连接的设备故障(网卡及交换机)。
4. 仲裁机器异常
因仲裁的机器出问题
5. 防火墙阻挡 VRRP
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
6. 配置不一致(virtual_router_id、优先级、实例名)
Keepalive配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发
生。
7. vrrp实例名字不一致、优先级一致。
3.、防护策略
* 双心跳线冗余
添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少“裂脑”发生几率。
* 磁盘锁(锁定共享资源)
正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现 实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
* 仲裁机制(Ping 参考 IP)
例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
* 脚本监控报警
4、部署步骤
1、环境准备
主 DR:192.168.10.80(MASTER)
备 DR:192.168.10.23(BACKUP)
VIP:192.168.10.180
Web 节点:
192.168.10.16
192.168.10.17
客户端:192.168.10.100
2、安装与配置 LVS + Keepalived
LVS DR + Keepalived:完美组合
将LVS DR模式与Keepalived结合,我们可以获得:
架构优势
高性能负载均衡:LVS DR模式提供高效的流量分发
自动故障转移:Keepalived确保服务的高可用性
健康状态监控:自动检测并剔除故障节点
无缝切换:故障转移对客户端透明
1)DR 服务器操作
systemctl stop firewalld
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs # 检查模块
2)配置 Keepalived
文件:/etc/keepalived/keepalived.conf
关键配置:
global_defs {
router_id LVS_01 # MASTER 为 LVS_01,BACKUP 为 LVS_02
smtp_server 127.0.0.1
}
vrrp_instance VI_1 {
state MASTER # BACKUP 节点写 BACKUP
interface ens33
virtual_router_id 10
priority 100 # MASTER 高于 BACKUP
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.10.180
}
}
virtual_server 192.168.10.180 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.16 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.17 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3)VIP 配置:
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
4)重启网络:
systemctl restart network
ifup ens33:0
5、启动服务
systemctl start keepalived
ip addr # 查看 VIP 是否生效
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln # 查看 LVS 配置
6、内核参数优化
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
7、配置 Web 节点
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd
echo 'this is kgc web!' > /var/www/html/index.html # 192.168.10.16
echo 'this is benet web!' > /var/www/html/index.html # 192.168.10.17
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
service network restart
ifup lo:0
route add -host 192.168.10.180 dev lo:0
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
8、测试
1、客户端访问 VIP:
http://192.168.10.180/
2、停掉 MASTER Keepalived:
systemctl stop keepalived
总结
LVS DR模式与Keepalived的组合为构建高性能、高可用的Web服务提供了强大的基础架构。通过直接路由模式,我们获得了接近线速的转发性能;通过Keepalived,我们实现了自动故障转移和服务高可用。
这种架构特别适合:
高并发Web服务
需要低延迟响应的应用
对服务可用性要求严格的场景
虽然初始配置相对复杂,但一旦部署完成,这套系统将为企业提供稳定可靠的负载均衡服务,是构建大型互联网服务的不二选择。
希望这篇博客能帮助大家更好地理解LVS DR模式和Keepalived的工作原理和配置方法。如果有任何问题或建议,欢迎在评论区留言讨论!


