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 切换:

#!/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

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 节点。