Keepalived 高可用实战(Ubuntu 24.04)

整个国庆节期间,人很不舒服,心悸失眠,这两天又重感冒嗓子哑。 大概是压抑太久了。既然身体不听话,那就把注意力放回技术------写点让我安心的东西。

📖 中间件系列导航 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_idauth_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, 而是为了拥有"任何情况都能稳住"的底气。

------ 正道小伟

相关推荐
运维闲章印时光3 小时前
网络断网、环路、IP 冲突?VRRP+MSTP+DHCP 联动方案一次性解决
运维·服务器·开发语言·网络·php
ARTHUR-SYS3 小时前
基于Kali linux 安装pyenv及简单使用方法及碰到的问题
linux·运维·chrome
苹果醋33 小时前
数据结构其一 线性表
java·运维·spring boot·mysql·nginx
CIb0la3 小时前
微软宣布 Windows 11 v25H2 GA
运维·安全·生活
java干货4 小时前
我用Nginx做了负载均衡,还需要API网关吗?
运维·nginx·负载均衡
IvanCodes5 小时前
十五、深入理解 SELinux
linux·运维·服务器
对着晚风做鬼脸7 小时前
MySQL 运维知识点(十六)---- 读写分离
运维·数据库·mysql·adb
Rsingstarzengjx10 小时前
搭建Jenkins gitlab 环境
运维·服务器
君之嘞13 小时前
【操作系统基础】认识操作系统:系统调用
linux·运维·microsoft