Skip to content

第 5 章 Keepalived 与高可用 IP

5.1 VRRP 协议原理

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种容错协议,用于在多台路由器/服务器之间提供一个虚拟 IP 地址(VIP)。

VRRP 基本概念

┌─────────────────────────────────────┐
│          Virtual Router 51          │
│           VIP: 10.0.0.100           │
└──────────────────┬──────────────────┘

      ┌────────────┼────────────┐
      │            │            │
┌─────▼─────┐ ┌────▼─────┐ ┌────▼─────┐
│  Master   │ │ Backup   │ │ Backup   │
│ Priority  │ │ Priority │ │ Priority │
│   100     │ │   90     │ │   80     │
└───────────┘ └──────────┘ └──────────┘
概念说明
VRID虚拟路由标识,同一广播域内唯一
VIP虚拟 IP,客户端访问的入口
Master当前持有 VIP 的节点
Backup备份节点,Master 故障时接管 VIP
Priority优先级,数值大的优先成为 Master
Advertisement心跳广播,Master 定期发送

工作流程

  1. 集群启动后,Priority 最高的节点成为 Master,持有 VIP
  2. Master 定期发送 VRRP 广播(默认 1 秒一次)
  3. Backup 节点监听广播,如果超时未收到,则认为 Master 故障
  4. Priority 最高的 Backup 升级为 Master,接管 VIP
  5. 原 Master 恢复后,根据配置决定是否抢回 VIP

5.2 Keepalived 核心组件

Keepalived 是一个基于 VRRP 的高可用解决方案,主要包含两个进程:

进程说明
keepalived 主进程读取配置,管理 VRRP 和健康检查
VRRP 子进程处理 VRRP 协议
healthchecker 子进程执行健康检查脚本

5.3 Master/Backup 选举机制

初始选举

  • 所有节点同时启动时,Priority 最高的节点成为 Master
  • 如果 Priority 相同,IP 地址大的节点成为 Master

抢占机制

  • preempt 默认开启
  • 当原 Master 恢复且 Priority 更高时,会重新抢回 VIP
  • 生产环境中通常保持默认,确保高优先级节点优先服务

状态切换

Keepalived 在状态切换时可以执行脚本:

  • notify_master:变为 Master 时执行
  • notify_backup:变为 Backup 时执行
  • notify_fault:变为 Fault 时执行

5.4 健康检查脚本设计

Keepalived 可以通过 vrrp_script 执行健康检查,根据检查结果调整节点优先级。

示例:检测 NFS-Ganesha 是否运行

conf
vrrp_script check_ganesha {
    script "/usr/bin/systemctl is-active nfs-ganesha"
    interval 2
    weight -50
    fall 2
    rise 2
}

参数说明

参数说明
script执行的检查命令或脚本
interval检查间隔(秒)
weight检查失败时优先级调整值
fall连续失败几次才判定为失败
rise连续成功几次才判定为成功

脚本返回码

  • 0:检查成功
  • 0:检查失败

当检查失败时,Priority 会减去 weight 的值,可能导致 VIP 漂移。

5.5 VIP 漂移与客户端无感知切换

VIP 漂移过程

阶段 1:正常
Client ──► VIP(10.0.0.100) ──► Node1(Master)

阶段 2:Node1 Ganesha 故障
Client ──► VIP(10.0.0.100) ──► Node2(新 Master)

客户端影响

  • TCP 连接会短暂中断
  • 客户端通常会自动重连(NFS hard 挂载)
  • 对于短暂 IO 操作,影响在秒级

减少切换影响的建议

  1. 使用 hard 挂载,避免 soft 挂载导致的 IO 错误
  2. 设置合理的 timeoretrans
  3. 确保 Keepalived 检查间隔足够短
  4. 应用程序具备重试机制

5.6 本章小结

  • VRRP 提供虚拟 IP,实现服务入口高可用
  • Keepalived 是 VRRP 的 Linux 实现
  • Master/Backup 通过 Priority 选举
  • 健康检查脚本可以在服务异常时触发 VIP 漂移
  • VIP 漂移期间客户端会有短暂中断,但可自动恢复

练习题

  1. VRRP 中的 VRID、VIP、Priority 分别是什么意思?
  2. Keepalived 的健康检查脚本返回什么值表示成功?
  3. 如果 Master 节点恢复后希望不抢回 VIP,应该如何配置?
  4. 为什么生产环境 NFS 挂载推荐 hard 而不是 soft