Keepalived:高可用架构的核心保障工具
在分布式系统中,单点故障是威胁服务稳定性的 “隐形杀手”。Keepalived 作为一款基于 VRRP 协议的高可用解决方案,通过自动检测服务器状态、实现故障切换,为核心服务提供了可靠的冗余保障。本文将从原理、结构到实战配置,全面解析 Keepalived 的工作机制与应用价值。
Keepalived 核心功能:自动保障服务连续性
Keepalived 的核心目标是消除单点故障,确保服务在部分节点失效时仍能正常运行。其核心能力包括:
- 状态侦测:实时监控服务器或服务的健康状态(如 IP 可达性、端口可用性、应用进程存活等);
- 故障切换:当主节点故障时,自动将服务切换到备用节点,通过虚拟 IP(VIP)保证客户端无感知;
- 自动恢复:当故障节点修复后,自动将其重新纳入集群,恢复主备关系。
无论是 Web 服务器、负载均衡器还是数据库,Keepalived 都能通过灵活的配置适配不同场景,是构建高可用架构的关键工具。
实现的基本思路
Keepalived是基于VRRP协议的实现,主要用在IP层、TCP层和应用层。
- IP层:Keepalived会定期向服务器群中的服务器发送一个ICMP数据包(Ping),如果发现IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除。
- TCP层:类似IP层,只不过这里是检测TCP服务的端口
- 应用层:Keepalived将根据用户的设定来检查服务程序的运行是否正常
实现原理:基于 VRRP 协议的冗余机制
Keepalived 的高可用能力源于对 VRRP(虚拟路由冗余协议) 的实现。VRRP 解决了静态网关单点故障问题,通过将多台物理路由器虚拟为一个 “逻辑路由器”,确保网络通信的连续性。
VRRP 核心概念
- VRRP 路由器:运行 VRRP 协议的物理服务器(或路由器),是构成虚拟路由的基本单元。
- 虚拟路由器:由多台 VRRP 路由器组成的逻辑集合,对外表现为一个统一的 “路由器”,拥有唯一标识 VRID(0-255) 和 虚拟 IP(VIP)。客户端通过 VIP 访问服务,无需关心后端具体节点。
- Master 与 Backup:
- Master:虚拟路由中承担主要工作的节点,负责处理客户端请求,并定期发送心跳报文;
- Backup:备用节点,监听 Master 的心跳,当 Master 故障时自动接管服务。
VRRP 工作机制
VRRP 通过 “选举 - 心跳 - 切换” 三个阶段实现高可用:
- 选举阶段:
虚拟路由中的节点启动时,根据配置的优先级(0-255,数值越高优先级越高)竞选 Master。优先级最高的节点成为 Master,其余为 Backup。 - 心跳阶段:
Master 每隔固定间隔(默认 1 秒)通过多播报文发送 VRRP 通告,告知 Backup 自身状态。Backup 持续监听该通告,确认 Master 存活。 - 切换阶段:
若 Backup 在连续 3 个心跳间隔内未收到通告(或收到优先级为 0 的通告,代表 Master 主动放弃),则判定 Master 故障,触发重新选举:- 优先级最高的 Backup 成为新 Master,接管 VIP 和服务;
- 若配置为抢占式(默认),当更高优先级的节点恢复时,会重新抢占 Master 角色;
- 若配置为非抢占式,则 Master 一旦确定,除非故障否则不会切换,适合对稳定性要求极高的场景。
VRRP 负载分担
为避免资源闲置,VRRP 支持负载分担模式:
- 同一台物理服务器可加入多个虚拟路由(备份组),在不同组中扮演不同角色(如在组 1 为 Master,组 2 为 Backup);
- 不同虚拟路由绑定不同 VIP,将流量分散到多台服务器,实现负载均衡。
Keepalived 架构:分层设计与核心组件
Keepalived 采用 “内核空间 + 用户空间” 的分层架构,各组件协同实现高可用与负载均衡功能:
| 层级 | 组件 | 功能描述 |
|---|---|---|
| 内核空间 | IPVS | 实现负载均衡,将请求按规则分发到后端服务器,支持轮询、加权轮询等调度算法。 |
| NetLink | 提供内核与用户空间的通信接口,用于配置路由、VIP 等网络参数。 | |
| 用户空间 | WatchDog | 监控 Checkers 和 VRRP Stack 进程,若进程崩溃则自动重启,保证核心功能可用。 |
| Checkers | 核心组件,负责健康检查(支持 IP、TCP、应用层自定义检查),判定服务器状态。 | |
| VRRP Stack | 实现 VRRP 协议,管理 Master/Backup 角色切换和 VIP 漂移。 | |
| IPVS wrapper | 将用户配置的负载均衡规则转换为内核 IPVS 可执行的指令。 | |
| Netlink Reflector | 配置 VIP 等网络参数,确保内核正确处理虚拟路由的流量。 | |
| 控制面板 | 解析配置文件,为各组件提供参数(按需解析,提高效率)。 |
实战配置:以 Nginx 高可用为例
以下通过配置示例,演示如何用 Keepalived 保障 Nginx 服务的高可用:
环境准备
- 两台服务器:Master(192.168.1.10)、Backup(192.168.1.11);
- 虚拟 IP(VIP):192.168.1.100(客户端通过此 IP 访问 Nginx);
- 目标:当 Master 的 Nginx 故障时,自动切换到 Backup。
健康检查脚本
创建检测 Nginx 状态的脚本(/usr/local/keepalived/check_nginx.sh),若 Nginx 故障则尝试重启,失败则触发 Keepalived 切换:
1 | !/bin/bash |
赋予执行权限:chmod +x /usr/local/keepalived/check_nginx.sh
Keepalived 主配置(Master 节点)
配置文件路径:/etc/keepalived/keepalived.conf
1 | global_defs { |
Backup 节点配置
与 Master 类似,仅需修改 state BACKUP 和 priority 90(优先级低于 Master),其余参数(VRID、认证、VIP)保持一致。
启动与验证
- 启动 Keepalived:
systemctl start keepalived - 验证 VIP:
ip addr show eth0查看 VIP 是否在 Master 节点; - 故障测试:停止 Master 的 Nginx(
systemctl stop nginx),观察 VIP 是否漂移到 Backup 节点。