Keepalived 高可用全解析:从 VRRP 原理到生产环境 Nginx 主备切换实践

Keepalived 高可用全解析

1. HA 集群的适用性

能解决的问题

  • 为未自带故障转移(Failover)或负载均衡(LB)的服务提供高可用,如 RabbitMQ、Galera、Nginx 等。
  • 自动剔除故障节点,无需人工干预。

不能解决的问题

  • 应用自身 bug 导致的 crash(集群内所有节点都存在相同 bug)。
  • 端到端的网络故障(集群正常但网络不可达,客户端仍无法访问)。
  • 对于 DNS、LDAP 等自带多节点冗余的服务,放入 HA 集群收益不大。

2. Keepalived 概述

  • 定位:用 C 语言编写的路由软件,为 Linux 提供负载均衡(LB)和高可用(HA)。
  • 最初:专为 LVS 设计,检测后端服务节点状态(基于 TCP/IP 第 3/4/7 层),故障时自动剔除。
  • 后来:引入 VRRP 协议,实现 HA 集群功能(主备切换、VIP 漂移)。

3. VRRP 核心原理

3.1 背景

  • 单网关(默认网关)故障导致整个子网断网。
  • VRRP 通过将多台路由器虚拟为一台"虚拟路由器",使用虚拟 IP(VIP)和虚拟 MAC,实现网关冗余。

3.2 基本概念

概念 说明
VRRP 路由器 运行 VRRP 的物理设备(接口)
VRID 虚拟路由器标识符(1~255),同一组内相同
虚拟路由器 逻辑设备,拥有 VIP 和虚拟 MAC(格式 00-00-5E-00-01-XX,XX 为 VRID)
Master 路由器 承担转发任务,响应 VIP 的 ARP,周期性发送 VRRP 通告
Backup 路由器 监听 Master 通告,准备接管
Priority 优先级(0~255),越大越优;255 为 IP 地址拥有者(自动)

3.3 VRRP 报文

  • 只有一种 Advertisement 报文,组播地址 224.0.0.18,仅在同一广播域内传递。
  • 关键字段:Ver(版本)、VRID、Priority、Auth Type(0/1/2)、Adver Int(默认 1s)、IP Address 列表。

3.4 定时器

  • ADVER_INTERVAL:Master 发送通告的周期(默认 1s)。
  • MASTER_DOWN :Backup 等待超时后切换为 Master。
    计算公式:MASTER_DOWN = (3 × ADVER_INTERVAL) + Skew_time
    Skew_time = (256 - Priority) / 256

3.5 状态行为

Master 状态 Backup 状态
定期发送 VRRP 通告 接收并检查 Master 通告
响应 VIP 的 ARP 请求 不响应 VIP 的 ARP
转发目的 MAC 为虚拟 MAC 的 IP 报文 丢弃目的 MAC 为虚拟 MAC 的 IP 报文
允许 ping 通 VIP 丢弃目的 IP 为 VIP 的 IP 报文
收到更高优先级通告时可能降级为 Backup 收到相同或更高优先级通告时重置 MASTER_DOWN 定时器

3.6 主备选举过程

  • 优先级不相等:高优先级先切换至 Master,低优先级收到高优先级通告后保持 Backup。若低优先级先启动成为 Master,高优先级后启动会抢回 Master。
  • 优先级相等:同时切换至 Master,比较接口 IP 地址,大者胜出。
  • IP 地址拥有者(接口 IP 等于 VIP):优先级自动为 255,无条件立即成为 Master(无需等待定时器)。
  • Master 主动退出:发送优先级为 0 的通告,Backup 快速切换(节省 Skew_time)。

4. 脑裂(Split-Brain)

4.1 定义

主从节点因心跳中断,各自认为对方故障,同时抢占 VIP,导致状态混乱。

4.2 常见原因

  • 网络问题(心跳线路故障、断网、延迟)
  • 防火墙屏蔽 VRRP 协议(UDP 112 端口)
  • 节点资源耗尽(CPU/内存/负载过高)
  • 配置不一致(statepriorityauthentication 等)

4.3 危害

  • 双节点同时持有 VIP,客户端请求混乱。
  • 数据库/存储可能产生双写冲突,数据不一致。
  • 集群失去高可用意义。

4.4 预防与应对

  1. 多重心跳线路 :配置多个网卡(track_interface)或独立心跳网络。
  2. 启用认证auth_type PASS + auth_pass(长度≤8 位)。
  3. 防火墙放行firewall-cmd --add-protocol=vrrp(或开放 UDP 112)。
  4. 第三方隔离(fence) :通过 notify_master 脚本检测对方存活,若脑裂则强制 kill/reboot 对方。
  5. 业务层设计:数据库主从+读写分离,分布式锁控制资源。
  6. 监控告警:Zabbix/Prometheus 监控 VIP 状态,发现双主立即告警。

5. 实践配置(Nginx HA 示例)

5.1 环境拓扑

主机名 IP 角色
client1 10.1.8.21 客户端
web1 10.1.8.11 Nginx + Keepalived(主)
web2 10.1.8.12 Nginx + Keepalived(备)
VIP 10.1.8.100 浮动虚拟 IP

5.2 基础部署

  • 设置主机名、IP、网关(略)。
  • 安装 Nginx,创建测试首页(显示 hostname)。
  • 客户端验证各后端正常访问。

5.3 Keepalived 配置

web2(备)

keepalived

复制代码
global_defs {
    router_id web2
}
vrrp_instance nginx {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1aogao@123   # 密码仅取前8位
    }
    virtual_ipaddress {
        10.1.8.100/24
    }
}

web1(主)

  • 相同配置,但 state MASTERpriority 110router_id web1

5.4 高可用验证

  • 启动 Keepalived 后 VIP 在 web1 上。
  • 访问 VIP 返回 web1 页面。
  • 停止 web1 的 Keepalived,VIP 漂移至 web2,访问返回 web2 页面。
  • 重新启动 web1,VIP 抢占回 web1(默认抢占模式)。

6. 配置文件结构(/etc/keepalived/keepalived.conf)

分三大部分:

6.1 全局配置(global_defs)

  • notification_email / notification_email_from / smtp_server:邮件告警。
  • router_id:本机标识(必须唯一)。
  • vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 等高级选项。

6.2 VRRP 实例配置(vrrp_instance)

  • state:MASTER/BACKUP(仅初始状态,实际以 priority 为准)。
  • interface:VIP 绑定的网卡。
  • virtual_router_id:同一集群内相同。
  • priority:越高越优先。
  • advert_int:通告间隔(秒)。
  • authentication:认证方式及密码。
  • virtual_ipaddress:可列出多个 VIP。
  • track_interface:监控网卡状态。
  • mcast_src_ip关键:多网卡环境下指定心跳报文的源 IP,防止错发导致脑裂。

6.3 LVS 配置(virtual_server)

  • 用于 LVS 负载均衡,定义后端 Real Server 的 IP、端口、调度算法(lb_algo)、转发模式(lb_kind)等,与 HA 功能解耦。

7. 日志与心跳

7.1 日志独立

  • 修改 /etc/sysconfig/keepalivedKEEPALIVED_OPTIONS="-D -d -S 0"-d 为 debug,生产慎用)。
  • 配置 rsyslog:local0.* /var/log/keepalived.log,重启 rsyslog 和 keepalived 后日志单独输出。

7.2 心跳配置

  • mcast_src_ip 指定 VRRP 通告报文的源 IP,必须与 interface 网卡 IP 一致。
  • 多网卡环境下,若不指定,Keepalived 可能从非预期网卡发送心跳,导致对端收不到,引发脑裂。

8. 生产实践:不抢占模式(Nopreempt)

场景 :避免主节点恢复后频繁切换,维持稳定性。

配置要点

  • 所有节点 state 均设为 BACKUP
  • vrrp_instance 中添加 nopreempt(仅 BACKUP 状态有效)。
  • 通过 priority 区分主备(高者优先成为 Master)。
  • 当高优先级节点故障恢复后,不会自动抢占,仅当当前 Master 故障时才会重新选举。

示例(web1 和 web2 均配置):

keepalived

复制代码
vrrp_instance nginx {
    state BACKUP
    nopreempt
    priority 110   # web1 高,web2 低
    ...
}

9. 总结

  • 核心:Keepalived 基于 VRRP,通过 VIP 漂移实现主备切换,解决单点故障。
  • 关键机制:优先级选举、通告定时器、状态机、脑裂防御。
  • 生产建议
    • 使用不抢占模式 + 多心跳线路 + VRRP 认证。
    • 配合健康检查脚本(vrrp_script)监测后端服务,实现服务级高可用。
    • 日志独立、监控告警必不可少。
  • 适用场景:常与 LVS、Nginx、HAProxy 等结合,为 Web、数据库、消息队列等提供可靠的高可用架构。
相关推荐
.柒宇.1 小时前
运维常见面试题_04_Nginx与DNS服务
运维·nginx·面试·dns
basketball6162 小时前
软考中级网络工程师 第6章 网络安全 备考总结
大数据·网络·web安全·网络工程师·软考
NGINX开源社区2 小时前
NGINX Ingress Controller 5.5:安全性与性能提升,迁移更轻松
java·服务器·nginx
云老大-阿里云国际站代理商3 小时前
腾讯云国际站代理商:CVM 跨地域网络抖动排查,深度分析 TCP 重传与 MTU 问题
网络·tcp/ip·腾讯云
weixin_307779133 小时前
PHP 大文件上传:内存占用、超时与最佳实践
linux·服务器·开发语言·nginx·php
闲云野鹤在人间3 小时前
项目实战:LNMP-电商平台-ECshop
linux·运维·nginx·apache·lvs
砚凝霜4 小时前
软考网络工程师|第 9 章 网络诊断命令 + 故障工具 + 故障排查完整笔记
网络·笔记
一目Leizi4 小时前
Wireshark SSH 远程抓包配置指南(以 UniFi Dream Router 为例)
智能路由器
数据知道4 小时前
XXE 漏洞深度实战:XML 外部实体攻击与 OOB 带外
xml·网络·安全·网络安全