Keepalived 是一个基于 VRRP(Virtual Router Redundancy Protocol)协议 实现的高可用性解决方案,主要用于构建无单点故障的服务集群。其核心目标是确保服务的持续可用性,当主节点故障时自动切换到备用节点,对外提供透明的故障转移。


一、核心原理

  1. VRRP 协议基础

    • 多个节点(至少1主1备)组成一个虚拟路由器组,共享一个虚拟IP(VIP)
    • 主节点(Master)持有VIP并对外提供服务,备用节点(Backup)处于待命状态。
    • 节点间通过组播心跳报文(默认组播地址 224.0.0.18)通信。
  2. 选举与优先级

    • 节点通过优先级(priority,范围1-254)竞选Master角色,优先级高者胜出。
    • 若主节点停止发送心跳(默认间隔1秒),备用节点检测到超时(默认3秒)后触发选举,新Master接管VIP。
  3. 健康检查(Health Checking)

    • 关键特性:Keepalived 可自定义脚本监控服务状态(如Nginx/MySQL进程)。
    • 若主节点的服务异常,Keepalived 主动降低自身优先级,触发主备切换(无需等待心跳超时)。

二、核心应用场景

1. 负载均衡器高可用(最常见)

  • 场景:为 Nginx、HAProxy 等负载均衡器提供故障转移。
  • 架构
  • 主备节点均部署负载均衡器 + Keepalived。
  • VIP 指向活跃节点,客户端始终访问VIP。
  • 效果:主节点故障时,VIP秒级切换至备用节点,服务无感知。

2. 数据库主从高可用

  • 场景:MySQL、Redis 主从架构的VIP漂移。
  • 流程
  • Keepalived 监控主库状态。
  • 主库故障时,VIP切换到从库(需配合脚本提升从库为主)。

3. LVS(Linux Virtual Server)集成

  • Keepalived 原生支持LVS,可管理LVS的负载均衡规则及节点健康检查,构建高可用四层负载均衡集群。

4. 轻量级服务故障转移

  • 适用于任何需VIP的高可用服务,如:
  • FTP服务器
  • Web应用服务器
  • 自定义TCP/UDP服务

三、典型架构示例(Nginx高可用)

# 拓扑结构:
#   VIP: 192.168.1.100
#   Master: 192.168.1.10 (priority=100)
#   Backup: 192.168.1.20 (priority=90)
# Keepalived 主节点配置片段 (keepalived.conf)
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51   # 集群ID,主备必须一致
    priority 100          # 优先级
    advert_int 1          # 心跳间隔(秒)
    authentication {
        auth_type PASS
        auth_pass 1111     # 节点间认证密码
    }
    virtual_ipaddress {
        192.168.1.100/24   # 虚拟IP
    }
    track_script {
        chk_nginx          # 关联Nginx健康检查脚本
    }
}

# 定义Nginx监控脚本
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2             # 检查间隔
    weight -20             # 失败时优先级降低20
}

四、优势与局限

  • ✅ 优势

    • 轻量级,配置简单。
    • 毫秒级故障切换(依赖心跳超时时间)。
    • 支持自定义健康检查脚本。
  • ⚠️ 局限

    • 脑裂问题(需配置多播或单播防裂)。
    • 不适用于跨地域高可用(延迟敏感)。
    • 无状态服务友好,有状态服务需额外同步机制(如DRBD)。

五、关键运维命令

# 查看Keepalived状态及VIP归属
ip addr show eth0 | grep "192.168.1.100"

# 手动切换主备(在Master节点执行)
systemctl stop keepalived    # 强制触发切换

# 日志排查
tail -f /var/log/messages | grep Keepalived
💡 最佳实践:结合监控系统(如Prometheus)告警+日志分析,避免静默故障。对关键服务建议部署至少3节点(如1主2备),防止单点故障。

如果需要具体配置案例或故障排查技巧,欢迎进一步提问!