砍掉 80% 年停机时间:可用性从 99.5% 到 99.9% 的 6 个工程决策与踩坑实录
概述 99.5% 的可用性听起来不错——直到你算一笔账。 一年 8760 小时,99.5% 意味着允许停机 43.8 小时。换算到每个月,差不多 3.65 小时的服务中断。如果是核心交易系统,这 3.65 小时可能就是几十万的订单损失。如果赶在大促期间,损失会翻几十倍。 99.9% 呢?年停机 8.77 小时,月均不到 44 分钟。停机时间砍掉 80%。 0.4 个百分点的提升,背后不是加几台服务器那么简单。我在某出行平台推动过一次这样的改造,从立项到稳定运行在 99.9% 以上,花了整整 14 个月。这期间踩的坑、做的权衡、推翻重来的方案,比写代码本身多得多。 这篇文章不讲理论框架,只拆解我们做过的 6 个关键工程决策,以及 3 个让我后背发凉的踩坑时刻。每个决策都附上我们当时的选型对比和最终方案,你拿去就能对照自己的系统查漏补缺。 可用性的数学本质:为什么 0.4% 这么难 先搞清楚一件事:可用性不是加法,是乘法。 假设你的系统由 3 个服务串联组成,每个服务可用性 99.5%。整个链路的可用性是多少? 0.995 × 0.995 × 0.995 = 0.9851 ≈ 98.51% 三个"还不错"的服务串联起来,整体可用性直接跌破 99%。年停机从单服务的 43.8 小时暴涨到 128 小时——超过 5 天。 反过来想:如果链路有 10 个服务,每个要达到整体 99.9% 的可用性,单个服务的可用性得是多少? 0.999^(1/10) ≈ 0.99990 → 99.99% 十个服务每个都得做到四个九。这就是为什么微服务架构下可用性提升的难度呈指数级增长。 关键认知:提升可用性不是给单个服务加机器,而是同时做三件事——减少串联依赖数量、提高单个服务可用性、在关键路径上做冗余和降级。 Google SRE 团队在 The Calculus of Service Availability 中提到一个观点:大多数服务的内部目标应该定在 99....