4. 聚合粒度与精度:粗粒度聚合(全局SLI)与细粒度聚合(实例级SLI)的精度对比,粒度选择原则

聚合粒度是影响SLI口径精度的核心变量。同一份原始指标数据,在不同粒度上聚合会得到截然不同的可用性结论。粗粒度聚合(全局SLI)计算简单、成本低,但会掩盖局部故障;细粒度聚合(实例级SLI)能真实反映每个单元的可用性,但存储和计算开销显著上升。本节从精度对比和选择原则两个维度展开。

4.1 粗粒度聚合 vs 细粒度聚合:精度对比

以下表格从六个关键维度对比两种聚合策略的差异:

对比维度 粗粒度聚合(全局SLI) 细粒度聚合(实例级SLI)
聚合单元 整个服务/集群的总请求与总错误 每个实例/分片/容器的独立请求与错误
精度表现 低——局部故障被全局总量稀释 高——每个单元的可用性独立计算
故障掩盖风险 高——1%实例故障可能被99%正常流量淹没 低——每个实例的故障都会被独立捕获
存储开销 低——只需存储1条时间序列 高——需存储N条时间序列(N=实例数)
计算复杂度 低——单次聚合即可完成 高——需逐实例计算后再二次聚合
告警灵敏度 迟钝——需大量实例故障才能触发阈值 灵敏——单实例故障即可触发告警
关键发现: 粗粒度聚合的精度损失并非线性,而是与流量分布不均程度正相关。当少数实例承载大部分流量时,粗粒度SLI会严重高估整体可用性。

4.2 精度损失的本质:流量加权偏差

粗粒度聚合的本质是流量加权平均。假设服务有3个实例,其可用性与流量分布如下:

  • 实例A: 可用性 99.9%,承载 80% 流量
  • 实例B: 可用性 50.0%,承载 10% 流量
  • 实例C: 可用性 0.0%,承载 10% 流量

粗粒度计算: (0.999×0.8 + 0.5×0.1 + 0.0×0.1) = 0.8492 → 全局SLI = 84.92%

细粒度计算: 实例级可用性分别为 99.9%、50.0%、0.0%,取最小值或P50 → 真实可用性远低于84.92%

粗粒度SLI将两个完全不可用的实例(B和C)的故障,通过流量权重“稀释”到了看似可接受的84.92%。而细粒度聚合能直接暴露B和C的严重故障。

粗粒度 vs 细粒度聚合精度对比 粗粒度聚合(全局SLI) 总请求:10000 | 总错误:1500 全局SLI = (10000-1500)/10000 = 85% 故障被流量权重稀释 ⚠ 实例B/C完全不可用,但全局SLI仍显示85% 细粒度聚合(实例级SLI) 实例A:可用性 99.9% ✅ 实例B:可用性 50.0% ❌ 实例C:可用性 0.0% ❌ 聚合结果:2/3实例故障 ✅ 真实反映每个实例的健康状态

4.3 粒度选择原则

聚合粒度的选择不是非此即彼,而是基于业务场景、成本预算和精度需求的权衡。以下为经过生产验证的粒度选择原则:

  1. 最小可用单元原则: 聚合粒度应至少细化到故障隔离的最小单元(如Pod、VM实例、分片)。如果故障隔离单元是实例,就不应只聚合到集群级别。
  2. 流量分布感知原则: 当实例间流量分布不均(如20%实例承载80%流量)时,必须使用细粒度聚合,否则粗粒度SLI会严重失真。
  3. 成本分层原则: 核心服务使用细粒度聚合(实例级),非核心服务或内部工具服务可使用粗粒度聚合(集群级),以控制存储成本。
  4. 告警与报表分离原则: 告警使用细粒度聚合(快速发现单点故障),报表/月报使用粗粒度聚合(展示整体趋势)。
  5. 动态调整原则: 在故障注入演练或大促压测期间,临时提升聚合粒度(从集群级切换到实例级),结束后恢复。
实践建议: 推荐采用“双轨制”——同时保留粗粒度SLI用于仪表盘概览,和细粒度SLI用于告警与根因分析。两者存储成本差异可通过调整保留周期来平衡(细粒度保留7天,粗粒度保留90天)。

4.4 粒度选择决策矩阵

以下矩阵帮助团队根据实际场景快速选择聚合粒度:

场景特征 推荐粒度 理由
实例数 < 10,流量均匀分布 粗粒度(全局) 精度损失可接受,成本最低
实例数 > 50,流量分布不均 细粒度(实例级) 避免流量加权偏差掩盖故障
核心交易链路 细粒度(实例级) 任何单点故障都必须被立即发现
内部工具/非关键服务 粗粒度(全局) 成本优先,容忍一定精度损失
大促/压测期间 细粒度(实例级) 需要实时感知每个实例的健康状态
月度SLA报表 粗粒度(全局) 报表关注整体趋势,无需实例级细节
避坑提醒: 不要在所有场景下无脑使用细粒度聚合。当实例数超过1000时,实例级SLI的存储成本会呈线性爆炸,且告警风暴风险剧增。此时应引入“分片聚合”或“代表性采样”作为中间方案。

4.5 中间方案:分片聚合与分层聚合

当实例规模极大时,纯粗粒度或纯细粒度都不理想。以下两种中间方案在实践中被广泛采用:

  • 分片聚合: 将实例按逻辑分组(如可用区、机房、服务版本),在每个分片内做细粒度聚合,分片间做粗粒度聚合。既保留了局部可见性,又控制了时间序列总数。
  • 分层聚合: 构建三层SLI体系——实例级(7天保留)→ 分片级(30天保留)→ 全局级(90天保留)。上层聚合下层数据,逐层降采样,兼顾精度与成本。
分层聚合架构:兼顾精度与成本 全局SLI(90天) 分片A SLI(30天) 分片B SLI(30天) 分片C SLI(30天) 实例1(7天) 实例2(7天) 实例3(7天) 实例4(7天) 实例5(7天) 实例6(7天) 逐层聚合:实例级 → 分片级 → 全局级,保留周期逐层延长 细粒度用于告警,粗粒度用于报表,中间层用于容量规划

4.6 粒度选择的量化评估方法

在决定聚合粒度前,建议通过以下量化指标进行评估:

  • 精度损失率(ALR): ALR = |粗粒度SLI - 细粒度SLI| / 细粒度SLI。当ALR > 5%时,必须使用细粒度聚合。
  • 故障检测延迟(FDD): 从故障发生到SLI阈值被触发的时间差。细粒度聚合的FDD通常比粗粒度快3-10倍。
  • 时间序列膨胀系数(TSC): TSC = 细粒度时间序列数 / 粗粒度时间序列数。当TSC > 100时,需引入分片聚合作为中间方案。
总结: 聚合粒度的选择本质是“精度-成本-复杂度”三角的平衡。核心原则是:告警用细粒度,报表用粗粒度,中间层用分片聚合。没有正确的粒度,只有最适合当前业务规模和SLO要求的粒度。