别急着加机房

博客分类: 

上个月参加一个架构评审会,有个团队提出要在新加坡加一个机房。理由很充分——东南亚用户访问我们的服务,延迟大概在 250 毫秒左右,体验不够好。加一个区域,理论上能降到 30 毫秒以内。

方案看起来很完美,PPT 里的数据也很漂亮。但我问了一个问题:你们拆解过这 250 毫秒里,有多少是真的花在网络传输上的吗?

没人答得上来。

这件事让我想到一个越来越普遍的现象:很多团队在做多区域部署决策的时候,把"加机房"当成了万能解。延迟高?加机房。用户远?加机房。容灾不够?加机房。但很少有人认真算过,加一个区域的真实成本是什么,以及——有没有更便宜的方案能达到同样的效果。

250 毫秒里,真正的网络传输只占一半

这是很多人不愿意相信的事实:用户感受到的端到端延迟,有接近一半跟地理距离无关。

一个请求从用户手机出发,经过 DNS 解析、TLS 握手、TCP 连接建立,到达服务器后被处理,再把结果返回。这整个链路里,真正受光速限制、必须靠物理距离来解决的,只有网络传播那一段。其他部分——DNS 查询、TLS 协商、连接池等待、服务间调用链、数据库查询、应用层序列化——这些都可以通过架构优化来解决,不需要搬家。

我见过一个真实案例。某服务测出来端到端延迟 260 毫秒,初步判断是机房太远。但在拆解完整条链路后发现,真正的地理传播延迟只占约 45%。剩下的是什么?低效的服务依赖关系——A 服务调 B 服务,B 又回调 A 做授权检查;重复的身份验证——每个微服务都要验一遍 token;还有未复用的数据库连接——每次查询都重新建连。

这意味着,还没动手加机房,你就已经有一半的优化空间了。而且这些优化的成本,远低于新建一个区域。

加一个区域要花多少钱?远超你的想象

大部分团队在做成本估算时,只算了基础设施的硬件和网络费用。但真实的多区域部署成本,至少包括五个层面:

第一,基础设施费用。服务器、网络、存储,这些是看得见的部分,通常占总成本的四分之一左右。

第二,服务上线开销。你有几百个微服务,每个都要在新区域配置、验证、上线。服务之间的依赖关系会在上线过程中集中暴露——没文档化的依赖、循环依赖、冗余配置,这些问题在单区域时不影响运行,跨区域时会变成定时炸弹。

第三,数据同步成本。跨区域数据复制是最容易被低估的部分。同步复制会让写入延迟增加上百毫秒;异步复制虽然快,但引入了最终一致性的窗口,应用层需要额外处理冲突。更隐蔽的是元数据——对象本身的复制流量你能算到,但访问控制记录、版本标记、复制状态标志这些元数据的复制流量,经常是上线后才发现的惊喜。

第四,运营复杂度。值班覆盖要翻倍,部署管道要扩展,故障响应范围要扩大。以前 3 个区域时,每次发版人工协调一下就行;14 个区域时,同样的流程每年累计要花几千小时。不自动化,运营成本会随区域数量线性增长。

第五,跨区域流量费。这是云服务商收费最贵的项目之一。需要频繁跨区域交换数据的架构,光流量费就可能在 12-18 个月内超过整个部署投资。

先优化,再扩展

这不是说多区域部署没有价值。有些场景下它确实是刚需——数据主权合规要求数据必须存在特定区域;实时交易和互动游戏需要 50 毫秒以内的延迟,物理距离是硬约束;灾难恢复要求两个地理隔离的机房做 Active-Active。这些都是合理的理由。

但如果仅仅是"延迟有点高",我的建议是:先拆解延迟构成,再决定要不要加。

还是说回开头那个 260 毫秒的案例。那个团队最终没有直接加机房,而是分了三步走:

第一步,引入基于延迟的路由策略,同时从请求路径中移除了两个不必要的跨区域服务调用。这一步零基础设施投入,延迟从 260 毫秒降到了 160 毫秒——降幅 35%。

第二步,优化数据库访问模式,启用连接池,消除了重复的授权校验调用。延迟又减了 30 毫秒,到了 130 毫秒左右。

第三步,在前两步优化到位之后,再上线新区域。因为系统已经精简过,增量效果非常明显,本地用户延迟直接降到了 60 毫秒以下。

如果跳过前两步直接加区域呢?大概也能达到类似效果,但花的钱可能是现在的三到五倍,而且后续运营成本会更高——因为你带着一个臃肿的架构进了新区域,所有问题都被复制了一份。

三种部署模式,没有银弹

真要加区域的时候,架构选择也是个坑。常见的三种模式各有各的代价:

全栈 Active-Active:每个区域独立运行,都能处理读写。延迟最低,但成本最高。写入冲突需要在应用层解决,数据一致性要在每个数据类型层面分别设定策略——对象元数据可能需要强一致性,而同步状态可以容忍短暂不一致。很多团队对所有数据一刀切地应用同一种一致性策略,要么过度投资,要么保护不足。

本地读 / 全局写:一个主区域负责所有写入,其他区域只处理读取。读延迟低,写延迟高。适合读多写少的场景,比如内容分发或者产品目录。

Active-Passive(带自动故障转移):主区域干活,辅区域只做冷备。成本最低,但故障转移时间要 5-20 分钟。这里有个隐性风险——从未被测试过的故障转移路径,在实际调用时大概率会出问题。如果你选这个模式,请定期做故障转移演练,并且在规划中使用实测的切换时间,而不是理论上的 RTO。

一个决策框架

如果你正在纠结要不要加区域,可以先问自己几个问题:

你有没有完整拆解过当前延迟的构成?地理传播占多少,架构开销占多少?

非地理因素的延迟,你有没有认真优化过?路由策略、连接池、服务依赖、缓存策略,这些做完了吗?

新增区域的五年 TCO(总拥有成本),包括运营和同步开销,算清楚了吗?

你有没有明确的业务指标能证明:延迟降低 X 毫秒,能带来 Y 的收入增长或用户留存提升?

如果前三个问题的答案都是"没有"或者"不确定",那你大概率还没到需要加机房的时候。先优化架构,把钱花在刀刃上。

多区域部署是云基础设施中影响最深远的决策之一。它的收益很诱人,但代价也很真实。那些做得好的团队,不是选对了最便宜的架构,而是投资了让他们能持续优化的能力——监控、自动化、和可追溯性。

加机房不难,难的是加完之后长期运营得当。

而最容易被忽略的一步,往往是在动手之前先搞清楚:你真正需要解决的问题,是不是只有加机房才能解决。

You voted 5. Total votes: 24

添加新评论