keepalived + lvs 高可用负载均衡通过主备调度器共用 vip 实现故障自动漂移,并利用 tcp 检查实时感知 rs 健康状态、自动剔除/恢复节点,全部基于内核模块与标准协议,无需外部组件。

配置 Keepalived + LVS 高可用负载均衡,核心是让两台调度器(Dir)对外共用一个 VIP,主节点故障时 VIP 自动漂移到备节点,同时 LVS 能实时感知后端 Real Server(RS)的健康状态并剔除异常节点。整个过程不依赖外部组件,全部基于 Linux 内核与标准协议实现。
基础环境准备
需要至少四台机器(可虚拟机模拟):
- 主调度器(Master Dir):如 192.168.93.140,安装 keepalived + ipvs 内核模块
- 备调度器(Backup Dir):如 192.168.93.139,同样安装 keepalived + ipvs
- 真实服务器(RS1/RS2):如 192.168.93.141、192.168.93.142,运行 Nginx/Apache 等服务
- VIP(虚拟 IP):如 192.168.93.200,客户端通过该地址访问服务
所有节点关闭 firewalld 和 SELinux,确保内网互通,网卡名统一(如 ens33),时间同步。
LVS 调度器基础配置
在主、备调度器上执行相同操作:
- 加载 ip_vs 内核模块:
modprobe ip_vs && echo "ip_vs" >> /etc/modules - 确认模块已加载:
lsmod | grep ip_vs - 安装 keepalived:
yum install -y keepalived(CentOS/RHEL) - Keepalived 自带 ipvsadm 功能,无需单独安装 ipvsadm 包
注意:LVS 在本方案中采用 DR(Direct Routing)模式,性能最优。RS 需配置 VIP 的 lo 接口并抑制 ARP 响应,避免响应客户端对 VIP 的 ARP 请求。
Keepalived 主备配置要点
主节点 /etc/keepalived/keepalived.conf 关键段落:
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.93.200/24 dev ens33 label ens33:1
}
}
备节点仅需修改三处:
state BACKUP-
priority 90(必须低于主节点) -
virtual_router_id保持一致(否则无法组成 VRRP 组)
务必注释掉 vrrp_strict,否则因缺少多播路由或单播限制导致 VIP 无法绑定。
后端健康检查与自动剔除
Keepalived 内置检查机制,直接在 vrrp_instance 下添加:
virtual_server 192.168.93.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.93.141 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.93.142 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
这样 Keepalived 不仅管理 VIP 漂移,还会定期探测 RS 的 80 端口。一旦失败,自动从 ipvs 规则中删除该 RS;恢复后自动加回,全程无需人工干预。
验证与排错关键点
启动服务后,依次检查:
- 主节点运行
ip a,确认 VIP(192.168.93.200)已绑定到 ens33:1 - 执行
ipvsadm -Ln,看到两条 ActiveConn 为 0 的 RS 条目,State 为 Active - 客户端访问
http://192.168.93.200,能正常返回 RS 页面内容 - 手动停掉一台 RS 的 Nginx,等待 10 秒左右,
ipvsadm -Ln中对应条目消失,访问仍可用 - 停掉主节点 keepalived,VIP 应在 3 秒内出现在备节点,且服务不中断
常见问题:VIP ping 不通——检查是否禁用了 ICMP;RS 不生效——确认 DR 模式下 RS 的 lo 配置和 arp_ignore/arp_announce 参数;切换失败——优先级、vrid、认证密码三者必须完全一致。










