4. 网络层规划:专线互联、DNS智能解析(GeoDNS)、Anycast与BGP路由策略

网络层是多活架构的血管。数据能不能流到该去的地方,用户能不能连到最近的节点,全靠这一层。我参与过的几个多活项目,网络层面出问题往往最要命——专线断了、DNS解析不准、BGP路由黑洞,任何一个都会把整个系统拽倒。

这一节,咱们就把这三块核心内容掰开揉碎。专线互联是骨架,GeoDNS是入口调度,Anycast+BGP是最后一公里的路由保障。三者配合好了,用户才能无感切换。

4.1 专线互联:数据中心的“高速公路”

多活数据中心之间必须通过专线连接。为什么不用公网?公网延迟高、抖动大、带宽不可控,而且经过多家运营商容易出问题。我在一个金融项目中就遇到过:A中心到B中心用公网传输binlog,高峰期延迟飙升到200ms,导致同步严重滞后,最终被迫改成了专线。

4.1.1 专线类型选择

类型带宽范围延迟(同城)适用场景
物理裸光纤(L0/L1)100Gbps+<0.5ms同城双活,对延迟极度敏感
OTN/WDM波分10G~400G<1ms同城/异地数据中心互联
MSTP/MPLS VPN100M~10G1~5ms异地多活,成本敏感
SD-WAN over 运营商动态调整5~20ms广域网备份链路,弹性伸缩

我个人习惯的做法是:主专线用波分或裸光纤,保障带宽和延迟;再拉一条SD-WAN或MPLS VPN做备份。千万别只靠一条线,我见过专线被施工挖断,整个业务全挂的案例。

4.1.2 二层互联还是三层互联

多活场景下,两台数据中心之间要不要做二层互联?我建议能不做就不做。二层广播域太大,ARP风暴、MAC表震荡、环路风险都很高。我早年一个项目非要做大二层,结果一次交换机升级触发广播风暴,整个数据中心宕了20分钟。

现在的主流做法是三层互联:每个数据中心作为一个独立自治域(AS),通过专线运行OSPF或BGP。同城延迟很低的情况下可以跑OSPF,异地最好用BGP,方便控制路由策略。

经验提示:专线互联一定要部署链路质量探测(例如BFD),与上层路由联动。我曾经把BFD最小探测间隔设为50ms,连续三次丢失就切换。专线抖动了两次就被误切换,后来改成100ms三次,稳定多了。

4.2 DNS智能解析(GeoDNS):让用户找到最近的入口

用户访问你的域名,DNS返回哪个数据中心的IP?GeoDNS就是干这个的。它根据用户的源IP归属地(LDNS地址),返回离他最近的数据中心VIP。

实现方式主要有两种:

  • 自建DNS:用BIND+GeoIP模块,或者PowerDNS配合Lua脚本。灵活,但需要自己维护权威DNS和容灾。
  • 云服务商专用解析:比如阿里云DNS、Cloudflare,配置简单,自带高可用。一般推荐用这个,省事。
核心配置原则:
- 每个数据中心分配独立的地理区域(华北、华东、华南等)。
- TTL不要设太长,30~60秒即可。太长会导致故障切换后用户端缓存迟迟不更新。
- 设置兜底策略:如果用户IP无法识别归属,返回所有数据中心IP,让客户端随机选一个。

嗯,这里要特别提一下TTL。我曾经踩过一个坑:某项目把GeoDNS的TTL设成了600秒。一次华南机房故障,我们立刻修改解析切到华东,结果整整10分钟大部分用户还在访问故障IP。后来我把所有多活域名的TTL统一改成了30秒,切换时效性大大提高。

GeoDNS还有一个坑:很多企业把LDNS(运营商的递归DNS)的IP当作用户真实IP。但实际上LDNS可能离用户很远。比如一个上海用户用了北京的DNS服务器,GeoDNS可能把他调度到北京机房。要解决这个问题,可以用EDNS Client Subnet(ECS)扩展,让递归DNS把用户真实IP传给权威DNS。现在的云DNS厂商基本都支持。

4.3 Anycast与BGP路由策略:最后一公里的引流

GeoDNS把用户引导到一个数据中心,但用户到该数据中心的网络路径怎么走?Anycast+BGP就是答案。

4.3.1 Anycast原理

简单说:多个数据中心公布同一个IP地址(VIP),通过BGP向互联网宣告。用户发往这个IP的包,会根据BGP路由表自动走到“最近”的那个数据中心。注意,这个“最近”不是物理距离,是AS路径最短。

Anycast典型应用场景:

  • DNS解析服务(根服务器、公共DNS)
  • CDN边缘节点
  • API网关入口(多活架构的流量入口层)
注意:Anycast不适合有状态服务(比如数据库连接)。因为不同数据中心的BGP路由发生变化时,同一用户的后续包可能被路由到另一个数据中心,导致连接中断。所以Anycast一般只用于无状态层(L4负载均衡、API网关)。

4.3.2 BGP路由策略调优

单纯依靠BGP的最短AS路径选路,往往不够精准。你可能需要:

  • AS Path Prepending:在某个数据中心对外宣告时,人为增加AS路径长度,让流量尽量少走这个入口。比如北京数据中心承载能力是上海的2倍,可以给上海的路由加长AS路径,强制流量优先流向北京。
  • MED(Multi-Exit Discriminator):向同一个上游宣告多条路径时,用MED告诉上游“哪条更优”。MED值越小越优。
  • Local Preference:与运营商协商,设置本地优先级。一般用在运营商内部,我们作为用户控制不了,但可以跟运营商提需求。

我记得有一个案例:某公司两个数据中心分别在上海和广州,用户集中在华南。默认BGP选路下,上海机房也走了大量流量,导致跨专线回源。后来我们在上海端做了AS Path Prepending,加了三次AS号码,流量立刻平衡了。效果立竿见影。

4.3.3 多活架构下的网络层整合

下面这张图展示了我比较推荐的多活网络层架构:

多活架构网络层:专线 + GeoDNS + Anycast/BGP 用户(华东) 用户(华南) 用户(华北) GeoDNS权威解析 返回最近数据中心VIP 数据中心A(上海) Anycast VIP: 1.2.3.4 数据中心B(广州) Anycast VIP: 1.2.3.4 数据中心C(北京) Anycast VIP: 1.2.3.4 专线互联 波分/裸光纤 三层路由BGP BFD探测 网络层流程 1. 用户在浏览器输入域名 → 递归DNS查询 → GeoDNS权威DNS 2. GeoDNS根据用户LDNS归属,返回最近数据中心的Anycast VIP(如上海 1.2.3.4) 3. 用户访问1.2.3.4,BGP路由自动将流量引入就近的数据中心入口 4. 数据中心之间通过专线同步数据,专线有BFD探测,故障时BGP路由收敛 5. 如果某数据中心整体故障,GeoDNS自动摘除该区域映射,流量由Anycast BGP路由重定向

这张图里,GeoDNS负责地域调度,Anycast负责就近路由,专线负责数据中心内部同步。三者配合,任何一层出问题都有兜底策略。

4.4 综合策略与避坑清单

最后列几个我亲身踩过的坑,供大家参考:

避坑指南:
- 专线不要在公网跑关键业务流量,必须走物理隔离链路。
- GeoDNS的TTL建议不高于60秒,宁可增加解析压力也要保证切换速度。
- Anycast的BGP宣告要配置route-map,限制只向指定运营商宣告,避免路由泄漏。
- 每个数据中心至少配置两个不同的BGP上游运营商,防止单运营商故障。
- 定期做“断网演习”:拔掉专线、关掉某数据中心的BGP宣告,验证切换是否平滑。

网络层的规划是个细致活。粗看就是几条专线、一个DNS、一堆BGP配置,但里面的坑多到你数不过来。我建议多读几遍BGP选路规则,多看看运营商的路由拓扑。记住一句话:网络层规划的好坏,直接决定了多活架构的天花板。