LVS+Keepalived 高可用集群
在现代网络服务架构中,高可用性(High Availability, HA)是保障业务连续性的核心要素。当面对海量用户请求时,单一服务器的单点故障可能导致整个服务中断,造成不可估量的损失。LVS(Linux Virtual Server)作为内核级四层负载均衡技术,具备百万级并发处理能力,而 Keepalived 基于 VRRP 协议实现高可用故障切换,两者结合可构建出高性能、高可靠的负载均衡集群
前言
在现代网络服务架构中,高可用性(High Availability, HA)是保障业务连续性的核心要素。当面对海量用户请求时,单一服务器的单点故障可能导致整个服务中断,造成不可估量的损失。LVS(Linux Virtual Server)作为内核级四层负载均衡技术,具备百万级并发处理能力,而 Keepalived 基于 VRRP 协议实现高可用故障切换,两者结合可构建出高性能、高可靠的负载均衡集群。本文将从理论原理出发,结合实战部署步骤,带您全面掌握 LVS+Keepalived 集群技术,同时配套流程图与关键注释,助力快速落地应用。
一、Keepalived 概述
1.1 Keepalived 简介
Keepalived 是一款基于 VRRP 协议的开源高可用解决方案,最初为 LVS 负载均衡集群设计,现已支持 Nginx、MySQL 等多种服务的高可用保障。其核心价值在于通过自动化故障检测与切换,消除单点故障风险,确保服务持续可用。
1.1.1 核心功能
- LVS 集群管理:通过配置文件直接管理 LVS 节点,动态维护负载均衡规则。
- 健康检查(Health Check):支持 TCP、HTTP、脚本等多种检测方式,实时监控后端服务器状态,故障节点自动剔除,恢复后自动归队。
- 故障自动切换(Failover):基于 VRRP 协议实现主备节点心跳检测,主节点故障时备节点无缝接管服务。
- VIP 接管:虚拟 IP(VIP)在主备节点间自动漂移,确保客户端访问地址不变。
1.1.2 Keepalived 工作原理
- 高可用基础:依托 VRRP 协议,将主备服务器组成虚拟路由器集群,对外提供统一 VIP。主节点定期发送心跳包,备节点监听,异常时触发切换。
- 健康检查机制:通过网络层(ICMP Ping)、传输层(端口检测)、应用层(脚本检测)三层检测,全面保障服务可用性。
- 选举策略:基于优先级数值(1-254)选举主节点,数值越高优先级越高,默认优先级为 100,支持静态配置或动态调整。
1.2 VRRP 协议基础
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)的核心目标是解决静态路由的单点故障问题,通过将多台物理服务器虚拟化为一个逻辑路由器,实现服务地址的统一与故障无缝切换。
1.2.1 VRRP 工作机制

- 角色划分:Master 节点负责处理客户端请求并发送心跳,Backup 节点处于热备状态。
- 心跳机制:Master 默认每 1 秒发送一次心跳通告,多播地址为 224.0.0.18。
- 故障切换:Backup 节点若在 3×心跳间隔时间内未收到通告,自动升级为 Master 并接管 VIP。
- 状态回归:Master 节点恢复后,默认以抢占模式抢回 VIP,可通过
nopreempt参数配置为非抢占模式。
二、Keepalived 体系架构与模块功能
2.1 核心模块组成
Keepalived 采用模块化设计,三大核心模块协同工作:
- Core 模块:核心进程,负责加载解析配置文件、管理主进程生命周期。
- VRRP 模块:实现 VRRP 协议,处理主备节点选举、状态切换与心跳通信。
- Check 模块:负责后端服务器健康检查,支持 TCP、HTTP、自定义脚本等多种检测方式。
2.2 工作流程

- 配置加载:服务启动时读取
/etc/keepalived/keepalived.conf,初始化 VRRP 实例与 LVS 负载规则。 - 集群初始化:根据优先级选举 Master 节点,Master 绑定 VIP 并开始提供服务。
- 状态监控:Master 定期发送心跳,同时 Check 模块监控后端 Real Server 状态。
- 动态调整:故障节点被自动剔除,恢复后重新加入;主节点故障时触发备节点切换。
2.3 状态管理机制
- 初始状态:Master 节点持有 VIP 并提供服务,Backup 节点处于监听状态,不绑定 VIP。
- 故障状态:Master 节点故障后,Backup 节点立即升级为 Master,绑定 VIP 并接管所有服务。
- 恢复状态:原 Master 节点修复后,若为抢占模式则抢回 VIP 恢复 Master 角色;非抢占模式下保持 Backup 状态,不干扰当前服务。
三、Keepalived 脑裂问题及解决方案
3.1 脑裂现象
脑裂(Split Brain)是高可用集群中最危险的故障场景:主备节点因通信中断失去联系,均判定对方故障,从而同时抢占 VIP 与服务资源,导致 IP 冲突、数据损坏或服务不稳定。
3.2 脑裂原因
- 心跳线故障:主备节点间的心跳链路断裂、老化或接触不良。
- 网络设备故障:心跳链路依赖的交换机、网卡等硬件设备故障。
- 配置不一致:VRRP 实例的
virtual_router_id、实例名称或优先级配置冲突。 - 防火墙拦截:服务器防火墙未放行 VRRP 协议(协议号 112),导致心跳包无法传输。
- 仲裁节点异常:用于决策的第三方仲裁服务器故障。
3.3 应对策略

- 双心跳线冗余:部署两条独立的心跳链路(如网卡直连+交换机连接),大幅降低心跳中断概率。
- 磁盘锁机制:主节点占用共享存储时锁定资源,脑裂发生时备节点无法抢占;采用智能锁,仅在心跳全断时启用锁定。
- 仲裁机制:配置网关或公共 IP 作为参考,心跳中断时双方 ping 参考 IP,不通则判定自身网络故障,主动放弃服务并重启释放资源。
- 脚本监控报警:部署监控脚本检测双节点 VIP 状态,发现冲突时立即发送告警(如邮件、短信),同时执行应急处理。
四、LVS+Keepalived 集群部署实践
4.1 环境准备
| 角色 | IP 地址 | 软件组件 | 核心配置 |
|---|---|---|---|
| 主 DR 服务器(Master) | 192.168.10.110 | ipvsadm、keepalived | 优先级 100,角色 MASTER |
| 备 DR 服务器(Backup) | 192.168.10.119 | ipvsadm、keepalived | 优先级 90,角色 BACKUP |
| Web 服务器 1(Real Server) | 192.168.10.120 | nginx | lo:0 绑定 VIP |
| Web 服务器 2(Real Server) | 192.168.10.123 | nginx | lo:0 绑定 VIP |
| 客户端 | 192.168.10.2 | - | 访问 VIP 测试 |
| 虚拟 IP(VIP) | 192.168.10.180 | - | 集群对外统一访问地址 |
注释:操作系统统一采用 CentOS 7,关闭防火墙与 SELinux,确保节点间网络互通。
4.2 负载调度器配置(主备相同)
4.2.1 基础环境配置
# 关闭防火墙与SELinux
systemctl stop firewalld.service
setenforce 0
# 安装依赖软件
yum -y install ipvsadm keepalived
# 加载LVS内核模块
modprobe ip_vs
# 验证模块加载成功
cat /proc/net/ip_vs
注释:ipvsadm 用于管理 LVS 负载规则,keepalived 提供高可用能力,ip_vs 是 LVS 核心内核模块。
4.2.2 Keepalived 配置
- 备份默认配置文件:
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
- 编辑主节点配置文件
keepalived.conf:
global_defs {
smtp_server 127.0.0.1 # 邮件告警服务器(可选)
router_id LVS_01 # 节点标识(主节点为LVS_01,备节点为LVS_02)
}
# VRRP实例配置
vrrp_instance VI_1 {
state MASTER # 主节点为MASTER,备节点为BACKUP
interface ens33 # 绑定VIP的网卡
virtual_router_id 10 # 虚拟路由器ID(主备必须一致)
priority 100 # 主节点优先级(高于备节点的90)
advert_int 1 # 心跳间隔1秒
# 认证配置(主备必须一致)
authentication {
auth_type PASS
auth_pass abc123
}
# 虚拟IP配置
virtual_ipaddress {
192.168.10.180
}
}
# LVS负载均衡配置
virtual_server 192.168.10.180 80 {
delay_loop 6 # 健康检查间隔6秒
lb_algo rr # 负载调度算法(轮询)
lb_kind DR # LVS模式(直接路由DR)
persistence_timeout 50 # 会话保持时间50秒
protocol TCP # 协议类型
# 后端Real Server 1配置
real_server 192.168.10.120 80 {
weight 1 # 权重(值越高分配到的请求越多)
TCP_CHECK { # TCP健康检查
connect_port 80 # 检查端口
connect_timeout 3 # 连接超时时间
nb_get_retry 3 # 重试次数
delay_before_retry 3 # 重试间隔
}
}
# 后端Real Server 2配置
real_server 192.168.10.123 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
- 备节点配置修改:
- 将
state MASTER改为state BACKUP - 将
priority 100改为priority 90 - 将
router_id LVS_01改为router_id LVS_02
注释:主备节点的
virtual_router_id、auth_pass必须一致,否则无法正常通信。
4.2.3 配置虚拟 IP
# 复制网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
配置内容如下:
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
重启网络服务使配置生效:
systemctl restart network
ifup ens33:0
# 验证VIP配置
ifconfig ens33:0
注释:VIP 采用 32 位子网掩码(255.255.255.255),确保其为独立主机地址,避免ARP冲突。
4.2.4 启动服务
# 启动Keepalived服务并设置开机自启
systemctl start keepalived
systemctl enable keepalived
# 保存LVS规则并启动服务
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl enable ipvsadm
# 验证配置(查看LVS规则)
ipvsadm -ln
# 验证VIP绑定(查看ens33网卡的IP)
ip addr show ens33 | grep 192.168.10.180
注释:
ipvsadm -ln输出中若显示后端 Real Server 列表,且 Forward 列显示 Route(DR模式),则配置成功。
4.2.5 调整内核参数
vim /etc/sysctl.conf
添加以下参数(禁用IP转发与重定向,避免DR模式冲突):
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.3 节点服务器配置(Real Server)
4.3.1 Web 服务器基础配置
# 关闭防火墙与SELinux
systemctl stop firewalld.service
setenforce 0
# 安装Nginx并启动
yum -y install nginx
systemctl start nginx
systemctl enable nginx
# 配置测试页面(两台服务器内容不同,用于验证轮询)
# 192.168.10.120服务器
echo "<h1>this is 192.168.10.120 web01</h1>" > /usr/share/nginx/html/index.html
# 192.168.10.123服务器
echo "<h1>this is 192.168.10.123 web02</h1>" > /usr/share/nginx/html/index.html
注释:通过不同的测试页面,可直观验证 LVS 轮询调度效果。
4.3.2 配置 Loopback 接口
# 复制回环接口配置
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
配置内容如下(绑定VIP到回环接口):
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
重启网络并添加路由:
systemctl restart network
ifup lo:0
# 添加VIP路由(确保请求通过lo接口处理)
route add -host 192.168.10.180 dev lo:0
# 验证路由
route -n | grep 192.168.10.180
注释:DR模式下,Real Server 需通过回环接口处理 VIP 请求,避免数据包转发冲突。
4.3.3 调整 ARP 参数
vim /etc/sysctl.conf
添加以下参数(禁止ARP响应与通告,避免VIP冲突):
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请求,arp_announce=2表示仅向网卡所在网段通告物理IP,避免VIP暴露导致的ARP冲突。
4.4 测试验证
4.4.1 访问负载均衡测试
在客户端(192.168.10.2)打开浏览器,访问 http://192.168.10.180,多次刷新页面:
- 正常情况会轮询显示 “this is 192.168.10.120 web01” 和 “this is 192.168.10.123 web02”,说明 LVS 轮询调度生效。
4.4.2 故障切换测试

- 模拟主节点故障:在主 DR 服务器(192.168.10.110)执行:
systemctl stop keepalived
- 验证备节点接管:在备 DR 服务器(192.168.10.119)执行:
ip addr show ens33 | grep 192.168.10.180
- 若输出包含 VIP(192.168.10.180),说明备节点成功接管。
- 客户端访问验证:再次访问
http://192.168.10.180,服务仍正常可用。 - 主节点恢复测试:重启主节点 Keepalived:
systemctl start keepalived
- 执行
ip addr show ens33 | grep 192.168.10.180,验证 VIP 是否回归主节点(抢占模式下会自动回归)。
总结
LVS+Keepalived 集群通过 “LVS 高性能负载均衡 + Keepalived 高可用故障切换” 的组合,构建了兼具性能与可靠性的基础设施解决方案。其核心优势在于:LVS 内核级转发保障百万级并发,Keepalived 自动化故障切换消除单点风险,DR 模式下响应报文直接回传客户端,进一步提升性能。
部署过程中需重点关注:主备节点配置一致性(虚拟路由器ID、认证密码)、ARP参数与内核参数优化(避免冲突)、脑裂防护策略(双心跳线、仲裁机制)。该架构不仅适用于 Web 服务,还可扩展至数据库、应用服务器等场景,是企业级高可用架构的首选方案之一。
更多推荐

所有评论(0)