第五章:错误预算

引言

本章将深入探讨错误预算这一站点可靠性工程(SRE)理论的重要组成部分。如果你曾思考过谷歌、Netflix或其他大型科技公司如何在快速交付的同时,兼顾创新与稳定性,本章将为你提供一些有益的启发。

在我们这个快节奏的世界里,用户期望服务全天候可用,企业常常在快速开发新想法与确保系统稳定之间左右为难。找到这种微妙的平衡点无异于一项艰巨的任务,尤其是在系统可能发生降级或停机的现实情况下。错误预算的概念正是在此背景下应运而生。

错误预算是一种衡量系统稳定性的方法,其衡量结果可用于制定关于添加功能、改进系统以及处理技术债务的决策。本质上,它平衡了可靠性与变更速度之间的关系,允许出现一定数量尚可接受的错误或停机时间。它在服务等级目标(SLO)框架内定义了可接受的服务错误或中断水平,并通过量化在违反SLO之前可以牺牲多少可靠性,作为应对意外事件的阈值。监控错误预算有助于团队有效响应突发事件,确保服务质量始终保持在可接受的范围内。

在本章中,我们将深入剖析错误预算的概念,探究其运作原理及成功原因。我们将讨论错误预算的定义、描述方式及计算方法。同时,我们还将审视服务等级目标(SLO)服务等级指标(SLI)与错误预算之间如何协同工作。本章还将展示真实案例,说明不同组织如何在其SRE计划中成功运用这一概念。最后,你将看到错误预算如何将抽象的可靠性概念转化为系统创建和维护过程中具体、可管理的组成部分。

本章结构

本章将涵盖以下主题:

  • 错误预算的目的
  • 定义错误预算
  • 错误预算方程
  • 将开发置于最终用户体验之上
  • 错误预算与SLI和SLO的关系
  • 设定正确错误预算的益处
  • 故障策略
  • 超出预算时的应对措施
  • 获取正确错误预算的最佳实践

目标

错误预算的主要目标是在组织内部为系统可靠性建立共识和共担责任。它提供了一种清晰、可衡量的方式来评估系统变更的影响,并鼓励团队优先考虑可靠性改进。

错误预算还作为平衡可靠性与创新这两个相互竞争需求的工具。通过为可接受的停机或错误设定预算,团队可以做出关于资源分配和改进优先级的明智决策。这有助于确保系统在保持可靠的同时,也能快速开发和部署新功能。

错误预算的另一个重要目标是改善组织内部的沟通与透明度。团队可以利用错误预算向利益相关方传达系统状态,并定期通报在改进可靠性方面取得的进展。这有助于确保每个人都清楚了解系统的性能表现以及为改善它而采取的措施。

错误预算的目的

在SRE中,错误预算的目的是设定系统可靠性的期望值,并为平衡可靠性与创新之间的权衡提供框架。在SRE中,错误预算用于定义系统可接受的停机或错误水平,并确定可靠性改进的优先级。

错误预算是一种衡量和管理风险的方法。通过为可接受的停机或错误分配预算,SRE团队可以就资源分配和改进优先级做出明智决策。这有助于确保系统在保持可靠的同时,也能快速开发和部署新功能。

SRE中错误预算的另一个目的是改善组织内部的沟通与透明度。团队可以利用错误预算向利益相关方传达系统状态,并定期通报在改进可靠性方面取得的进展。这有助于确保每个人都清楚了解系统的性能表现以及为改善它而采取的措施。简而言之,SRE中的错误预算提供了一个平衡可靠性与创新的框架,增强了沟通与透明度,并为系统可靠性建立了共识和共担责任。请参考下图:

图 5.1:错误预算公式

定义错误预算

错误预算通常由SRE团队定义。在SRE中,错误预算用于设定系统可靠性期望值,并为平衡可靠性与创新的权衡提供框架。

这是SRE团队与组织内负责系统设计、开发和维护的其他团队之间的共同责任。SRE团队与其他团队协作,定义系统可接受的停机或错误水平,并将错误预算分配到系统的不同组件中。

在一些组织中,错误预算可能由一个负责确保系统可靠性的中央团队定义和管理。在其他组织中,错误预算可能下放给负责特定系统组件的各个团队进行管理。

可接受的错误预算水平可能因系统类型、功能关键性以及用户期望的不同而有很大差异。例如,提供紧急服务的系统可能比提供非关键服务的系统拥有更低的错误预算。通常,可接受的错误预算基于所需的系统可靠性水平、可用于可靠性改进的资源,以及停机或错误对系统用户的潜在影响来定义。

SRE团队利用数据和分析来确定可接受的错误预算水平,并将其分配到系统的不同组件。随着时间的推移,错误预算可能会根据系统需求或性能变化进行调整。

以下是一些错误预算的示例:

  • 99.99% 正常运行时间:此错误预算每年最多允许 52.56 分钟的停机时间。这种可靠性水平通常用于对业务运营至关重要的系统,例如金融系统或电子商务网站。
  • 99.95% 正常运行时间:此错误预算每年最多允许 4.38 小时的停机时间。这种可靠性水平通常用于重要但不关键的系统,例如邮件服务器或内容管理系统。
  • 99.0% 正常运行时间:此错误预算每年允许 87.6 小时的停机时间。这种可靠性水平通常用于不那么关键的系统,例如信息性网站或内部工具。
  • 自定义错误预算:此错误预算根据系统的特定要求和约束量身定制,可以设定在任何适当的可靠性水平。例如,自定义错误预算可能允许每周一定的停机时间或每天一定数量的错误。

在每个示例中,错误预算都提供了一种清晰、可衡量的方式来设定系统可靠性期望值并确定可靠性改进的优先级。实际的停机或错误水平可能因多种因素而异,包括系统的大小和复杂性、可用于可靠性改进的资源,以及停机或错误对系统用户的潜在影响。正如SentinelOne博客所解释的那样,100% 的正常运行时间是任何公司都无法兑现的承诺。因此,你需要设定一个允许系统出故障的时间长度。

在下图中,有对错误预算及其常用术语含义的参考。我们通过举例尽量使表述更容易理解。请参考下图:

图 5.2:错误预算参考

这与家庭预算的原则相同。如果我们手头有闲钱,可能会把它用于增加功能;如果没有,我们就必须缩减对新想法的投资。

关注错误预算消耗率与管理超支资金同样有用。理解消耗率对于管理服务的可靠性以及就如何改进系统或添加新功能做出明智选择至关重要。以下公式提供了一种计算这一重要可衡量比率的方法。请参考下图:

图 5.3:计算错误消耗率的公式

如果错误预算大于1,那么我们知道预算消耗速度超出了应有水平。我们可能会陷入债务状态,并推迟新功能计划,此时的想法是修复现有功能并使系统变得可靠。错误预算方程可以帮助我们理解如何减少不可用性并提高可用性;请参考下图:

图 5.4:错误预算

例如,如果可用性目标 SLO 为 99.95%(或

5. 错误预算

本章定义了错误预算的概念、公式、与SLO的关系及超出预算的应对措施。

0.0005) 错误预算的计算如下:

错误预算 = 1 - 0.9995 = 0.0005

这意味着服务可以有不高于 0.05% 的时间不可用,而不会违反 SLO。根据所考虑的时间框架,这可以转换为特定数量的可接受停机分钟数或小时数。

错误预算公式

追踪错误预算促进了可靠性与创新速度之间的平衡,使你能够就系统变更做出明智的决策:当错误预算充裕时,可以采取更具风险的行动;当错误预算耗尽时,则应谨慎行事。服务水平协议 (SLA) 规范定义了错误预算。如果你的 SLA 保证 99.99% 的可用性,则你的错误预算为 0.01%。它表示在不违反 SLA 的前提下允许的停机时间或缺陷量。其计算方式为:从合同规定的 SLA 中减去实际系统正常运行时间。请参考下图:

图 5.5:错误预算公式

在进一步讨论之前,让我们先了解以下术语:

  • 检测时间 (TTD):从用户受到问题影响到有人被告知该问题所花费的时间。
  • 解决时间 (TTR):从有人被告知问题到问题被解决所花费的时间。
  • 故障时间 / 平均故障间隔时间 (TTF):特定故障的发生频率。当这些指标前面加上字母 M(即平均时间)时,它们是取平均值的,也称为 平均故障时间 等。

保持错误预算值较低对于维持可控的错误预算至关重要。这可以通过调节几个变量来实现。详见下文:

  • 降低 TTD
    • 通过监控和告警更快地发现停机。
  • 降低 TTR
    • 借助良好的开发人员 运维手册 来加快故障排查。
    • 改善用于故障处理的日志。
    • 添加 追踪
    • 通过重定向流量或备份等方式,实现故障转移的自动化。
  • 降低影响范围
  • 增加 TTF
    • 分析并理解故障原因。
    • 执行主动维护工作。

优先开发而非最终用户体验

大多数人可能觉得,“我们能承受多大的不可靠性?”是一个奇怪的问题。然而,这句话恰恰是业务每个方面的关键。一个盈利的企业旨在以低成本、低风险的方式为客户提供他们想要的服务水平。这个方程中很大一部分在于询问不可靠性。尽管如此,仍然有可能觉得这是一个偷懒的问题。我们从小就被教导要尽力做到最好。我们想要一切:质量、效率、速度和性能。卓越意味着超越预期。它意味着一以贯之地反复做到这一点,这就是我们将要提到的“卓越边缘”。它也讨论了最终用户能承受多大的不可靠性,以及如何衡量性能。最重要的决策是,开发团队应该在何时、以何种程度优先考虑应用程序的可靠性和性能,而不是最终用户体验、功能或其他业务目标。

错误预算为这类决策提供了一种可衡量的方式。持续未能达成 SLO 的团队应该投入更多精力来提高应用程序的可靠性。同时,当提高可靠性的投资导致未来更少的错误时,敏捷的 DevOps 团队可以证明主动可靠性改进是值得的。错误预算还可以帮助 DevOps 团队更高效地利用时间。接近违反 SLO 的团队可能会选择优先响应事件、处理升级的支持工单或修复错误。相反,远低于其错误预算的团队可能不会追求完美,而是通过完成冲刺、发布和功能部署来保持在战略路径上。

让 DevOps 团队拥有更大的权力来决定优先处理哪些运维问题,这似乎有悖常理,但追求完美的代价是昂贵的。因此,IT 领导者应制定一项 SLO 策略,以帮助团队了解当错误预算不足或 SLO 面临风险时该怎么做。领导者还可以决定团队如何花费其错误预算,或在未达到 SLO 时建议采取的行动。

SLO 既影响开发也影响运维,它们还可以使质量保证的角色更加关键。当生产缺陷导致错误时,这表明应增加测试自动化,并应重新调整 SLO。

错误预算与 SLI 和 SLO 的关系

回顾本章之前讨论的错误预算定义。错误预算定义了系统允许的停机时间或错误水平,并提供了一个框架来平衡可靠性与创新之间的权衡。错误预算帮助 SRE 团队管理风险并优先处理可靠性改进。

为了更好地理解 SLI 和 SLO 之间的联系,我们将回顾它们各自的含义如下:

  • SLI 是用于监控系统性能并追踪实现错误预算进度的具体且可衡量的指标。SLI 可以包括响应时间、错误率或可用性指标。
  • SLO 是基于系统可靠性定义的系统可靠性目标,同时代表了系统期望的性能水平,并用于向利益相关者传达系统状态。例如,一个 SLO 可能规定系统必须达到 99.95% 的可用性,该指标通过正常运行时间的 SLI 来衡量。

设定适当错误预算的益处

错误预算的主要优势在于,它为产品开发和 SRE 提供了一个共同的目标,即专注于寻找创新与可靠性之间的正确平衡。如果系统的 SLO 达成,则多个产品的发布可以继续进行。假设 SLO 违规频繁到耗尽错误预算,那么发布将暂时停止,并将额外资源投入到系统测试和开发中,以使系统更具弹性、提高性能等等。

之前已经多次提到过。所有非绝对必要的发布都已暂停,因为我们超出了错误预算。如果产品开发部门不顾 SRE 的意愿决定减少测试或加快推送速度,那么错误预算将作为一个决定性因素。当预算充裕时,产品开发人员有更大的试验自由。当资源紧张时,产品开发人员通常会请求额外时间用于测试或降低推送速度。他们无法在预算或发布日期上冒任何风险。从某种意义上说,产品开发团队变成了自我监管的,他们了解预算,并能管理自身的风险。为了达到这个结果,SRE 团队必须有权在发生 SLO 违规时阻止发布。在确定错误预算时,SRE 团队会考虑停机策略。以下是错误预算的诸多好处中的一部分:

图 5.6:错误预算的好处

停机策略

这是一套用于管理和响应系统停机的指南和程序。它们是更广泛的可靠性策略的一部分,旨在确保停机得到一致且有效的处理。

停机策略通常包括以下要素:

  • 角色与职责:定义了参与响应停机的不同团队和个人的角色与职责,例如应急响应团队、系统管理员和沟通团队。
  • 沟通计划:包括一个沟通计划,概述了有关停机信息将如何传达给利益相关者,包括客户、合作伙伴和员工。
  • 响应程序:涉及概述了为减轻停机影响而必须采取的步骤的响应程序,例如识别根本原因、恢复服务以及记录停机事件。
  • 升级计划:包括一个升级计划,概述了如果在定义的响应程序内无法解决问题,事件将如何升级。
  • 停机后审查:包含一个停机后审查流程,用于评估对停机的响应并识别改进机会。

超出错误预算时的行动项

如果超出了错误预算,必须采取行动解决问题,并确保系统以最高水平的可靠性运行。SRE 团队应从系统性地解决问题,包括投资于可靠性改进、重新评估错误预算、与利益相关者沟通、实施危机管理计划,以及审查流程和程序。让我们将其分解为不同的部分,并尝试从基础层面理解:

  • 投资于可靠性改进:这可能表明系统的可靠性不足,需要投入更多资源。这可以包括修复错误、提高系统性能以及升级硬件。
  • 重新评估错误预算:可能有必要重新评估错误预算,并调整系统可靠性的目标和指标。这可能涉及设定一个更现实的、反映系统当前状态的错误预算。
  • 与利益相关者沟通:必须与利益相关者(包括客户和员工)沟通,解释情况并提供有关为解决问题所采取的任何措施的最新信息。
  • 实施危机管理计划:如果系统正在经历重大停机,可能有必要实施危机管理计划,以确保局势迅速得到控制,并尽快将系统恢复到正常运行。
  • 审查流程和程序:可能需要审查流程和程序,以识别任何需要改进的领域,并确保系统的设计和运行能够最大限度地降低停机风险。

获取正确错误预算的最佳实践

设定错误预算需要结合技术理解和业务策略。以下是一些最佳实践,以确保你的错误预算恰到好处:

  • 设定清晰且可衡量的目标:错误预算应清晰且可量化,并针对系统可靠性设定具体目标。这有助于确保所有利益相关者都充分理解错误预算,并为做出关于系统可靠性的决策提供一个清晰框架。
  • 优先考虑可靠性改进:根据错误预算优先考虑可靠性改进并分配资源是一种良好做法。这有助于确保最重要的系统获得最高级别的可靠性。
  • 持续监控和追踪进度:应持续监控和追踪错误预算。这有助于确保错误预算保持最新且相关,并及时为所有创新做出必要的调整。
  • 考虑停机的潜在影响:在制定错误预算时,应考虑它们可能对用户和业务产生的影响。这有助于确保将错误预算设定在一个可靠的数值上,并使最重要的系统获得最多的关注。
  • 保持透明:必须清晰透明地向所有利益相关者(包括客户和员工)告知错误预算。这能确保每个人都了解系统可靠性的目标和期望,并能在资源分配和优先级排序方面做出明智的决策。
  • 持续审查和调整:定期评估和修订错误预算至关重要,要考虑到有关公司现状、客户需求和技术进步的新信息。错误预算和系统可靠性目标应随之调整。

结论

总之,错误预算的概念是 SRE 中最重要的部分之一。它以有用的方式连接了通常相互独立的开发与运维世界。它给出了一个可承受风险的具体数字,使每个人都清楚系统可接受的可信度水平。这创造了一种环境,可以在不影响系统稳定性的前提下安全地实现更快的开发和部署周期。错误预算帮助团队在创新和可靠性之间找到良好的平衡,将潜在的冲突点转化为合作机会。它们为系统变更的决策提供了框架:当预算充裕时允许冒险的举措,当预算紧张时则提醒大家谨慎行事。

然而,制定一个正确的错误预算并不容易。它需要与业务目标保持一致,了解用户的容忍度,使用正确的数据,并持续监控。此外,错误预算的设定和调整应当是一个持续的过程,随着系统、用户需求和业务目标的变化而变化。错误预算可以作为指南,但并非严格的规则。目标不是阻止所有错误发生,而是确保从错误中吸取最多的教训。这将激发创新,并确保良好的服务水准。错误预算是一种工具,用于为用户和企业创造最大价值。

在下一章中,我们将探讨系统可靠性的核心指标,以及它们如何帮助系统可持续运行。我们将学习如何将 SLI 描述为服务中可测量的部分,如何将 SLO 设定为这些 SLI 的目标,以及如何将 SLA 作为对客户的书面承诺进行沟通。该章还将讨论跟踪这些指标的方法,以及在需要满足这些指标时如何行动。此外,还将讨论这些指标在沟通、规划和决策中的重要性。

选择题

  1. 在 SRE 中,错误预算的目的是什么?
    a. 为系统升级分配财务资源
    b. 定义可接受的系统停机时间
    c. 衡量 SRE 团队的性能
    d. 跟踪用户可能犯的错误数量

  2. 错误预算通常如何计算?
    a. 通过估算错误导致的潜在财务损失
    b. 通过确定新功能可接受的风险水平
    c. 通过设定可接受的服务不可靠水平
    d. 通过开发环境中遇到的错误数量

  3. 谁负责管理错误预算?
    a. 财务部门
    b. 客户支持团队
    c. 网站可靠性工程团队
    d. 营销团队

  4. 超出错误预算的后果可能是什么?
    a. 公司将增加营销预算
    b. 新功能的开发可能会暂停以提高稳定性
    c. 错误预算将立即重置
    d. SRE 团队获得财务奖金

  5. 错误预算与功能发布之间的关系是什么?
    a. 错误预算限制仅在工作日发布功能
    b. 错误预算决定新功能的财务成本
    c. 错误预算用于平衡功能发布的速度与系统可靠性
    d. 它们没有关系;是独立的概念

答案

  1. b.
  2. c.
  3. a.
  4. b.
  5. c.

加入本书的 Discord 空间

加入本书的 Discord 工作区,获取最新更新、优惠、全球技术动态、新版本以及与作者的交流机会:
https://discord.bpbonline.com

5. 错误预算

图片上下文

[Image 2092 on Page 138]
[Image 2099 on Page 140]
[Image 2101 on Page 141]
[Image 2103 on Page 141]
[Image 2106 on Page 142]
[Image 2116 on Page 147]
[Image 600 on Page 153]