如何自动将流量从故障公网IP转发至备用同步服务器IP?
这场景我之前帮不少团队处理过,结合你们已经做了服务器全量同步的基础,核心要解决的就是跨ISP的自动故障转移,下面按实现成本和可靠性给你几个落地方案:
方案1:DNS健康检查+自动解析切换(最易实现)
这是中小团队最常用的方案,依赖你的域名服务商的功能:
- 把域名配置两条A记录,分别指向服务器A的
X.X.X.X和服务器B的XX.XX.XX.XX; - 开启域名服务商提供的健康检查功能(主流服务商基本都支持),配置检测规则:比如每隔10秒检测一次目标IP的80/443端口,或者发送HTTP请求检查返回状态码;
- 当检测到
X.X.X.X连续失败2-3次后,服务商自动把解析权重倾斜到XX.XX.XX.XX,甚至直接暂停故障IP的解析; - 关键要把DNS的TTL(生存时间)设短一点,比如30秒——这样全球DNS缓存更新更快,用户能更快切到正常IP,但也别设成10秒以内,不然会增加DNS服务器的负载。
方案2:前置负载均衡器(切换速度最快)
如果对故障切换的速度要求极高(比如毫秒级),可以在两台服务器前加一层负载均衡:
- 可选软件负载均衡(比如Nginx、HAProxy)或者硬件负载均衡,甚至用云厂商的负载均衡服务;
- 把两台服务器的IP配置为负载均衡的后端节点,同时开启后端健康检查:比如每隔5秒检测一次后端的服务端口,或者检查特定URL的返回状态;
- 当服务器A的节点连续失败3次,负载均衡会自动把它从后端池中剔除,所有流量直接转发到服务器B;
- 给你贴一段HAProxy的简化配置参考:
frontend http_service bind *:80 bind *:443 ssl crt /etc/haproxy/certs/yourdomain.pem default_backend web_servers backend web_servers balance roundrobin # 正常情况下轮询分发流量 server serverA X.X.X.X:80 check inter 5s fall 3 rise 2 server serverB XX.XX.XX.XX:80 check inter 5s fall 3 rise 2
这里的check inter 5s是每隔5秒检查一次,fall 3是连续3次失败标记为不可用,rise 2是恢复后2次成功就重新加入节点池。
方案3:BGP路由切换(适合大型企业)
如果你们有自己的ASN(自治系统号),可以和两个ISP合作开通BGP服务:
- 把两个公网IP都通过BGP协议宣告到互联网,正常情况下两条路由都生效,流量会按ISP的链路成本分发;
- 当服务器A的IP所在链路故障时,BGP会自动撤销该路由条目,全球的路由器都会自动把流量导向服务器B的IP;
- 这个方案切换速度极快,但技术门槛和成本都很高,一般只有大型企业才会用。
几个关键注意事项
- 健康检查要测真实服务状态:别只ping IP,最好检测应用的健康接口(比如
/api/health),避免IP通但服务挂了的情况; - 定期演练故障切换:手动停掉服务器A的服务,验证流量是否自动转到B,确保机制真的能生效;
- 如果用DNS方案,记得测试TTL的生效时间:可以用
dig yourdomain.com或者nslookup yourdomain.com命令,查看不同地区的解析结果是否更新。
内容的提问来源于stack exchange,提问作者Hasanuzzaman Sattar
相关产品推荐
相关产品推荐

