引言:单点故障是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/messages或journalctl -u keepalived -f查看状态切换记录 - 脑裂风险:两台机器同时持有 VIP 会导致流量错乱,务必保证组播/单播通信正常
七、总结
Keepalived 配置简单、切换迅速,是 IDC 双机热备的首选方案。但要注意:它只解决"IP 层面的高可用",数据一致性、会话保持等还需要结合业务层设计(如 Redis 主从、MySQL 半同步复制)。建议上线前反复演练主备切换,把故障预案做成肌肉记忆。
评论