上一篇 下一篇 分享链接 返回 返回顶部

如何设计跨境容灾架构,在香港服务器上结合DNS权重和自动故障切换实现服务不中断?

发布人:Minchunlin 发布时间:2025-07-15 09:44 阅读量:716

一、引言:来自一次凌晨4点的告警

那是一个香港台风预警后的凌晨,我的手机收到海外用户访问香港主站异常延迟的告警。检查发现,是其中一台香港边缘节点在高并发流量下因ISP链路抖动丢包严重。尽管主业务部署在香港,但面对东南亚、美国等用户,任何单点故障都有可能直接影响订单处理。我意识到,仅靠主机冗余还远远不够,必须构建一套真正“跨境可容灾”的架构,能在服务节点失效时实现毫秒级自动切换,且不中断业务。

于是,我设计并落地了基于“DNS权重智能调度 + 节点健康探测 + 高可用Failover切换机制”的容灾方案,并部署在香港及其周边区域的多台BGP服务器之上。以下是我的完整实战方案和技术实现过程。


二、整体架构设计概览

[海外用户] --> [权重DNS解析] --> [多地区节点(香港/新加坡/东京)] ↘↘↘ [健康检查 + 故障通知] --> [自动切换权重/剔除节点]

核心模块:

  • 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动态更新功能,实现权重控制。

# 示例:设置权重解析 curl -X POST "https://dnsapi.cn/Record.Modify" \ -d "domain=example.com&record_id=12345&sub_domain=api&record_type=A&record_line=默认&value=IP1&weight=80" # 故障切换时自动调整为备用节点 curl -X POST "https://dnsapi.cn/Record.Modify" \ -d "domain=example.com&record_id=12346&sub_domain=api&record_type=A&record_line=默认&value=IP2&weight=100"

我设置了如下初始权重:

  • 香港主节点:权重 80

  • 东京副节点:权重 10

  • 新加坡副节点:权重 10

一旦香港节点不可达,副节点权重立即提升到 100。

3.3 健康检查机制(自定义脚本 + Keepalived)

每个节点都部署了如下探测脚本,每 5 秒检测一次服务端口与出口丢包率。

#!/bin/bash HOST="127.0.0.1" PORT=443 PING_TARGET="1.1.1.1" nc -z -w2 $HOST $PORT NC_STATUS=$? LOSS=$(ping -c 5 $PING_TARGET | grep -oP '\d+(?=% packet loss)' | head -1) if [[ "$NC_STATUS" -ne 0 || "$LOSS" -gt 20 ]]; then # 调用 DNS API 将当前节点剔除 curl -s "https://dnsapi.cn/Record.Modify" -d "...将权重设置为0..." fi

此外,为确保服务级别可用性,我还在每台节点上配置了 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 秒内恢复正常权重(重检测成功自动恢复)


五、优化建议与可扩展方向

  1. 使用GeoDNS增强地域智能调度能力,结合 MaxMind 地理库对不同区域用户解析最近节点;
  2. 结合Anycast IP 实现真正的全局入口高可用(需要支持Anycast的BGP上游);
  3. 加入Zabbix或Prometheus告警系统,实时可视化故障与恢复流程;
  4. 支持灰度恢复机制:节点恢复后,先将其权重调低一段时间,观察稳定性后再恢复正常。

六、结语

通过这次架构实践,我深刻体会到:跨境业务环境下,单节点、单出口、单区域的容错性根本无法满足业务高可用需求。DNS权重+健康检查的方案虽然是“软切换”,但胜在兼容性强、部署灵活,适合以香港为核心节点,辐射东南亚和全球的业务场景。下一步,我将进一步结合Anycast、BGP监控、边缘缓存下推等方式,继续提升整体业务弹性与灾难恢复能力。

目录结构
全文