整个国庆节期间,人很不舒服,心悸失眠,这两天又重感冒嗓子哑。 大概是压抑太久了。既然身体不听话,那就把注意力放回技术------写点让我安心的东西。
📖 中间件系列导航 1️⃣ Nginx 高性能 Web 服务 2️⃣ Tomcat 企业级 Java 容器 3️⃣ Redis 高可用集群 4️⃣ RabbitMQ 消息中间件 5️⃣ ✅ Keepalived 高可用实战(本文) 6️⃣ 综合案例:Nginx + Redis + RabbitMQ + Keepalived 高可用架构
在运维岗位上,最怕听到的一句话就是:
"主机挂了,业务全停。"
无论是 Web 服务、数据库,还是 Redis 缓存,只要单点出问题,就意味着整个系统瘫痪。 Keepalived 就是那个"让 IP 不死"的神器。
它可以让主机宕机也不影响访问, 让你的服务看起来,像是永远在线的。
一、原理速通:VIP 漂移的魔法
Keepalived 依赖 VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议 实现高可用。 核心机制:
- 主节点(Master)绑定虚拟 IP(VIP),并周期性发送心跳包。
- 备节点(Backup)监听主节点的心跳信号。
- 当主节点停止心跳时,备节点自动接管 VIP。
- 客户端始终访问 VIP,不会察觉切换。
换句话说:
主机可以宕,但 IP 永远活着。
二、实验环境规划
角色 | 主机名 | IP | 系统 |
---|---|---|---|
主节点 | web01 | 192.168.1.29 | Ubuntu 24.04 |
备节点 | web02 | 192.168.1.30 | Ubuntu 24.04 |
虚拟 IP | vip | 192.168.1.100 | --- |
环境说明:
- 两台虚拟机都运行在 Proxmox 上。
- 桥接网卡:
vmbr0
(与物理网 enp1s0 绑定)。 - 两台虚拟机能互相 ping 通(同网段 192.168.1.x)。
- 本文默认以 root 用户执行命令
三、安装 Keepalived
在两台机器上执行:
bash
apt update apt install -y keepalived
验证安装:
bash
keepalived --version


四、主备配置
🖥 主节点 web01(192.168.1.29)
编辑 /etc/keepalived/keepalived.conf
:
bash
sudo vim /etc/keepalived/keepalived.conf
内容如下:
conf
vrrp_instance VI_1 {
state MASTER
interface ens18
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100/24
}
}

🖥 备节点 web02(192.168.1.30)
bash
sudo vim /etc/keepalived/keepalived.conf
内容如下:
conf
vrrp_instance VI_1 {
state BACKUP
interface ens18
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100/24
}
}

⚙️ 参数说明:
interface
:真实网卡名(用ip a
查看,Proxmox 一般是ens18
)priority
:优先级,数值高者为主virtual_router_id
:主备一致即可advert_int
:心跳间隔,秒为单位
五、启动与验证
启动 Keepalived 服务:
bash
sudo systemctl enable --now keepalived
查看运行状态:
bash
sudo systemctl status keepalived

在 web01 执行:
bash
ip addr | grep 192.168.1.100

可以看到 VIP 已经绑定成功。
在 web02 上执行同样命令,此时不会看到 VIP。
六、模拟主机故障:VIP 自动漂移
1️⃣ 停止主节点 Keepalived:
bash
sudo systemctl stop keepalived

2️⃣ 几秒后,在 web02 上查看:
bash
ip addr | grep 192.168.1.100

此时 VIP 自动漂移到了 web02。
3️⃣ 重新启动主节点:
bash
sudo systemctl start keepalived
VIP 自动回到 web01。
👉 验证成功! 即使主机挂掉,VIP 也能"自动逃生"。
七、健康检查:让漂移更聪明
仅检测主机心跳是不够的。 如果主机在线但业务(比如 Nginx)挂了,VIP 仍然不会切换, 这就属于"假活着"。
我们需要让 Keepalived 更聪明一点------ 它不仅要会听心跳,还得能判断业务是不是在正常跑。
🧩 前置条件
在继续之前,请确保你已经安装并启动了 Nginx:
bash
# apt install -y nginx
# systemctl enable --now nginx
如果暂时不想装 Nginx,可以跳过这一节,后续再补上脚本。
🧰 步骤一:创建检测脚本
在两台机器上都创建一个检测脚本:
bash
# vim /etc/keepalived/check_nginx.sh
内容如下:
bash
#!/bin/bash
# 检查 Nginx 是否运行,如果没运行则停止 Keepalived
if ! pidof nginx >/dev/null; then
systemctl stop keepalived
fi
赋予执行权限:
bash
# chmod +x /etc/keepalived/check_nginx.sh
⚙️ 步骤二:修改 Keepalived 配置
这一步不是"重写配置",而是在现有文件里添加健康检查段落。《这里的文件你可以整段复制过去覆盖,但是有时间还是要好好体会这个配置文件的差异》
Keepalived 的配置逻辑是:
先定义脚本(vrrp_script),再在实例中引用它(track_script)。
主节点(web01,192.168.1.29)
conf
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens18
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_nginx
}
}
备节点(web02,192.168.1.30)
conf
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens18
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_nginx
}
}
🔁 步骤三:重启并验证
两台服务器都执行:
bash
# systemctl restart keepalived
# systemctl status keepalived
此时 VIP(192.168.1.100)会绑定在 web01 上。
接着模拟 Nginx 故障:
bash
# systemctl stop nginx
几秒后,你会发现:
- web01 自动释放 VIP;
- web02 自动接管 VIP。

再启动 Nginx:
bash
# systemctl start nginx
VIP 会自动漂回主节点。
🧠 原理小结
Keepalived 每隔 2 秒执行一次脚本:
- 如果检测到
pidof nginx
失败,脚本触发systemctl stop keepalived
; - Keepalived 停止后,VIP 自动释放;
- 备机检测到主机失联,自动接管 VIP。
这样,系统就能在主机在线但业务宕机的情况下实现自动切换。
八、查看漂移日志
查看实时日志:
bash
sudo journalctl -u keepalived -f
漂移时会输出:
scss
VRRP_Instance(VI_1) Transition to BACKUP STATE
VRRP_Instance(VI_1) Entering MASTER STATE

这就是 VIP 自动切换的过程。
⚠️ 常见高频错误点总结
Keepalived 看似简单,问题大多出在细节。下面几条最容易踩:
1️⃣ 双主现象 两台同时持有 VIP → virtual_router_id
、auth_pass
不一致,或不在同一网段。
2️⃣ VIP 不出现 启动后 ip addr
没 VIP → 网卡名写错,或虚拟机没开启混杂模式(Allow MAC address changes)。
3️⃣ 漂移太慢 延迟几秒才切 → 心跳间隔太长,advert_int
可调成 0.5
。
4️⃣ 检测脚本异常 频繁漂移 → 检查脚本权限与返回码,chmod +x
后执行 echo $?
返回 0 才正常。
5️⃣ VIP 不回主 主机恢复但 VIP 仍在备机 → 加了 nopreempt
或状态残留,重启服务:
bash
# systemctl restart keepalived
6️⃣ 防火墙拦截 VRRP 用 UDP 112 端口,需放行:
bash
# ufw allow 112/udp
🧠 Keepalived 的核心不在命令,而在「通、对、漂」三字: 心跳要通、配置要对、VIP 要会漂。
十、验证访问效果
在任意主机上访问:
arduino
http://192.168.1.100
即使 web01 挂掉,访问仍能正常响应 web02 的服务。
bash
curl http://192.168.1.100
输出正常内容,说明漂移成功。
✅ 总结:主机可以死,IP 必须活
你已经完整掌握:
- Keepalived 的原理与配置逻辑
- VIP 自动漂移机制
- 故障模拟与健康检测
- 常见问题排查思路
真正的高可用,不是让机器永不宕机, 而是让系统在宕机时依然"若无其事"。
📌 下一篇预告: 《综合案例篇:Nginx + Redis + RabbitMQ + Keepalived 高可用架构》 把前面所有组件串联起来,搭出一套能抗宕机、能扩展、能容灾的完整生产级系统。
技术的尽头从来不是炫技,而是让系统更稳定,让人更安心。
学习 Keepalived,不只是为了漂移一个 IP, 而是为了拥有"任何情况都能稳住"的底气。
------ 正道小伟