引言:单点故障是IDC运维的头号敌人

无论你的服务多稳定,只要跑在一台机器上,就存在单点故障风险:硬件损坏、机房断电、网络抖动,任何一个意外都可能让业务中断。Keepalived 基于 VRRP 协议实现虚拟IP(VIP)在主备节点间漂移,是 IDC 场景下搭建高可用最成熟、最轻量的方案之一。本文从原理到实战,带你完整落地一套双机热备。

一、Keepalived 工作原理

Keepalived 的核心是 VRRP(虚拟路由冗余协议):多台机器组成一个虚拟路由器组,对外共用一个 VIP。正常情况下 VIP 绑定在主节点(MASTER)上,备节点(BACKUP)持续监听主节点的 VRRP 心跳通告。当备节点在指定时间内收不到主节点的通告时,就会接管 VIP,实现秒级切换。

  • MASTER:优先级高,持有 VIP,周期性发送 VRRP 通告
  • BACKUP:优先级低,监听通告,主节点失联后自动抢占 VIP
  • VIP:虚拟IP,客户端只访问它,不关心背后是哪台机器

二、环境准备

准备两台 CentOS 7/8 或 Ubuntu 服务器,配置如下示例:

节点A(主):192.168.1.10节点B(备):192.168.1.11VIP:192.168.1.100

三、安装与配置

两台节点分别安装 Keepalived:

# CentOSyum install -y keepalived# Ubuntu / Debianapt install -y keepalived

主节点 /etc/keepalived/keepalived.conf 配置:

global_defs {    router_id LVS_MASTER}vrrp_instance VI_1 {    state MASTER    interface eth0    virtual_router_id 51    priority 100    advert_int 1    authentication {        auth_type PASS        auth_pass 7ehl-ha-secret    }    virtual_ipaddress {        192.168.1.100/24 dev eth0    }}

备节点只需修改 state 为 BACKUP、priority 为 90、router_id 为 LVS_BACKUP,其余保持一致。注意:virtual_router_id 两台必须相同,优先级高的成为 MASTER。

四、启动与验证

systemctl enable --now keepalived# 查看 VIP 是否绑定(主节点应能看到 192.168.1.100)ip addr show eth0# 查看 VRRP 状态ip addr | grep 192.168.1.100systemctl status keepalived

在主节点执行 systemctl stop keepalived 模拟故障,观察备节点是否在 1~2 秒内接管 VIP:

# 备节点上执行,应能看到 VIP 出现ip addr show eth0 | grep 192.168.1.100

五、与业务服务联动:脚本健康检查

仅靠 VRRP 心跳无法感知业务是否存活(比如 Nginx 挂了但机器还活着)。需要结合脚本做健康检查:

vrrp_script chk_nginx {    script "/usr/local/bin/check_nginx.sh"    interval 2    weight -20}

检查脚本内容:

#!/bin/bashif systemctl is-active nginx >/dev/null 2>&1; then    exit 0else    exit 1fi

当脚本检测失败时,主节点优先级降低 20(100→80),低于备节点的 90,VIP 自动漂移到备节点,业务几乎无感知。

六、注意事项与排障

  • 防火墙:放行 VRRP 协议(IP协议号112)或组播 224.0.0.18,否则两台机器互相收不到通告
  • 抢占模式:默认主节点恢复后会抢回 VIP,如需避免抖动可配置 nopreempt
  • 日志排查tail -f /var/log/messagesjournalctl -u keepalived -f 查看状态切换记录
  • 脑裂风险:两台机器同时持有 VIP 会导致流量错乱,务必保证组播/单播通信正常

七、总结

Keepalived 配置简单、切换迅速,是 IDC 双机热备的首选方案。但要注意:它只解决"IP 层面的高可用",数据一致性、会话保持等还需要结合业务层设计(如 Redis 主从、MySQL 半同步复制)。建议上线前反复演练主备切换,把故障预案做成肌肉记忆。