3. SLA 计算公式与模型:可用性计算公式、月度/年度 SLA 计算、复合 SLA 模型

聊完了 SLA 的定义和监控指标,咱们得动真格的了——怎么算?

说实话,我见过不少团队,SLA 写得天花乱坠,一到算账的时候就懵了。要么公式用错,要么时间窗口没对齐,最后跟业务方扯皮扯到天亮。这一章,咱们就把计算这件事彻底掰扯清楚。

3.1 可用性计算公式:别小看这个除法

可用性的核心公式,说白了就一个除法:

可用性 = (总时间 - 不可用时间) / 总时间 × 100%

举个例子:一个月 30 天,总共 43200 分钟。你的服务宕了 43.2 分钟,那可用性就是 (43200 - 43.2) / 43200 × 100% = 99.9%。

嗯,这里有个坑——“不可用时间”怎么定义?

我个人习惯把“不可用”分成两类:

  • 完全不可用:用户完全访问不了,比如 5xx 错误持续超过阈值
  • 部分不可用:响应变慢、功能降级,但还能用

我在项目中遇到过,业务方非要把部分不可用也算成完全不可用,结果可用性直接掉到 99% 以下。后来我们约定:响应时间超过 3 秒算 0.5 倍不可用时间,超过 10 秒算 1 倍。这样双方都能接受。

我的建议: 在 SLA 文档里明确写明“不可用”的判定标准,包括采样粒度(比如 1 分钟还是 5 分钟)、错误码范围、响应时间阈值。否则,公式再对也没用。

3.2 月度与年度 SLA 计算:时间窗口的陷阱

月度 SLA 和年度 SLA,用的公式一样,但时间窗口不同,结果可能差很多。

月度 SLA 计算:

月度可用性 = (当月总分钟数 - 当月不可用分钟数) / 当月总分钟数 × 100%

注意,每个月的总分钟数不一样。1 月是 44640 分钟,2 月平年只有 40320 分钟。同样的 43.2 分钟宕机,在 2 月算出来是 99.89%,在 1 月是 99.90%。

年度 SLA 计算:

年度可用性 = (全年总分钟数 - 全年不可用分钟数) / 全年总分钟数 × 100%

全年总分钟数 = 365 × 24 × 60 = 525600 分钟(闰年 527040 分钟)。

这里有个常见的误区:有人把 12 个月的月度可用性直接平均,当成年度可用性。 这是错的!

为什么?因为每个月的总时间不一样,加权平均才对。正确的做法是:把全年的不可用时间加起来,除以全年的总时间。

时间窗口 总分钟数 99.9% 允许宕机 99.99% 允许宕机
1 天 1440 1.44 分钟 8.64 秒
1 月(30 天) 43200 43.2 分钟 4.32 分钟
1 年(365 天) 525600 8.76 小时 52.56 分钟
我曾经踩过的坑: 有次做年度 SLA 报告,我直接用 12 个月的可用性求平均,结果算出来是 99.95%。后来审计发现,实际全年可用性只有 99.91%。原因就是 2 月宕机时间占比更高,平均法把权重搞丢了。从那以后,我坚持用“总不可用时间 / 总时间”这个原始公式。

3.3 复合 SLA 模型:链式服务的噩梦

单个服务的 SLA 好算,但现实中的系统往往是链式的——用户请求经过网关、认证、业务逻辑、数据库、缓存……任何一个环节出问题,整个请求就挂了。

复合 SLA 的核心公式:

SLA_总 = SLA_1 × SLA_2 × SLA_3 × ... × SLA_n

举个例子:你的系统有 4 个服务,每个都是 99.9% 可用性:

SLA_总 = 0.999 × 0.999 × 0.999 × 0.999 = 0.996 = 99.6%

你看,4 个 99.9% 串起来,直接掉到 99.6%。年度宕机时间从 8.76 小时变成了 35 小时——多了 4 倍!

这就是为什么我常说:别只看单个服务的 SLA,要看端到端的 SLA。

我在项目中遇到过,业务方承诺客户 99.99% 的可用性,结果后端有 6 个服务串在一起,每个都是 99.99%。算下来总可用性只有 99.94%,根本达不到承诺。最后只能加钱上冗余,或者拆成并行架构。

复合 SLA 的两种模型:
  • 串联模型: 所有服务必须都可用,整体才可用。公式是乘法,结果比任何一个单点都低。
  • 并联模型: 只要有一个服务可用,整体就可用(比如多活部署)。公式是 1 - (1 - SLA_1) × (1 - SLA_2) × ...,结果比任何一个单点都高。

实际系统中,往往是串并联混合。比如:

  • 网关层是并联(多活)
  • 业务逻辑层是串联(必须经过认证、订单、支付)
  • 数据层是并联(主从切换)

算的时候,先算并联组的等效 SLA,再算串联组的等效 SLA,一层层往上推。

我的经验: 设计系统时,尽量把关键路径上的服务数控制在 3 个以内。超过 3 个,就算每个都是 99.99%,整体也会掉到 99.97% 以下。如果必须超过 3 个,考虑用异步、缓存、降级来减少串联依赖。

3.4 复合 SLA 计算示例:一个真实场景

假设一个电商系统的核心链路:

  1. 负载均衡(并联双活,每个 99.99%)
  2. API 网关(单点,99.95%)
  3. 认证服务(单点,99.99%)
  4. 订单服务(单点,99.99%)
  5. 数据库(主从切换,并联,主 99.99%,从 99.95%)

第一步:算并联组

负载均衡等效 SLA = 1 - (1 - 0.9999) × (1 - 0.9999) = 1 - 0.0001 × 0.0001 = 0.99999999 ≈ 99.999999%
数据库等效 SLA = 1 - (1 - 0.9999) × (1 - 0.9995) = 1 - 0.0001 × 0.0005 = 0.99999995 ≈ 99.999995%

第二步:算串联组

总 SLA = 0.99999999 × 0.9995 × 0.9999 × 0.9999 × 0.99999995
       ≈ 0.9993 = 99.93%

你看,即使负载均衡和数据库做了高可用,网关的 99.95% 还是把整体拉到了 99.93%。年度宕机时间约 6.13 小时。

这就是复合 SLA 的残酷现实——短板效应非常明显。想提升整体可用性,先盯着最弱的那个环节。

复合 SLA 计算流程(串联 + 并联混合模型) LB 主 (99.99%) LB 备 (99.99%) 并联 → 99.999999% API 网关 (99.95%) 认证 (99.99%) 订单 (99.99%) DB 主 (99.99%) DB 从 (99.95%) 并联 → 99.999995% 总 SLA = 99.93% 年度宕机约 6.13 小时 短板:API 网关 99.95% 提升网关可用性可显著改善整体

3.5 避坑指南:计算 SLA 时常见的 5 个错误

  1. 忽略维护窗口:计划内维护算不算不可用?我建议在 SLA 里明确写清楚,比如“计划内维护提前 72 小时通知,不计入不可用时间”。
  2. 采样粒度太粗:用 5 分钟粒度采样,可能漏掉 30 秒的短暂故障。我个人习惯用 1 分钟粒度,关键服务用 10 秒。
  3. 把平均值当承诺:99.9% 是下限,不是平均值。你承诺 99.9%,就得保证每个月都达到,而不是年底平均一下。
  4. 忽略复合效应:前面讲过了,串联服务越多,整体 SLA 越低。设计架构时就要算清楚。
  5. 不区分全局与局部:某个地域的故障算不算全局不可用?建议按地域分维度计算,别混在一起。
我曾经犯过的错: 有次做 SLA 报告,我把所有地域的故障时间加在一起算全局可用性,结果算出来 99.99%。实际上,每个地域的用户体验都受到了影响,只是不同时间不同地点。后来我改成按地域分别计算,再取最小值作为全局 SLA——这样更真实。