Keepalived 集群安装及运维指南

基于 VRRP 协议的高可用解决方案 | 版本 2.3.x | 双节点主备 + 多实例架构


一、什么是 Keepalived

1.1 概述

Keepalived 是一个基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 实现的高可用(HA)软件。它的核心使命是:通过在多台服务器之间共享一个虚拟 IP(VIP),当主节点故障时自动将 VIP 漂移到备用节点,从而保证服务的连续性。

Keepalived 最初是为 LVS(Linux Virtual Server)负载均衡器设计的高可用守护进程,但因其轻量、可靠、配置简单,现已被广泛用于各种需要 IP 高可用的场景。它通过 VRRP 协议实现 IP 故障转移,通过健康检查脚本实现对后端服务的存活检测。

1.2 核心功能

功能模块 说明
VRRP 协议实现 完整支持 VRRPv2 和 VRRPv3 协议(RFC 3768 / RFC 5798),实现多节点间的 Master/Backup 选举和 VIP 漂移
VIP 故障转移 主节点宕机时,备用节点自动接管虚拟 IP,切换时间通常 < 1 秒
健康检查 通过 TCP_CHECK / HTTP_GET / SSL_GET / MISC_CHECK 等多种方式检测后端服务存活状态,支持自定义脚本
LVS 集成 与 IPVS 框架深度集成,可动态管理 LVS 后端 Real Server 池,实现四层负载均衡 + 高可用
多实例支持 支持在同一台机器上运行多个 VRRP 实例,实现双主(Active-Active)模式
通知机制 支持在状态切换时执行自定义脚本(notify_master / notify_backup / notify_fault),实现联动处理
SMTP 告警 内置 SMTP 告警,状态变化时可自动发送邮件通知
SNMP 支持 内置 SNMP Agent,可通过 SNMP 协议监控 Keepalived 状态
IPv4/IPv6 双栈 VRRPv3 支持 IPv6,可在 IPv4 和 IPv6 网络中使用

1.3 适用场景

场景 说明
Nginx/HAProxy 高可用 最常见的场景 —— 两台 Nginx 反向代理通过 Keepalived 实现 VIP 漂移,避免单点故障
LVS 负载均衡高可用 Keepalived 原生集成 LVS,可以同时管理 Director 的 HA 和 Real Server 的健康状态
MySQL/MariaDB 高可用 为主从数据库的 VIP 提供自动故障转移,配合 MHA/MGR 实现数据库高可用
网关 / 路由器高可用 在 Linux 软路由场景中,通过 VRRP 协议实现默认网关的高可用
K8s MetalLB 替代 在裸金属 K8s 集群中,Keepalived 可与 MetalLB 配合或独立提供 LoadBalancer 类型的 VIP
Redis / RabbitMQ / Kafka VIP 为各类中间件集群提供统一的访问入口 VIP,简化客户端连接配置

1.4 与竞品对比

特性 Keepalived Heartbeat/Pacemaker Corosync+Pacemaker UCARP
协议基础 ✅ VRRP 自定义心跳 Totem 协议 VRRP(CARP)
VIP 漂移 ✅ 核心能力
配置复杂度 ✅ 低
资源占用 ✅ 极低(<50MB) 极低
LVS 集成 ✅ 原生集成 需手动 需手动
健康检查 ✅ 丰富内置 需脚本 需资源代理 需脚本
社区活跃度 ✅ 广泛使用 逐渐减少 企业级 小众
多主模式

1.5 为什么选择 Keepalived

  • 极轻量: 纯 C 语言编写,内存占用通常 < 50MB,CPU 开销可忽略不计
  • 零依赖: 不依赖共享存储、不依赖第三方协调服务(如 ZooKeeper/etcd),两节点即可工作
  • 毫秒级切换: 在优化的配置下,故障检测+VIP 漂移可在 1-3 秒内完成
  • 成熟稳定: 发展超过 20 年,被全球数百万生产环境验证
  • 配置简单: 一个 keepalived.conf 文件即可完成全部配置,学习成本极低

📌 Keepalived 的核心定位

Keepalived 解决的是 IP 层面的高可用,即 VIP 的故障转移。它不负责数据同步(如文件/数据库/缓存同步),数据层面的高可用需要配合其他方案(如 Rsync/DRBD/主从复制)实现。


二、基本原理与架构

2.1 VRRP 协议核心原理

VRRP(Virtual Router Redundancy Protocol) 是 IETF 标准协议(RFC 3768),核心思想是将多台物理路由器组成一个虚拟路由器,对外暴露一个虚拟 IP(VIP)虚拟 MAC 地址。虚拟路由器内部通过选举产生一台 Master,由 Master 实际处理发往 VIP 的流量。

核心概念表:

概念 说明
VRRP 实例(Instance) 一个 VRRP 组,由一组共享同一个 VRID 和 VIP 的物理节��组成
虚拟路由器 ID(VRID) 唯一标识一个 VRRP 实例,取值范围 1-255,同一局域网内不能重复
虚拟 IP(VIP) 对外暴露的服务 IP 地址,客户端通过 VIP 访问服务
虚拟 MAC 地址 格式 00-00-5E-00-01-{VRID}(VRRPv2),Master 响应该 MAC 的 ARP 请求
Priority(优先级) 取值范围 0-255,值越大越优先成为 Master,255 表示手动强制 Master
Advertisement_Interval Master 发送 VRRP 通告报文的时间间隔,默认 1 秒
Preempt(抢占模式) 高优先级节点恢复后是否立即夺回 Master 角色,默认开启
Gratuitous ARP Master 切换时发送免费 ARP,通知交换机/路由器更新 MAC 地址表

2.2 VRRP 状态机

每个 VRRP 实例中的节点处于以下三种状态之一:

🔵 MASTER 状态:

  • 持有 VIP 和虚拟 MAC 地址
  • 响应发往 VIP 的 ARP 请求
  • 定期(每 Advert_Int)向 224.0.0.18 组播 VRRP 通告
  • 执行健康检查脚本

🟡 BACKUP 状态:

  • 不持有 VIP
  • 持续监听 VRRP 组播通告
  • 执行健康检查脚本(为接管做准备)
  • 超过 Master_Down_Interval(3×Advert_Int + skew_time)无通告 → 发起选举

🔴 INIT 状态:

  • 启动时的过渡状态,等待事件触发进入 BACKUP

2.3 选举流程

  1. 所有节点以 BACKUP 状态启动,等待 Master 通告
  2. 超时未收到通告 → 节点将自己的 Priority 与收到的通告中的 Priority 比较
  3. 本机 Priority 最高 → 切换到 MASTER 状态,发送 Gratuitous ARP,开始发送 VRRP 通告
  4. 收到更高 Priority 节点的通告 → 退回到 BACKUP 状态
  5. 如果开启了 Preempt(抢占模式),高 Priority 节点恢复后会自动夺回 Master
  6. 健康检查脚本失败 → Priority 降低(track_script 减分),可能触发主备切换

2.4 健康检查机制

Keepalived 支持多种健康检查器,用于检测后端服务的存活状态:

检查类型 说明 适用场景
TCP_CHECK 尝试 TCP 连接指定 IP:Port,连接成功即认为健康 检测 TCP 服务端口存活
HTTP_GET 向 URL 发起 HTTP GET 请求,检查状态码和响应内容 检测 HTTP 应用层健康
SSL_GET 与 HTTP_GET 类似,但通过 SSL/TLS 连接 检测 HTTPS 服务健康
MISC_CHECK 执行外部脚本/命令,返回 0 视为健康 自定义复杂健康逻辑
SMTP_CHECK 连接 SMTP 服务器并发送 HELO 命令 检测邮件服务
DNS_CHECK 向 DNS 服务器查询指定域名 检测 DNS 服务

2.5 Keepalived 内部架构

┌─────────────────────────────────────────────────────────┐
│                   Keepalived Core                       │
│                (主进程 + 子进程 fork)                     │
└──────┬────────────────┬──────────────────┬──────────────┘
       │                │                  │
  ┌────▼─────┐    ┌─────▼──────┐   ┌──────▼──────┐
  │ VRRP     │    │  Health    │   │   System    │
  │ Stack    │    │  Checkers  │   │  Services   │
  ├──────────┤    ├────────────┤   ├─────────────┤
  │VRRPv2/v3 │    │TCP_CHECK   │   │IPVS Wrapper │
  │状态机    │    │HTTP_GET    │   │SMTP 告警    │
  │通告收发  │    │SSL_GET     │   │SNMP Agent   │
  │GARP发送  │    │MISC_CHECK  │   │Notify 脚本  │
  └────┬─────┘    └─────┬──────┘   └──────┬──────┘
       │                │                  │
       └────────────────┼──────────────────┘
                        │
       ┌────────────────▼──────────────────┐
       │        Linux Kernel               │
       │  Netlink / Raw Socket / IPVS      │
       │  IP管理 · ARP表 · 路由表 · Netfilter│
       └────────────────┬──────────────────┘
                        │
       ┌────────────────▼──────────────────┐
       │  物理网络接口 (eth0 / bond0)        │
       │  VRRP 组播 224.0.0.18 或单播通信    │
       └───────────────────────────────────┘

2.6 故障切换流程(Nginx + Keepalived 典型场景)

Master 节点 Nginx 进程崩溃后的完整切换时序:

时间 事件
T+0s Master 节点 Nginx 进程意外终止
T+2s 健康检查脚本 chk_nginx 检测失败(检测间隔 2s)
T+2s track_script 将 VRRP 实例 Priority 降低 30(如 100→70)
T+2s Backup 节点 Priority=90 > Master 节点 Priority=70
T+2s Backup 节点发起抢占,发送 Gratuitous ARP,切换为 MASTER
T+2s Backup 节点执行 notify_master 脚本(启动 Nginx、更新��由、发送告警等)
T+3s 原 Master 节点退回 BACKUP 状态,执行 notify_backup 脚本
T+3s 客户端流量自动切换到新 Master(VIP 已在 Backup 节点生效)

⚠️ 故障切换时间分析

总切换时间 = 健康检查间隔 + 通告超时检测时间(3×Advert_Int + skew_time)+ 抢占处理时间。优化后通常可控制在 1-3 秒。如需更快(毫秒级),需要使用 BFD(双向转发检测)等方案。


三、服务部署详细步骤

3.1 集群规划

节点 主机名 IP 地址 角色 VRRP Priority 配置
Node 1 ka-node01 192.168.1.11 MASTER 100 4C8G, CentOS 8 / Rocky 9
Node 2 ka-node02 192.168.1.12 BACKUP 90 4C8G, CentOS 8 / Rocky 9
VIP 192.168.1.100 虚拟 IP VRID=51, 网卡 eth0

3.2 环境准备(所有节点)

Step 1: 系统依赖安装
# CentOS / Rocky Linux / RHEL
yum install -y gcc make autoconf automake openssl-devel libnl3-devel \
  net-snmp-devel libnfnetlink-devel ipset-devel iptables-devel \
  pkgconfig curl wget vim net-tools

# Ubuntu / Debian
apt-get install -y build-essential autoconf automake libssl-dev \
  libnl-3-dev libnl-genl-3-dev libsnmp-dev libnfnetlink-dev \
  pkg-config curl wget vim net-tools
Step 2: 关闭 SELinux(或正确配置策略)
# 临时关闭
setenforce 0

# 永久关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 或者保持 SELinux 开启并配置策略(推荐):
# setsebool -P keepalived_use_nfs 1
Step 3: 配置防火墙规则
# VRRP 使用协议号 112(非端口),需要放行 VRRP 协议
firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept'
firewall-cmd --reload

# 或者使用 iptables
iptables -A INPUT -p vrrp -j ACCEPT
iptables-save > /etc/sysconfig/iptables
Step 4: 内核参数优化
cat >> /etc/sysctl.conf << 'EOF'
# -------------------- Keepalived 网络优化 --------------------
# 允许绑定非本地 IP 地址(VIP 绑定需要)
net.ipv4.ip_nonlocal_bind = 1

# 开启 IP 转发(作为网关/LVS 时需要)
net.ipv4.ip_forward = 1

# ARP 相关优化
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_filter = 0

# 接收所有组播包(VRRP 组播通信需要)
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

# TCP 优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
EOF

sysctl -p

3.3 安装方式一:YUM/DNF 安装(推荐生产环境)

# CentOS 7/8 / Rocky Linux 8/9
yum install -y keepalived

# 或者从 EPEL 仓库安装最新版
yum install -y epel-release
yum install -y keepalived

# 验证安装
keepalived --version
# Keepalived v2.2.8 (02/26,2024)

# 备份默认配置
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

3.4 安装方式二:源码编译安装

# 下载源码
cd /usr/local/src
wget https://keepalived.org/software/keepalived-2.3.1.tar.gz
tar -xzf keepalived-2.3.1.tar.gz
cd keepalived-2.3.1

# 配置编译选项
./configure --prefix=/usr/local/keepalived \
  --sysconfdir=/etc \
  --with-init=systemd \
  --enable-snmp \
  --enable-snmp-rfc \
  --enable-dbus \
  --enable-json

# 编译安装
make -j$(nproc)
make install

# 创建软链接
ln -sf /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

# 创建 systemd 服务文件
cat > /etc/systemd/system/keepalived.service << 'EOF'
[Unit]
Description=Keepalived High Availability Monitor
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
ExecStart=/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=10s
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload

# 验证安装
keepalived --version

3.5 安装方式三:Docker 容器化部署

# 拉取镜像(使用 osixia/keepalived 或自行构建)
docker pull osixia/keepalived:2.3.0

# 创建配置目录
mkdir -p /opt/keepalived/conf

# 编写 keepalived.conf(内容见 3.6 节)

# 启动容器 - Node 1 (MASTER)
docker run -d --name keepalived \
  --restart=always \
  --net=host \
  --cap-add=NET_ADMIN \
  --cap-add=NET_BROADCAST \
  --cap-add=NET_RAW \
  -v /opt/keepalived/conf/keepalived.conf:/usr/local/etc/keepalived/keepalived.conf:ro \
  osixia/keepalived:2.3.0

💡 安装方式选择建议

  • 生产环境: 推荐 YUM/DNF 安装,版本稳定且与系统集成好
  • 需要最新功能: 源码编译安装,可自定义模块和编译选项
  • 容器化场景: Docker 部署,但必须使用 --net=host 模式
  • K8s 场景: 建议使用 MetalLB(Layer2 模式底层就是 VRRP),而非直接容器化 Keepalived

3.6 主配置文件 keepalived.conf 详解(Node 1 — MASTER)

###############################################################################
# Keepalived 主配置文件 — Node 1 (MASTER)
# 路径: /etc/keepalived/keepalived.conf
###############################################################################

! Configuration File for keepalived

# ========================= 全局定义 =========================
global_defs {
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

miaocbin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值