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, 而是为了拥有"任何情况都能稳住"的底气。

------ 正道小伟

相关推荐
我爱钱因此会努力20 小时前
ansible自动化运维入门篇
linux·运维·服务器·centos·自动化·ansible
CIb0la20 小时前
能保持精神专注的爱好能给生活带来种种积极的转变
运维·学习·生活
梁萌1 天前
Linux安装mysql8.4.6
linux·运维·mysql安装·8.4.6
FreeBuf_1 天前
Ubuntu内核曝严重UAF漏洞,可致攻击者获取Root权限
linux·运维·ubuntu
初学者_xuan1 天前
零基础新手小白快速了解掌握服务集群与自动化运维(十六)集群部署模块——Keepalived双机热备
运维·自动化·github
行思理1 天前
Dockerfile 各指令说明
运维·macos·docker·容器·php
半梦半醒*1 天前
k8s——资源管理
linux·运维·docker·容器·kubernetes·自动化
gfdgd xi1 天前
GXDE For deepin 25:deepin25 能用上 GXDE 了!
linux·运维·python·ubuntu·架构·bug·deepin
落世繁华1 天前
Docker快速部署--Mysql一键初始化
运维·mysql·docker·容器·一键部署
叫我詹躲躲1 天前
救命!MySQL 误删数据找不回?老运维私藏的备份技巧,免费给
运维·数据库