2 分钟,搞懂 SLO 最佳实践

本文是关于《SRE,Google运维解密》的读书笔记,重点讨论SLI(服务质量指标)、SLO(服务质量目标)和SLA(服务质量协议)。SRE负责协助确定SLI,但不涉及SLA的构建。SLI应关注用户体验相关的少数关键指标,如可用性、延迟和吞吐量。SLO的设定应具有挑战性但不过高,确保服务可靠性的同时允许适当故障发生。大部分公司在建立稳定性体系时,常忽视业务指标监控和SLO的监控。

本文是《SRE,Google运维解密》读书笔记,连载第三篇。微信公众号修改了推文逻辑,尤其是 iOS,建议对本公众号 SRETalk 加星标,以免错过后续系列推文。

本文介绍 SLO,曾经我发过一个短时间讲解我们做监控最应该监控的是什么,短视频讲了上篇,这篇算是下篇。当时的短视频可以在这里查阅:

SLI、SLO、SLA

先拎清楚几个概念:

  • SLI:服务质量指标,比如 99 分位的响应时间、99 分位的响应时间、错误率等
  • SLO:服务质量目标,所谓的几个 9 的目标,比如 99 分位的响应时间小于 200 毫秒,比如错误率小于 0.1%
  • SLA:服务质量协议,是个承诺,是个合同,比如公有云就会提供 SLA,不达标就会有赔付

SRE 在制定 SLx 时的职责

SRE 不参与构建 SLA,因为这通常涉及退款赔付之类的,是个商业行为,但是 SRE 要帮助业务确立 SLI,帮助业务达成 SLO。

SLI 相关的一些实践

首先,千万不要把能监控到的一坨指标都确立为 SLI,SLI 一般也就是四五个,再多就有问题了。不同的服务的 SLI 举例:

  • 用户可见的服务系统:可用性、延迟、吞吐。即:是否能正常处理请求?每个请求花费的时间是多少?多少请求可以被处理?
  • 存储系统:延迟、可用性、数据持久性。即:读写数据需要多少时间?我们是否可以随时访问数据?一段时间之后数据是否还能被读取?
  • 大数据系统:比如数据处理流水线系统,关注吞吐量和端到端延迟。即:处理了多少数据?数据从进来到产出需要多少时间?
  • 所有系统都应该关注:正确性。比如是否返回了正确的结果?当然,正确性更关注系统内部的数据而非系统本身,所以SRE通常不会关注这块。

总结:SLI 应该是一些上层业务或用户关注的体验指标,这些指标如果出问题了,一定是服务出了大问题了。

另外,一般 SLI 都是分钟级的汇总,比如成功率是每分钟产出一个值,延迟也是,延迟尽量不要用平均延迟和50分位,会掩盖一些长尾问题,比如下图:

50th, 85th, 95th, and 99th percentile latencies for a system. Note that the Y-axis has a logarithmic scale.

从 10:30 开始,长尾请求的延迟变得频繁了,尤其是 99 分位和 95 分位,但是 50 分位的值,几乎不变,如果我们只关注 50 分位的值,就没法发现这个问题了!

定义 SLO 的一些建议

实际制定 SLO 的时候,对内对外通常是两个值,对内更严格,对外更宽松。而且,即使有能力达成 SLO,也不要做的过高,适当的搞挂一下非常有必要。比如某个服务当前季度(SLO 一般按季度统计)的 SLO 是 99.95%,季度末了,100% 可用,此时建议做个放火演练之类的,即使搞出纰漏,对 SLO 的影响也不会太大。其次,上层业务也会充分认识到你这个下游服务不是 100% 可靠的,会有针对性的增强冗余设计。

大部分公司都做错了

大部分公司的稳定性体系都是从指标监控开始的,这个没问题,但是完成了机器、中间件的监控就认为基本完活了,就是大错特错。实际还有两个东西必须要做好监控,一个是短视频里提到的业务北极星指标的监控,另一个是本文提到的 SLO 的监控。

扩展阅读

### 服务等级目标(SLO)的定义与实现最佳实践 服务等级目标(Service Level Objective, SLO)是服务提供方与客户之间就服务可用性、性能、可靠性等方面达成的具体目标。SLO 是 SLA(Service Level Agreement)的核心组成部分,用于衡量服务是否满足预定的运行标准。定义和实现 SLO 的关键在于选择合适的指标、设定合理的阈值,并建立持续监控与反馈机制。 #### 1. SLO 指标的选取 选择 SLO 指标时,应基于服务的核心功能和用户期望。常见的 SLO 指标包括: - **可用性(Availability)**:服务在规定时间内可正常访问的比例,通常以百分比表示,如 99.9% 可用性。 - **延迟(Latency)**:请求从发出到收到响应的时间,常用 P50、P90、P99 等统计指标来衡量。 - **吞吐量(Throughput)**:单位时间内系统处理的请求数量。 - **错误率(Error Rate)**:请求失败的比例,常用于衡量服务的稳定性。 - **响应时间(Response Time)**:从请求发起至服务完成的时间,是衡量用户体验的重要指标[^1]。 #### 2. SLO 目标值的设定 SLO 的目标值应基于历史数据、业务需求和用户预期设定。设定过程中应考虑以下因素: - **用户容忍度**:不同业务场景对延迟、可用性的容忍度不同,例如金融交易系统对可用性要求极高,而内容分发系统可能对延迟容忍度较高。 - **系统能力**:根据系统当前的处理能力设定可实现的目标,避免设定过高导致频繁违反 SLA。 - **历史性能数据**:通过分析历史监控数据设定合理的 SLO 上限,例如使用 P90 延迟作为目标值,确保 90% 的用户请求在可接受时间内完成[^1]。 #### 3. SLO 的实现与监控 实现 SLO 的关键在于建立完善的监控体系和自动化反馈机制,具体包括: - **部署监控系统**:使用 Prometheus、Grafana、Datadog、OpenTelemetry 等工具实时采集指标数据。 - **设置告警规则**:当指标接近或超过 SLO 阈值时,及时触发告警通知相关人员。 - **日志与追踪系统**:结合 ELK(Elasticsearch、Logstash、Kibana)或 Jaeger 等工具进行日志分析和请求追踪,辅助定位性能瓶颈。 - **自动化修复机制**:通过自愈系统或自动扩缩容策略减少服务中断时间,提升可用性[^1]。 #### 4. SLO 与 SLI、SLA 的关系 SLO 是基于 SLI(Service Level Indicator)定义的目标值,而 SLA 则是基于 SLO 形成的正式协议。例如,SLI 可以是“每分钟请求延迟的 P90”,SLO 可以设定为“P90 延迟不超过 200ms”,而 SLA 则可能规定“若 P90 延迟超过 200ms 达 1 小时,客户可获得 5% 的服务费用减免”[^1]。 #### 5. 示例:定义和监控 SLO 的代码实现 以下是一个使用 Prometheus 和 PromQL 查询 P90 延迟并设置告警的示例配置: ```yaml groups: - name: latency-slo rules: - record: http_request_latency_p90 expr: histogram_quantile(0.9, sum(rate(http_request_latency_seconds_bucket[5m])) by (le)) - alert: HighRequestLatency expr: http_request_latency_p90 > 0.2 for: 5m labels: severity: warning annotations: summary: "High latency on {{ $labels.instance }}" description: "P90 latency is above 200ms (current value: {{ $value }}ms)" ``` 该配置定义了一个记录规则来计算 P90 延迟,并在延迟超过 200ms 且持续 5 分钟时触发告警[^1]。 #### 6. SLO 的持续优化 SLO 不是一成不变的,应根据业务发展、用户反馈和技术演进进行动态调整。建议定期进行 SLO 回顾会议,分析是否达成目标、是否存在长尾请求、是否需要调整阈值等。此外,采用错误预算(Error Budget)机制可以更灵活地管理服务稳定性,允许在一定范围内容忍失败,从而支持快速迭代与创新[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜莺开源监控

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值