HAProxy+Keepalived是Linux下成熟轻量的高可用方案,核心在于配置清晰、故障响应快、切换无感知;HAProxy通过global/defaults/frontend/backend四段实现七层流量分发,Keepalived通过VRRP协议实现VIP主备漂移,需注意防火墙、SELinux、mcast_src_ip及日志配置等细节。

用 HAProxy 做七层负载均衡,再配 Keepalived 实现主备自动切换,是 Linux 环境下最成熟、最轻量的高可用方案之一。核心不在于组件多高级,而在于配置逻辑清晰、故障响应快、切换无感知。
HAProxy 配置要点:聚焦业务流量分发
HAProxy 负责把用户请求按规则转发给后端真实服务器(如 Web 服务)。关键不是堆参数,而是理清四块结构:
-
global:设日志地址(如
log 127.0.0.1 local3 info)、最大连接数(maxconn 4096)、运行用户(user haproxy)和后台模式(daemon) -
defaults:定义通用行为,比如健康检查失败次数(
retries 3)、超时时间(timeout connect 5000ms、timeout client 60s)、重试转发(option redispatch) -
frontend:监听入口,如
bind *:80,配合 ACL 实现基于域名或路径的路由(例:acl bbs hdr_dom(host) -i bbs.example.com→use_backend bbs_pool if bbs) -
backend:定义真实服务器池,启用健康检查(
check inter 2000 rise 2 fall 3),支持轮询(balance roundrobin)或最小连接(leastconn)等算法
Keepalived 配置要点:确保 VIP 可靠漂移
Keepalived 通过 VRRP 协议让两台 HAProxy 服务器共享一个虚拟 IP(VIP),主节点挂了,VIP 自动切到备节点。重点看三处:
-
router_id:每台机器必须唯一,如
LVS_MASTER和LVS_BACKUP -
vrrp_instance:主节点设
state MASTER、高优先级(如priority 100);备节点设state BACKUP、低优先级(如priority 90);禁用抢占(nopreempt)可避免频繁来回切 -
virtual_ipaddress:写明 VIP,如
192.168.2.62/24 dev eth0;确保该网段能被客户端直连(云环境需额外申请弹性 IP 或开启辅助 IP 权限)
协同工作与验证方式
HAProxy 和 Keepalived 不是简单装上就跑通,必须确认它们真正联动:
- 两台服务器都启动 HAProxy(
systemctl start haproxy),再启动 Keepalived(systemctl start keepalived) - 在主节点执行
ip addr show eth0,应看到 VIP;在备节点不应出现;手动停主节点的 Keepalived,VIP 应 2 秒内出现在备节点 - 用浏览器或
curl http://[VIP]访问,反复刷新,观察后端服务器响应内容是否轮换(如返回 web1/web2);同时访问http://[VIP]/haproxy?stats查看实时状态页(需配stats auth) - 模拟后端宕机:停掉一台 Web 服务,HAProxy 日志应报
Server xxx is DOWN,流量自动切到剩余节点,不影响用户访问
常见踩坑提醒
实际部署中,这几个细节最容易导致“看着配对了,但就是不生效”:
-
防火墙没关或没放行 VRRP 组播(协议号 112)和 HAProxy 端口(如 80、1080),CentOS 7+ 默认用 firewalld,执行
firewall-cmd --permanent --add-port=80/tcp并重载 - SELinux 开启状态下,HAProxy 无法绑定非标准端口或访问网络,临时关闭验证:
setenforce 0;长期方案是调整策略或设为 permissive - Keepalived 的
mcast_src_ip必须填本机真实 IP(非 127.0.0.1),否则 VRRP 报文发不出去;两节点的virtual_router_id必须一致(如都为 51) - HAProxy 日志默认不输出到文件,需在 rsyslog 中显式配置
local3.* /var/log/haproxy.log并重启 rsyslog 服务










