1. 什么是 Keepalived?
在分布式集群中,单点故障(SPOF) 是影响系统稳定性的重要问题。Keepalived 作为一款高可用服务软件,可以有效防止集群单点故障,保障系统的高可用性。
Keepalived 最初是为 LVS(Linux Virtual Server)设计,用于管理和监控 LVS 集群节点。后来加入 VRRP(Virtual Router Redundancy Protocol)功能,不仅具备负载均衡能力,还可用于高可用解决方案。在 VRRP 虚拟路由器中,多个物理路由器通过竞选确定 MASTER 角色,负责路由工作,其他为 BACKUP。MASTER 角色可动态切换,确保高可用性。
1.1 Keepalived 的作用
- 高可用(HA) :通过 VRRP(虚拟路由冗余协议) ,实现主备切换,保障 IP 高可用性。
- 负载均衡(LB) :最初为 LVS(Linux Virtual Server) 设计,可用于管理 LVS 集群。
1.2 Keepalived 与 VRRP 机制
在 VRRP 模式下,一个 VIP(虚拟 IP) 被多个物理服务器共享,但只有一台 Master 负责转发流量,其他的 Backup 处于待命状态:
- Master 负责转发流量
- Backup 监听 Master 状态
- Master 故障时,Backup 自动接管 VIP,提供不中断的服务
VRRP 的通信采用 IP 多播(多播地址 224.0.0.18) ,客户端完全透明,不需要修改路由配置。
💡 你可能会问 VRRP 怎么实现的?
VRRP 通过竞选协议来实现虚拟路由的功能,所有的协议报文都是通过 IP 多播(Multicast)包(多播地址 224.0.0.18)形式发送的。虚拟路由是由 VRID(范围 0-255) 和一组 IP 地址组成,对外表现为一个周知的 MAC 地址:00-00-5E-00-01-【VRID】 (这就是为什么后面的配置 virtual_router_id 为什么只能是 0 - 255)。在一个虚拟路由中,不管谁是 MASTER,对外都是相同的 MAC 和 IP(虚拟VIP)。客户端主机并不需要因为 MASTER 的改变而修改自己的路由配置,即对客户端来说这种主备切换是无感知的。
2. Keepalived 如何工作?
2.1 Keepalived 高可用架构
Keepalived 是主备高可用功能正常运行的基础,它负责主机和备机的心跳检测和浮动 IP 切换等底层核心工作,如果检测到异常,会自动发生主备切换,浮动会漂移到备机,备机提升为主机继续提供服务(可支持一主多备架构)。其中数据库和 Redis 是通过主从复制机制进行数据同步保持主备数据的一致性,详情可见前面两篇文章。
-
主机(MASTER)与备机(BACKUP)
- 主机 负责数据库和 Redis 的读写,并接管 Keepalived 管理的 VRRP 虚拟 IP(即可通过 VIP 访问主机)。
- 备机 处于待命状态,仅可通过真实 IP 进行只读访问(例如数据同步、健康检查)。
-
VIP(虚拟 IP)
- 业务访问 Redis 和数据库时,优先通过 VIP 连接,确保主机可用性。
- Keepalived 监控主机健康状态,若主机故障,则 VIP 自动切换到备机,保证服务不中断。
-
故障切换(Failover)
- 当 Keepalived 发现主机故障时,VRRP 机制将 VIP 切换到备机,备机接管数据库和 Redis 的读写。
- 原主机恢复后,可能需要重新竞选 MASTER,也可以设定优先级策略,避免频繁切换。
2.2 Master 与 Backup 的竞选机制
-
初始化阶段
- 多台 VRRP 路由器启动,并加入同一个 VRRP 组。
- 每台路由器都有一个 优先级(Priority) 。
-
竞选 MASTER
- 所有路由器发送 VRRP 多播报文(224.0.0.18) 宣告自己的优先级。
- 优先级最高的设备当选 MASTER,其余设备成为 BACKUP。
- 如果优先级相同,则 IP 地址最高的设备 成为 MASTER。
-
正常运行
- MASTER 定期发送 VRRP 广播,告诉 BACKUP:“我还在正常工作”。
- BACKUP 设备一直监听 MASTER 的 VRRP 报文,如果收到,则继续保持 BACKUP 状态。
-
MASTER 故障(主备切换)
- 如果 BACKUP 在一定时间内收不到 MASTER 的 VRRP 报文(注意防火墙原因导致配置失败),就认为 MASTER 故障。
- BACKUP 设备重新发起竞选,选出新的 MASTER,继续提供服务。
-
原 MASTER 恢复(可选)
-
如果原 MASTER 恢复上线,它可配置是否重新加入竞选或者按照备节点部署:
- 如果它的优先级比当前 MASTER 高,它会重新当选 MASTER,并接管流量。
- 如果优先级低,则继续作为 BACKUP 设备。
-
3. Keepalived 安装与部署
3.1 安装 Keepalived
Keepalived 可在大部分 Linux 发行版中直接安装:
yum install -y keepalived
3.2 部署环境准备
测试两台主机(一主一备)环境:
主机:192.168.121.23
备机:192.168.121.24
浮动IP:192.168.121.155
提前将防火墙 VRRP 协议对端放开:
# 防火墙设置(主备机都需要执行)
sed -i "/-A INPUT -j REJECT --reject-with icmp-host-prohibited/i -A INPUT -d 224.0.0.0/8 -i ens33 -p vrrp -j ACCEPT" /etc/sysconfig/iptables
sed -i "/-A INPUT -j REJECT --reject-with icmp-host-prohibited/i -A OUTPUT -d 224.0.0.0/8 -o ens33 -p vrrp -j ACCEPT" /etc/sysconfig/iptables
# 防火墙重启
service iptables restart
3.3 配置 Keepalived
Keepalived 采用模块化设计,不同模块实现不同功能,主要由 core、check 和 vrrp 三个模块组成:
-
core(核心模块):
- 负责 Keepalived 主进程的启动和维护。
- 解析并加载全局配置文件,管理整体运行逻辑。
-
check(健康检查模块):
- 负责对后端服务(如 LVS、IPVS)进行健康检查。
- 提供多种健康检查方式,并解析对应的健康检查配置。
-
vrrp(VRRP 模块):
- 运行 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)子进程。
- 负责管理虚拟 IP(VIP)的选举和切换,实现高可用故障转移。
主机配置
主机 keepalived 配置文件 keepalived.conf 配置示例:
! Configuration File for keepalivedglobal_defs {notification_email {root@localhost.localdomain}notification_email_from ha@localhost.localdomainsmtp_server 127.0.0.1smtp_connect_timeout 30router_id r_id
}vrrp_script check_run {script /opt/keepalived/ha/ha_service_check.shinterval 3 # 检测时间间隔 单位sfall 3 # 连续失败次数达到 3 次后执行下面的操作#weight -60 #
}vrrp_instance VI_1 {state BACKUP#nopreempt # 配置是否抢占、和priority配合使用interface ens33 # 网卡track_interface {ens33}virtual_router_id 155 # 匹配号priority 150 # 优先级advert_int 2 # VRRP 通告频率 单位秒authentication {auth_type PASSauth_pass P@sSw0rd}track_script {check_run}notify_fault /opt/keepalived/ha/ha_notify_fault.shnotify_master /opt/keepalived/ha/ha_notify_master.shnotify_backup /opt/keepalived/ha/ha_notify_backup.shvirtual_ipaddress {192.168.121.155/19 dev ens33 scope global}
}
📌 重点参数解析:
state MASTER
:表示当前节点是主服务器(另一台应为BACKUP
)priority 100
:优先级(值越大,越容易成为 Master)virtual_router_id
:虚拟路由 ID,所有 VRRP 设备需一致virtual_ipaddress
:虚拟 IP(VIP),提供高可用track_script
:执行的检测脚本nopreempt
:如果存在,则表示不抢占,和优先级参数(priority)一起配合使用advert_int
:检查间隔,单位秒。
💡 关键点:
priority
可用于控制主备切换的优先级virtual_router_id
必须一致,否则主备不会识别
备机配置
和主机基本保持一致,角色都是设置为 BACKUP,只是主机优先级设置为 150,备机优先级设置为 100。在这种情况下,当发生主备切换后,即使之前的主节点恢复运行,它也不会抢占备用节点成为新的主节点。原来的备用节点将继续作为主节点提供服务,直到发生故障或手动切换。这种行为确保了在主节点失效后,备用节点能够稳定地接管服务,并且在主节点恢复运行时不会引起不必要的主从切换,保持系统的稳定性。
! Configuration File for keepalivedglobal_defs {notification_email {root@localhost.localdomain}notification_email_from ha@localhost.localdomainsmtp_server 127.0.0.1smtp_connect_timeout 30router_id r_id
}vrrp_script check_run {script /opt/keepalived/ha/ha_service_check.shinterval 3 # 检测时间间隔 单位sfall 3 # 连续失败次数达到 3 次后执行下面的操作#weight -60
}vrrp_instance VI_1 {state BACKUP#nopreempt # 配置是否抢占interface ens33 # 网卡track_interface {ens33}virtual_router_id 155 # 匹配号priority 100 # 优先级advert_int 2 # VRRP 通告频率 单位秒authentication {auth_type PASSauth_pass P@sSw0rd}track_script {check_run}notify_fault /opt/keepalived/ha/ha_notify_fault.shnotify_master /opt/keepalived/ha/ha_notify_master.shnotify_backup /opt/keepalived/ha/ha_notify_backup.shvirtual_ipaddress {192.168.121.155/19 dev ens33 scope global}
}
3.4 主备切换通知及检测机制
在主备配置完成后,或发生主备切换时,Keepalived 可触发通知,并执行相应的脚本,确保高可用性。
通知脚本触发机制
在以下两种情况下,Keepalived 会执行通知脚本:
- 主备状态发生切换(包括 Keepalived 启动时的角色确定)。
- 异常情况触发(如检测到 Redis/数据库服务故障、关键进程异常等)。
通知脚本可用于告警通知、日志记录、服务切换等操作。
3.5 主备状态检测脚本配置
Keepalived 通过 vrrp_script
定义健康检查规则,检测异常并触发相应的主备切换流程。
vrrp_script check_run {script /opt/keepalived/ha/ha_service_check.sh # 健康检测脚本interval 3 # 检测间隔时间,单位:秒fall 3 # 连续失败 3 次后,触发主备切换
}
检测机制说明:
- 检测间隔:每 3 秒执行一次检测。
- 失败阈值:当检测到连续 3 次失败,触发
notify_fault
事件,执行/opt/keepalived/ha/ha_notify_fault.sh
,停止keepalived
,进入故障状态。
3.6 自定义触发主备切换
除因宕机、Keepalived 进程异常退出导致的主备切换外,还支持自定义触发条件。例如,可在检测到以下异常情况时触发切换:
- 关键 Java 进程异常,导致服务不可用。
- Redis 或 数据库宕机,影响数据读写。
- 磁盘剩余空间低于 10% ,可能导致系统无法正常运行。
健康检查脚本 /opt/keepalived/ha/ha_service_check.sh
示例:
#!/bin/bash
# 主备检测脚本
# 省略检测逻辑...
#if(数据库异常) exit 1
exit 0 # 0 代表检测通过,其他值代表失败
异常检测流程:
- 每 3 秒检测一次(
interval 3
)。 - 连续 3 次失败(
fall 3
),触发notify_fault
,执行/opt/keepalived/ha/ha_notify_fault.sh
。
3.7 故障处理(notify_fault)
当检测到故障(如 Redis/数据库 异常)并连续 3 次失败,Keepalived 触发 notify_fault
事件,执行 /opt/keepalived/ha/ha_notify_fault.sh
进行故障处理。
#!/bin/bash
# 故障通知脚本
echo "检测到异常...做切换" >> $HA_LOG_FILE
service stop keepalived
# 其他逻辑...
主机的 keepalived 停止则备机的 keepalived 会自动切换为新的主机,接管虚拟VIP。
3.8 主备切换流程
初始状态及切换逻辑
在该方案中,主机(Master)和备机(Backup)在初始化时,state 参数均设置为 BACKUP,这样:
- 第一次启动时,主机会自动晋升为 Master,执行
/opt/keepalived/ha/ha_notify_master.sh
。 - 主机宕机后,备机检测到主机失联,自动晋升为 Master,执行
/opt/keepalived/ha/ha_notify_master.sh
。
注意:角色切换不会修改
keepalived.conf
配置文件的state
参数值,避免配置被错误覆盖。
3.9 主备切换相关脚本
主机晋升(notify_master)
当节点晋升为 Master 时,Keepalived 触发 notify_master
,执行 /opt/keepalived/ha/ha_notify_master.sh
,示例如下:
#!/bin/bash
# 主机晋升脚本
echo "当前节点晋升为主机(Master)"
# 省略具体逻辑...
exit 0
切换为备机(notify_backup)
当节点降级为 Backup 时,Keepalived 触发 notify_backup
,执行 /opt/keepalived/ha/ha_notify_backup.sh
,示例如下:
#!/bin/bash
# 备机降级脚本
echo "当前节点降级为备机(Backup)"
# 省略具体逻辑...
exit 0
4. 测试 Keepalived 主备切换
4.1 启动 Keepalived
service start keepalived
4.2 验证 VIP 绑定情况
ip addr
如果发现 vip 存在则表示配置成功。
4.3 模拟主机故障,观察 VIP 漂移
# 停止 Master(在主机上执行)
service stop keepalived# 在 Backup 上检查 VIP 是否接管(在备机上执行)
ip addr
若 vip 已转移到 Backup 服务器,则主备切换成功!
5. Keepalived 进阶功能
5.1 结合 LVS 负载均衡
Keepalived 可用于管理 LVS(Linux Virtual Server) ,实现高可用负载均衡。
5.2 结合 Nginx 实现高可用
可结合 Keepalived + Nginx 方案,构建高可用的 Web 负载均衡架构。
6. 总结
✅ Keepalived 适用于哪些场景?
- 服务器高可用(防止单点故障)
- LVS 负载均衡管理
- Nginx / HAProxy 高可用方案
✅ 使用 Keepalived 的核心步骤
- 安装 Keepalived
- 配置 VRRP(设置 VIP、优先级)
- 测试主备切换(模拟 Master 故障,观察 VIP 迁移)
📢 结语
如果你正在构建一个高可用架构,Keepalived 绝对是一个简单易用、高效可靠的解决方案!
📌 你用过 Keepalived 吗?在评论区分享你的使用经验吧!
🌟 你的支持是我持续创作的动力,欢迎点赞、收藏、分享!