如何设计跨境容灾架构,在香港服务器上结合DNS权重和自动故障切换实现服务不中断?
一、引言:来自一次凌晨4点的告警
那是一个香港台风预警后的凌晨,我的手机收到海外用户访问香港主站异常延迟的告警。检查发现,是其中一台香港边缘节点在高并发流量下因ISP链路抖动丢包严重。尽管主业务部署在香港,但面对东南亚、美国等用户,任何单点故障都有可能直接影响订单处理。我意识到,仅靠主机冗余还远远不够,必须构建一套真正“跨境可容灾”的架构,能在服务节点失效时实现毫秒级自动切换,且不中断业务。
于是,我设计并落地了基于“DNS权重智能调度 + 节点健康探测 + 高可用Failover切换机制”的容灾方案,并部署在香港及其周边区域的多台BGP服务器之上。以下是我的完整实战方案和技术实现过程。
二、整体架构设计概览
核心模块:
-
DNS权重智能调度(Geo + Weight Based DNS)
-
实时健康检查系统(如Keepalived + 自定义探测脚本)
-
自动权重调整 + 故障剔除(DNS API动态更新)
-
区域优先访问策略 + 回源容灾链路(GRE/IPSec)
三、部署细节与实操步骤
3.1 服务器选型与部署分布
我选用了A5数据提供的三台香港裸金属服务器(带独立BGP IP)作为主节点,并在东京、新加坡通过同样的配置部署副节点,实现跨境区域冗余。
| 地区 | 角色 | 配置简述 |
|---|---|---|
| 香港 | 主节点 | Xeon + NVMe + BGP egress + 10Gbps带宽 |
| 东京 | 副节点A | 同配置,备用回源 + CDN回源节点 |
| 新加坡 | 副节点B | 同配置,低延迟服务Southeast Asia |
3.2 DNS权重配置方案(基于DNSPod或Route53)
我使用 DNSPod 提供的权重DNS服务,结合API动态更新功能,实现权重控制。
我设置了如下初始权重:
-
香港主节点:权重 80
-
东京副节点:权重 10
-
新加坡副节点:权重 10
一旦香港节点不可达,副节点权重立即提升到 100。
3.3 健康检查机制(自定义脚本 + Keepalived)
每个节点都部署了如下探测脚本,每 5 秒检测一次服务端口与出口丢包率。
此外,为确保服务级别可用性,我还在每台节点上配置了 Keepalived + VIP 漂移,用于节点内部多进程/多网卡容灾。
3.4 自动权重切换控制器(Python实现)
我编写了一个 dns-weight-controller.py 定时运行脚本,逻辑如下:
-
通过本地或远程 Prometheus 采集 HTTP 5xx 错误率、延迟、丢包数据。
-
判断是否超过阈值(例如:5xx > 5% 或 ping 丢包 > 25%)
-
若超过阈值,通过 DNS API 将该节点对应的权重设置为 0
-
同时,将其他副节点的权重设为100,实现无中断切换
四、容灾测试与压测回放
我模拟了以下3种容灾场景:
-
香港节点端口被防火墙阻断(iptables封端口)
-
模拟上行链路抖动(限制出口MTU + 故意丢包)
-
整节点关闭服务(systemctl stop nginx)
结果:
-
故障发生后 6 秒内 DNS 解析已切换至副节点
-
对终端用户无感知,仅首次请求延迟略升高约 40ms
-
故障节点恢复后,15 秒内恢复正常权重(重检测成功自动恢复)
五、优化建议与可扩展方向
- 使用GeoDNS增强地域智能调度能力,结合 MaxMind 地理库对不同区域用户解析最近节点;
- 结合Anycast IP 实现真正的全局入口高可用(需要支持Anycast的BGP上游);
- 加入Zabbix或Prometheus告警系统,实时可视化故障与恢复流程;
- 支持灰度恢复机制:节点恢复后,先将其权重调低一段时间,观察稳定性后再恢复正常。
六、结语
通过这次架构实践,我深刻体会到:跨境业务环境下,单节点、单出口、单区域的容错性根本无法满足业务高可用需求。DNS权重+健康检查的方案虽然是“软切换”,但胜在兼容性强、部署灵活,适合以香港为核心节点,辐射东南亚和全球的业务场景。下一步,我将进一步结合Anycast、BGP监控、边缘缓存下推等方式,继续提升整体业务弹性与灾难恢复能力。
