异地多活不能仅靠复制Nginx+Keepalived实现,因Keepalived依赖VRRP协议,而VRRP要求节点二层互通且延迟极低。

异地多活不是简单把 Nginx + Keepalived 复制到多个城市就能实现的。Keepalived 本身依赖 VRRP 协议,而 VRRP 要求节点在二层网络互通、延迟极低(通常
本地机房:用 Keepalived 保障 Nginx 自身不宕机
每个机房至少部署两台 Nginx 服务器(例如 node-a 和 node-b),共用一个机房内虚拟 IP(VIP),比如 10.10.1.100。Keepalived 在该机房内部运行,通过 VRRP 投票选举 Master:
- Master 节点绑定 VIP,对外提供服务;Backup 节点持续监听心跳
- 一旦 Master 上的 Nginx 进程崩溃或机器失联,Keepalived 自动触发 VIP 漂移,Backup 接管
- 推荐配合自定义健康检查脚本(如 nginx_check.sh),不只是 ping 端口,而是请求
/nginx_status确保服务真正可响应
跨地域层:靠 DNS 或 GSLB 实现用户就近接入
客户端访问域名(如 app.example.com)时,不能靠 Keepalived 分发到异地——它做不到。必须依赖更上层的调度机制:
- DNS 轮询 + 地理位置解析:DNS 服务商(如阿里云云解析、AWS Route 53)根据用户出口 IP 所属地域,返回对应机房的 VIP(北京用户→10.10.1.100,广州用户→10.20.1.100)
- GSLB(全局负载均衡器):专业设备或云服务(如 F5 GTM、Cloudflare Load Balancing)实时探测各机房的健康状态、延迟、容量,动态返回最优 IP
- 关键点:DNS TTL 必须设得足够短(如 60s),才能让故障发生后用户快速切换到其他可用机房
Nginx 配置需适配多活语义
每个机房的 Nginx 不仅做转发,还要承担本地化决策责任:
-
启用主动健康检查:
health_check interval=3s fails=2 passes=2,及时剔除挂掉的后端应用实例 -
设置合理的超时与重试:避免因某台后端卡顿拖垮整个机房入口,例如
proxy_next_upstream error timeout http_502 -
透传真实地域标识:在请求头中注入
X-Region: beijing,便于后端识别流量来源,做差异化处理(如读本地缓存、写本地 DB)
数据层必须最终一致,不能强依赖同步
异地多活成败不在前端,而在数据。Nginx 和 Keepalived 都不解决数据问题,但架构设计必须规避风险:
- 禁止跨机房强一致性事务(如两阶段提交),改用最终一致性方案(消息队列 + 补偿)
- 用户分片(sharding)是常见策略:按 UID 取模,固定归属某机房,写操作只进该机房,读优先本地,失败再跨机房查
- 所有机房共享的配置类数据,走独立的分布式配置中心(如 Apollo、Nacos),而非靠 Nginx reload 同步


















