1.
准备工作与架构说明
准备两台位于新加坡(或同一子网)的负载均衡节点(LB1、LB2),若使用公有云请确认支持浮动IP或允许VRRP。再准备至少两台后端应用服务器(App1、App2)。确认所有机器可互相SSH、时间同步(chrony/ntp),并记录私有IP,例如LB1=10.0.0.10、LB2=10.0.0.11,App1=10.0.0.21、App2=10.0.0.22,虚拟IP(VIP)=10.0.0.100。
2.
在LB节点安装必需软件(以Ubuntu为例)
在LB1与LB2上执行:
sudo apt update && sudo apt install -y haproxy keepalived curl vim
启用并检查HAProxy:sudo systemctl enable --now haproxy;sudo systemctl status haproxy。
3.
配置HAProxy作为前端负载均衡器
编辑 /etc/haproxy/haproxy.cfg,注意替换IP为你的后端地址。关键片段:
global
log /dev/log local0
defaults
timeout connect 5s
timeout client 50s
timeout server 50s
frontend http-in
bind 10.0.0.100:80
default_backend servers
backend servers
option httpchk GET /health
server app1 10.0.0.21:80 check inter 2000 rise 2 fall 3
server app2 10.0.0.22:80 check inter 2000 rise 2 fall 3
保存后重启:sudo systemctl restart haproxy。
4.
在LB节点配置Keepalived实现VIP漂移(VRRP)
编辑 /etc/keepalived/keepalived.conf,LB1配置为MASTER、优先级100,LB2为BACKUP、优先级90。示例如下(LB1):
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication { auth_type PASS auth_pass mypass }
virtual_ipaddress { 10.0.0.100 }
track_script { chk_haproxy }
}
在同目录创建健康检查脚本 /etc/keepalived/check_haproxy.sh(可简单curl本地9000端口或检查haproxy进程),并在keepalived.conf内定义track_script chk_haproxy来在HA失效时使VIP漂移。
5.
实现Keepalived中的HAProxy健康检查脚本
创建脚本 /etc/keepalived/check_haproxy.sh 内容:
#!/bin/bash
if curl -sS http://127.0.0.1:9000/; then exit 0; else exit 1; fi
给可执行权限:sudo chmod +x /etc/keepalived/check_haproxy.sh。并在keepalived.conf中引用为 track_script chk_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 2 weight 2 }
6.
为HAProxy启用本地状态页(便于健康检查)
在haproxy.cfg增加监听管理页:
listen stats
bind 127.0.0.1:9000
mode http
stats enable
stats uri /
stats auth admin:YourStrongPass
之后重启haproxy:sudo systemctl restart haproxy。确保keepalived的check脚本能访问该地址。
7.
调整防火墙与内核转发设置
开放80/443和VRRP所需的协议(VRRP使用协议112,某些云平台不支持)。以ufw为例:sudo ufw allow 80/tcp; sudo ufw allow proto 112; 如果云厂商不允许协议112,改用云提供的浮动IP API或路由表切换。确保内核允许IP转发:sudo sysctl -w net.ipv4.ip_forward=1 并加入 /etc/sysctl.conf 永久生效。
8.
启动并设置开机自启
在两台LB上启用服务:sudo systemctl enable --now keepalived;确认状态:sudo systemctl status keepalived。使用 ip addr show 确认VIP只出现在MASTER节点的网口上(应显示10.0.0.100)。
9.
测试故障自动切换(切换演练)
在正常情况下访问VIP:curl http://10.0.0.100/ 应返回后端内容。模拟故障:在MASTER上停止haproxy或keepalived:sudo systemctl stop haproxy(或kill keepalived);观察几秒内VIP漂移到BACKUP(使用 ip addr show 在LB2上查看)。在BACKUP上确认haproxy接管并能响应请求。恢复MASTER后VIP应根据优先级回切。
10.
监控、日志与告警建议
将HAProxy日志转发到集中式日志(rsyslog/ELK),监控VIP和后端健康(Prometheus+Grafana或Zabbix),并配置告警在VIP漂移或后端失败时通知运维。定期做演练并在非高峰时间测试切换。
11.
云平台注意事项与替代方案
在AWS/GCP等云平台上,原生VRRP通常受限,建议使用云负载均衡(ELB、GCLB)或使用云提供的弹性/浮动IP(例如AWS弹性IP的API重绑定)实现故障切换。若使用浮动IP,keepalived可以改为调用云API切换IP。
12.
常见故障排查要点
若VIP未漂移,检查:接口名是否正确(eth0 vs ens3)、keepalived日志 /var/log/syslog 中的错误、VRID冲突、防火墙阻断协议112或ARP、HAProxy配置语法错误。使用 tcpdump -i eth0 vrrp 观察VRRP报文。
13.
问:在新加坡数据中心部署时,VRRP不工作怎么办?
答:很多云/托管环境禁用协议112或限制ARP,导致VRRP失败。此时推荐使用云提供的浮动IP/弹性IP,通过API在主备切换时重新绑定IP;或直接使用云负载均衡服务(如AWS ELB、GCP LB、阿里云SLB)来替代自建VRRP方案。
14.
问:如何保证切换时业务无明显中断?
答:缩短keepalived advert_int、health check间隔并优化haproxy健康检查参数 rise/fall 值可以加快切换速度;提前做连接draining(haproxy配置backend时用shutdown-sessions或设置check)以减少会话中断;同时后端应支持无状态或会话共享(如Redis会话存储)。
15.
问:我该如何把这套方案扩展到多可用区/多Region?
答:跨可用区/跨Region建议使用全球负载均衡或DNS+健康检查(如GSLB/Route53健康路由)。在每个可用区内部署HAProxy+Keepalived管理本地VIP,外层由DNS或云GW做流量分发与故障转移。