Apache与Keepalived配合实现主备高可用,通过Keepalived管理VIP,主节点提供服务,故障时备节点自动接管,实现无感知故障转移。

Apache 与 Keepalived 配合实现主备高可用,核心是用 Keepalived 管理一个虚拟 IP(VIP),由主节点(MASTER)对外提供 Apache 服务;当主节点故障时,备节点(BACKUP)自动接管 VIP 和服务,整个过程对客户端无感知。这不是负载均衡,而是故障自动转移,适用于中小规模、对服务连续性要求高的 Web 场景。
基础环境准备与服务安装
两台同构服务器(如 CentOS 7/8 或 RHEL 6.5+),网络互通,时间同步,防火墙和 SELinux 建议关闭或放行关键端口(80、VRRP 多播 224.0.0.18)。
- 在两台机器上均安装 Apache 和 Keepalived:
yum install -y httpd keepalived(CentOS/RHEL)或apt install -y apache2 keepalived(Debian/Ubuntu) - 启动并设为开机自启:
systemctl enable httpd && systemctl start httpd - 确认 Apache 默认页可访问(如返回
curl http://本机IP得到 “It works!” 或自定义内容) - 修改主页便于识别主备状态,例如:
echo "web1-Master" > /var/www/html/index.html(主)和echo "web2-Backup" > /var/www/html/index.html(备)
Keepalived 主备配置要点
Keepalived 通过 VRRP 协议选举 MASTER,依赖 state、priority、virtual_router_id 和 authentication 四个关键参数保持一致性与安全性。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
主节点(server1)配置:
/etc/keepalived/keepalived.conf中设置state MASTER、priority 100、virtual_router_id 51(同一集群必须相同)、auth_pass设为明文密码(如1111) -
备节点(server2)配置:除将
state改为BACKUP、priority降为90(必须低于主)外,其余 VRRP 段内容与主节点严格一致 - VIP 配置写在
virtual_ipaddress块中,例如:192.168.10.100/24 dev eth0,确保网卡名(eth0或ens33)与实际一致 - 可选增强:添加健康检查脚本,监控 Apache 进程或端口,失败时主动降低 priority 触发切换(例如用
vrrp_script+track_script)
验证与故障模拟流程
配置完成后,按顺序启动服务并观察行为变化,重点确认 VIP 是否只出现在主节点、是否能自动漂移。
- 先启动主节点 Keepalived:
systemctl start keepalived,执行ip a s查看 VIP 是否已绑定到主网卡 - 再启动备节点 Keepalived,此时备节点日志(
tail -f /var/log/messages | grep keepalived)应显示“Entering BACKUP STATE” - 客户端访问 VIP(如
curl http://192.168.10.100),应返回主节点的页面内容 - 手动停止主节点 Keepalived:
systemctl stop keepalived,约 1–3 秒后,备节点日志会提示“Transition to MASTER STATE”,VIP 自动出现在备节点网卡上,客户端再次访问仍能正常响应 - 恢复主节点服务后,VIP 会重新漂回主节点(因 priority 更高),完成一次完整主备切换闭环
常见问题与避坑提醒
主备失效或切换延迟,多数源于网络层或配置细节疏漏,而非 Keepalived 本身缺陷。
- VRRP 多播不通:检查交换机是否允许组播(224.0.0.18),物理/虚拟网络设备是否开启 IGMP Snooping 或做了过滤
-
优先级相同导致脑裂:两节点不能设相同 priority;若需强制主优先,可在主节点加
preempt_delay 30避免频繁抖动 -
Apache 未监听 VIP 所在网卡:默认
Listen 80是监听所有接口,但若配置了Listen 192.168.10.10:80这类绑定,则需改为0.0.0.0:80或确认 VIP 绑定后 Apache 能正确响应 -
日志无输出:确认
/etc/keepalived/keepalived.conf语法无误(可用keepalived -t检查),且 systemd 日志级别足够(journalctl -u keepalived -f更全面)

















