0%

keepalived

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
NGINX_BIN=/usr/sbin/nginx
PORT=80

# 检查 80 端口是否开放
if ! netstat -tlnp | grep -q ":$PORT "; then
# 尝试重启 Nginx
$NGINX_BIN -s stop >/dev/null 2>&1
$NGINX_BIN >/dev/null 2>&1
sleep 3
# 若重启失败,停止 Keepalived(触发切换)
if ! netstat -tlnp | grep -q ":$PORT "; then
pkill keepalived
fi
fi

赋予执行权限:chmod +x /usr/local/keepalived/check_nginx.sh

Keepalived 主配置(Master 节点)

配置文件路径:/etc/keepalived/keepalived.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
global_defs {
router_id NGINX_MASTER # 节点唯一标识
}

# 定义健康检查脚本
vrrp_script check_nginx {
script "/usr/local/keepalived/check_nginx.sh" # 脚本路径
interval 2 # 检查间隔(秒)
weight -20 # 脚本失败时,优先级降低 20(触发切换)
}

# VRRP 实例配置
vrrp_instance VI_1 {
state MASTER # 初始状态(MASTER/BACKUP)
interface eth0 # 绑定的网卡
virtual_router_id 51 # VRID(主备节点需一致)
priority 100 # 优先级(Master 高于 Backup)
advert_int 1 # 心跳间隔(秒)

# 认证配置(主备需一致)
authentication {
auth_type PASS
auth_pass 123456
}

# 虚拟 IP
virtual_ipaddress {
192.168.1.100/24 dev eth0 # VIP 及网卡
}

# 关联健康检查脚本
track_script {
check_nginx
}
}

Backup 节点配置

与 Master 类似,仅需修改 state BACKUPpriority 90(优先级低于 Master),其余参数(VRID、认证、VIP)保持一致。

启动与验证

  • 启动 Keepalived:systemctl start keepalived
  • 验证 VIP:ip addr show eth0 查看 VIP 是否在 Master 节点;
  • 故障测试:停止 Master 的 Nginx(systemctl stop nginx),观察 VIP 是否漂移到 Backup 节点。

欢迎关注我的其它发布渠道