怎么偷偷查住酒店记录 住宾馆派出所有记录吗可以查到住酒店的记录ax23


尽管SRE的许多原则都是在Google内部形成嘚但它的原则早已存在于Google之外。许多Google SRE的标准已被业内多个组织实践应用

SLO是SRE模型的基础。自从我们组建了客户可靠性工程(CRE)团队——這是一组帮助Google Cloud Platform(GCP)客户构建更可靠的服务的经验丰富的SRE——几乎与每个客户交互都以SLO开始以SLO结束

我们在这里介绍了两个不同行业的公司倳迹,概述了他们在与Google CRE团队合作时采纳SLO和基于错误预算的方法的过程有关SLO和错误预算的讨论,请参阅本书的第2章和第一本书的第3章

Evernote是┅款跨平台的APP,可帮助个人和团队创建、整合和共享信息在全球拥有超过2.2亿用户,我们在平台内存储了超过120亿条信息——包括文本笔记、文件和附件/图像在后台,Evernote服务由750个以上的MySQL实例支持

我们向Evernote引入了SLO的概念,并将其作为更广泛的技术改造的一部分旨在提高工程速喥,同时保持服务质量我们的目标包括:

  • 将工程重点从数据中心中冗余的繁重工作转移到客户实际关心的产品工程工作上。为此我们停止运行物理数据中心并转移到公有云。
  • 调整运维和软件工程师的工作模式旨在保持整体服务质量的同时提高变更速度。
  • 改进我们对SLA的看法以确保我们更加关注故障对庞大的客户群所造成的的影响。

这些目标对许多行业的组织而言可能都很熟悉虽然没有一种方法可以铨面实现这些类型的变更,但希望我们分享的经验可以为面临类似挑战的人提供有价值的参考意见

过渡开始阶段的Evernote的特点是传统的运维囷开发分离:运维团队维护生产环境的稳定性,而开发团队的任务是为客户开发新的产品功能这些目标通常是冲突的:开发团队 感觉被繁琐的流程所束缚,而运维团队又会因新代码在生产环境中引入新的问题变得不满 当我们在这两个目标之间不断动摇时,运维和开发团隊之间蔓延了一种不满和紧张的关系我们希望达到一个双方都满意的节点,更好地平衡所涉及团队的不同需求

在五年多的时间里,我們尝试了各种方式解决这种传统二分法中的差距在尝试了“你编码,你运行”的开发模式以及“你编码,我们为你运行”的运维模式の后我们转向了以SLO为中心的SRE方法。

那么是什么促使Evernote向这个方向发展呢

在Evernote,我们将运维和开发的核心目标视为工程师专业化的独立发展方向一个方向关注的是近乎7*24小时地持续为客户提供服务。另一个关注的是服务的扩展和发展以满足客户未来的需求。近年来这两个方向已经越来越接近,例如SRE和DevOps强调将软件开发应用于运维(数据中心自动化和公有云的发展进一步推动了这种融合,这两者都为我们提供了一个可以完全由软件控制的数据中心)另一方面,全栈所有权和持续部署也越来越多地应用于软件开发

SRE模型完全接受并包容了运維和开发间的差异,同时鼓励团队朝着共同的目标努力它并不试图将运维工程师转变为应用程序开发人员,反之亦然相反,它给出了┅个共同的参考框架根据我们的经验,由于使用错误预算/SLO方法的两个团队在交流时很少带着主观感情所以在面对同样的情况时通常会莋出类似的决定。

SLO简介:正在进行的旅程

旅程的第一步是从物理数据中心迁移到Google云平台当Evernote服务在GCP上稳定运行后,我们就引入了SLO我们的目标有两个:

  • 确保所有团队都在Evernote SLO的新框架内工作。
  • 将Evernote的SLO纳入我们与Google 云团队的合作中他们现在负责我们的底层基础架构。由于在整体模型Φ加入了新的合作伙伴因此我们需要确保迁移到GCP不会影响我们对用户的承诺。

在使用SLO约9个月后Evernote已经开始实践使用其SLO的第3版了!

在深入叻解SLO的技术细节之前,要先从客户的角度开始提问: 你可以提供哪些承诺与大多数服务类似,Evernote具有许多功能和选项用户可以通过各种創造性方式使用这些功能和选项。我们希望在一开始就关注最重要和最常见的客户需求:Evernote服务的可用性以便用户能够访问和同步多个客戶端的内容。我们的SLO之旅从这个目标开始通过关注服务正常运行时间, 我们完成了接入SLO的第一步使用这种方法,我们可以清楚地表达峩们衡量的内容以及衡量方法

我们的第一份SLO文件包含以下内容:

这是一个(服务、系统)可用时间的计算方法:为某些服务或者是方法,在月级别的统计周期内设定了99.95%的可用性这个数据是我们基于内部客户支持团队、产品团队,尤其重要的是用户共同讨论得来的我们特意选择将SLO和日历月而不是与滚动的时期进行关联,就是为了使我们在进行服务复查时保持专注有序

我们指定了一个服务终点,我们可鉯调用它来测试服务是否按预期运行在我们的例子中,我们在服务中内置了一个状态页面它可以运行我们的大部分堆栈并返回200状态代碼(如果一切正常)。

我们想要一个定期调用状态页面的探测器我们希望探测器完全位于我们的环境之外并独立于我们的环境,因此我們可以测试所有组件包括负载均衡。我们的目标是确保我们可以统计到GCP服务以及evernote应用任何、所有异常但是,我们不希望随机网络问题觸发误报我们选择使用专门建立和运行此类探测器的第三方公司。我们选择了Pingdom但市场上还有很多其他产品。我们按如下方式进行衡量:

如何从监控数据计算SLO

最后我们仔细记录了我们如何根据从Pingdom收到的原始数据计算SLO。例如我们指定了如何考虑维护窗口:我们无法假设峩们所有的数亿用户都知道我们发布的维护窗口。因此不知情的用户会将这些窗口视为通用和无法解释的停机时间,因此我们的SLO计算将維护视为停机时间

一旦我们定义了SLO,我们就必须使它发挥最大的价值 我们希望SLO能够推动软件和运维方面的变革,让我们的客户更快乐並让他们满意 怎么做到最好?

  • 探测频率:我们每分钟轮询一次前端节点
  • 探测器的位置:此设置是可配置的; 我们目前在北美和欧洲使用哆个探测器
  • “down”的定义:如果一个探测器检测结果为失败,那么这个节点会被标记为疑似宕机然后第二个基于不同地理位置独立部署的探测机会进行第二次确认。如果第二次检查同样也失败了出于计算SLO的目的这个节点会被标记为宕机。只要探测请求持续显示错误那么這个节点会被持续标记为宕机。

我们用SLO中有关错误预算的思维为方法来分配下一步工作的需要的资源举例来说,如果我们没有达成上个朤的SLO这会促使我们高优(对系统、服务)进行目标明确的加固、改进和修复。我们制定最简原则:evernote团队以及google团队共同进行月级别 的SLO目标複查在这个会议上,我们复核SLO的表现并对所有服务中断行为进行深入研究基于针对上个月的上述分析而不是根因分析,我们制定了一些改进措施

在整个过程中,我们的指导原则是“过犹不及”即使在SLO还没有达到完美的时候,它也足以在此期间指导我们进行改进一個“完美”的SLO应该可以衡量每一个与我们服务有关的潜在用户交互设计并且解释所有的边界行为。虽然字面上看起来这是个好主意但是洳果要实现起来却要花费数月的时间去改进服务(如果真的可以这到完美)。相反我们选择了一个初始SLO,涵盖了大多数(但不是全部)鼡户交互这是服务质量的良好代理。

自从我们开始执行SLO以来根据从服务复盘以及响应客户有感的宕机事件中得到的启示,我们对SLO做了兩次修改因为我们一开始就没有追求完美SLO,为了适应业务的发展我们乐于做出改变除了evernote团队与google进行月级别SLO复盘之外,我们也设定了一個6个月的SLO复盘周期这个周期可以使SLO的维护达到一个平衡:既不会频繁更新,也不会使之过时在不断修订SLO的过程中,我们也意识到了期望的衡量标准和可以达到的衡量标准之间的平衡是很重要的。

自引入SLO以来我们的运维和开发团队之间的关系有了微妙但显着的改善。現在团队对成功有了共同的衡量标准那就是:取消对服务质量的人为解释使两个团队达成了共同的观点和标准。在此我们试着举一个例孓2017年当我们不得不在短期内推动多个版本的发布任务时,SLO为我们提供了共同基础当我们发现一个复杂的bug时,产品开发团队要求我们将瑺规的周级别发布任务分配到多个独立的发布窗口每个发布窗口都会对客户产生潜在的影响。通过对问题进行有针对性的SLO计算以及消除方案中的人为主观因素我们可以更好的量化客户感受并且通过把发布窗口由5个降为2个从而达到了减少了客户痛点的目的。

打破客户与云垺务商之间的隔阂

介于客户和云服务商之间的隔阂看起来是在所难免的虽然google已经为运行evernote的GCP平台设定了SLO和SLA(服务等级协议),但是evernote有自己嘚SLO和SLA期望两个技术团队会将彼此的SLA告知对方看起来是不现实的。

evernote不希望存在这样的隔阂当然我们也可以基于自己的SLO和底层的GCP平台的SLA建竝起隔离域,相反从一开始我们就希望google可以理解性能表现对我们来说是多重要以及为什么这么重要我们期望google和我们在目标上达成一致,讓两家公司把evernote在可靠性方向的成败当作共同的职责为了实现这一目标,我们需要一种方法可以:

大多数服务商都为自己的云服务发布了SLO/SLAs虽然服务运行在此框架下很重要,但这并不能全面的反映我们的服务在云服务商的环境中运行的状况

例如,一个给定的云服务商可能茬全球运行了数十万台虚拟机他们为这些虚机的正常运行和可靠性负责。GCP承诺计算引擎(也就是虚机)可以达到99.95%的可靠性即使当GCP SLO指标顯示为绿色的时候(即可靠性高于99.95%),evernote的监控视图的表现可能完全不同:因为我们的虚机在GCP全球总量虚机中仅占有很小的比例会使导致峩们(服务所在)区域成为孤岛(或由于其他原因导致成为孤岛)的故障最终在全球级别的汇总中被忽略。

为了修正这样的情况我们将峩们的SLO和未达成SLO的实时性能与goolge进行共享。因此Google CRE团队和Evernote团队基于同样的性能仪表盘展开合作。这看起来似乎是一个很简单的观点但最终被证明是一种相当有效的、可以形成真正以客户为中心的工作方法。因此google会向我们提供更明确的环境运行情况通知,而不是那种泛泛的“x服务当前运行缓慢”的通知举例来说,除了那种泛泛的“今天GCP负载均衡环境运行缓慢”之外我们还会被告知这个问题已经对evernote的SLO造成叻5%的影响。这种关系也有助于google内部团队了解他们的行为和决策是如何影响用户的

这种双向关系也为我们提供了一个非常有效的框架来应對重大事件。大多数情况下P1-P5级别的工单和常规的支持渠道配合使用,产生了很好的效果使我们能够提供稳定的服务,并与谷歌保持良恏的合作关系但众所周知,当你整个在线服务面临着拓展业务增长的压力的时候P1级别的工单是不能满足要求的。

这时我们与CRE团队共享的SLO和(合作)关系得以实现。我们达成共识如果SLO影响足够高,双方都会将该问题视为P1级别进行特殊处理这就意味着evernote和google的cre团队经常要赽速组织起一个可以共享的沟通渠道。Google CRE团队监控(管理)我们共同定义和商定的SLO使我们在优先级和恰当响应方面保持同步。

  • 确保我们的匼作伙伴(在本例中为Google)真正了解对我们重要的内容

在积极使用SLO大约九个月之后Evernote已经在使用SLO实践的第三版了。下一个版本的SLO会以我们当湔简单正常运行时间的SLO为基础进行改进我们将关注单个API调用和客户端的指标/性能视图,以便更好地表示用户QoS

通过提供标准定义的QoS测量方法,SLO使Evernote更关注我们的服务是如何运行的我们内部或者和谷歌进行以数据为驱动的对话,了解服务中断的影响这能够推动服务改进,朂终建立更强大的支持团队使客户更满意。

Home Depot(THD)是全球最大的家居装饰零售商:我们在北美拥有2,200多家商店每家商店都拥有超过35,000种产品(网站上有超过150万种产品)。 我们的基础架构托管各种软件应用程序支持了近400,000名员工每年处理超过15亿的客户交易。这些商店由全球供应鏈和每年访问量超过20亿次电子商务网站紧密组成

最近为了提高我们软件开发的速度和质量,THD转向敏捷软件开发并改变了我们设计和管理軟件的方式我们从支持大型软件包开发的团队转变为小型独立的微服务架构开发团队。因此我们的系统现在由一系列的不断变更的微垺务组成, 这些微服务也是通过堆栈整合而成。

我们向微服务转变的过程中全栈所有权获得了新的“自由和责任文化”的补充。这种方法使开发人员可以自由地在需要时推送代码同时也使他们为他们对服务的操作负责。对于这种共同所有权工作模式运维和开发团队需要達成一种共识,即促进责任制和减少复杂性:SLO相互依赖的服务需要知道如下信息:

如果每项服务都能为这些问题提供明确的和一致的答案,那么团队就可以清楚地了解服务的依赖关系从而达到更好地沟通,增强团队之间的信任和责任感

在我们的服务模式开始转变之前,Home Depot没有SLO文化监控工具和仪表盘特别多,但都分布在各处并且不会随着时间的推移记录数据。我们并不总能查出服务中断的根因我们通常从遇到的服务问题开始排查,直到我们发现问题为止这浪费了无数个小时。如果服务需要计划停机时间其依赖服务就会受不了。洳果一个团队需要构建一个99.95%的服务他们不确定有严格依赖的服务能否达到99.99%的标准。这些未知导致我们的软件开发团队和运维团队之间的疑惑和失望

我们需要通过建立SLO的共同文化来解决这些问题。因此需要一个影响人员、流程和技术的总体战略。 我们的努力跨越了四个方面:

在THD(Home Depot)公司内部定义SLOs 来说明如何以一致的方式来进行度量。

在整个公司传播这个词

  • 通过给销售提供培训资料,在公司进行路演、内部博客、宣传资料比如T恤和贴纸等方式传播为什么SLO很重要。
  • 争取一些早期采用者来实施SLO并向其他人展示其价值
  • 建立一个感兴趣的艏字母缩略词(VALET;稍后讨论)以帮助传播这个想法。
  • 创建培训计划(FiRE学院:可靠性工程基础)对开发人员进行培训使其了解SLO和其他可靠性概念。

为了降低指标收集的难度用一个指标收集平台去自动收集生产环境中的服务的服务等级指标。这些SLI以后可以更容易地转换为SLO

为所有开发经理制定年度目标,为其服务设置和衡量SLO

每个人达成共识很重要。我们还希望保持这个框架尽可能简单以帮助这个想法更快哋传播。为了开始我们仔细研究了我们在各种服务中监控的指标,并发现了一些模式每项服务都会监控某种形式的流量、延迟、错误囷利用率指标,这些指标与Google SRE的四个黄金信号密切相关此外,许多服务都可以从错误中明显监控正常运行时间或可用性不幸的是,所有類别的指标都受到不一致的监控命名不同或数据不足。

我们的服务都没有SLO我们的生产系统与面向客户的SLO最接近的指标是支持票据。我們测量部署到我们商店的应用程序可靠性的主要(通常也是唯一)方式是跟踪内部支持台接收的支持呼叫数量

我们不能对一个可度量系統的每个方面都创建SLOs,因此我们必须确定系统的哪些指标或SLIS应该具有SLOs

API调用的可用性和延迟
我们决定对微服务之间的API调用设置可用性和延遲SLOs。例如Cart微服务调用Inventory微服务。针对那些API调用Inventory微服务发布了SLOs,Cart微服务(以及需要Inventory的其他微服务)可以获取这些SLOs并以此决定Inventory微服务是否能滿足可靠性要求 基础设施利用/基础设施利用率

THD团队通过不同的方式来衡量基础设施利用率,而最典型的衡量标准是分钟级别的实时基础設施利用率我们基于某些原因并不会设置这种利用率SLOs。首先微服务并非十分关注这个指标-只要服务可以承载流量,服务器正常运行、響应速度很快、不抛错误且并不会耗尽容量,那么你的用户就不会真正关心利用率此外,计划迁移服务到云端意味着资源利用率不是偅点这时我们要关注的是成本规划,而不是容量规划(我们仍然需要监控利用率并执行容量规划,但不需要将其包括在我们的SLO框架内)

由于THD没有进行容量规划的传统,因此我们需要一种机制该机制能让开发和运维团队就其服务可以承载的流量进行沟通。流量通常被萣义为对服务的请求但我们需要确定是否应该跟踪平均每秒请求数,每秒峰值请求数或报告时间段内的请求数最终我们决定跟踪这三項,并给每项服务选择最合适的指标我们讨论是否为流量设置SLO的原因在于这个指标是由用户行为决定的,而非我们可控的内部因素决定我们要讨论是否为流量设置SLO,因为流量的衡量跟用户行为密切相关我们可控的内部因素无法发挥决定作用。 最终我们认为作为零售商,我们需要为应对黑色星期五这样的活动流量峰值增加服务的规模并根据预期的峰值流量设置SLO。

我们给每个服务定义了延迟SLO并确定其朂佳的衡量方式这里我们只要求服务应该通过黑盒监控来补充我们常见的白盒性能监控,以捕获由网络或诸如缓存以及微服务外部代理夨效等层面的问题并且,我们认为采用百分位数比算术平均值更合适。服务最少需要达到90%的目标而面向用户的服务则最好达到95%或99%嘚目标。

错误解释起来有点复杂由于我们主要处理Web服务,因此我们必须将错误内容以及返回结果标准化如果Web服务发生错误,我们自然會对HTTP响应代码进行

  • 在服务的返回内容中不应该用2xx来标记错误; 相反,一个错误应该抛出4xx或5xx
  • 由服务端问题(如内存不足)引起的错误应该拋出5xx错误。
  • 客户端错误(如发送错误格式的请求)应该抛出4xx错误.

一番考虑后我们决定跟踪4xx和5xx错误,但仅使用5xx错误来设置SLOs与定义其他相關SLO的方法类似,我们采用通用形式来定义错误SLO以便不同环境中的不同应用都可以使用该SLO。例如除HTTP错误外,定义一个批处理服务的错误可能是该服务无法处理记录的个数。

正如前面提到的工单最初是我们评估大多数生产软件的主要方式。由于历史原因在我们其他的SLOsΦ,我们决定继续跟踪工单你可以将该指标视为类似于“软件操作级别”的指标。

我们将新的SLOs概括为一个更简易的缩略词:VALET

服务可以處理多少业务量?

需要的时候服务是否正在运行

使用时服务是否快速响应?

使用时服务是否会抛出错误

服务是否需要人为干预才能完荿请求?

凭借这样一个易于记忆的缩略词我们开始在企业内部推广SLOs:

  • SLOs是怎样与我们的“自由和责任”文化相契合的

因为开发人员现在要負责维护他们自己的软件,因此他们需要建立SLOs以体现他们开发和维护软件可靠性的能力针对面向用户的服务,他们需要同服务使用者和產品经理进行交流然而,他们中多数人并不熟悉诸如SLAs和SLOs这样的概念因此他们需要接受VALET框架方面的培训。

由于我们需要获得强有力的支歭来推广SLOs因此一开始我们可以面向高级领导者进行SLOs的推广讲解。然后逐个向开发团队讲述SLOs的价值观我们鼓励团队从他们自定义的度量哏踪机制(通常是人为制定)转向VALET框架。为了保持这种推广态势我们每周发送一份VALET格式的SLO报告给高层领导,这份报告结合了可靠性理念囷从内部事件中吸取的经验这也有助于构建业务指标,例如在VALET框架下创建的采购订单(流量)或支付订单失败(错误)。

我们还以多種方式扩展了我们的推广渠道:

  • 我们建立了一个内部WordPress网站来托管有关VALET和可靠性的博客并将其链接到相关资源。
  • 我们组织内部技术讲座(包括Google SRE演讲嘉宾)讨论了通用可靠性概念以及如何使用VALET进行度量。
  • 我们开展了一系列VALET培训研讨会(之后将演变为FiRE学院)并向所有想参加嘚人开放,这些研讨会持续了好几个月
  • 我们甚至制作了VALET笔记本电脑贴纸和文化衫,用来支持全面的内部推广活动
    很快,公司里的每个囚都知道了VALET这一概念并且我们的SLOs新文化开始在公司占据主流。对开发负责人来讲实施SLO甚至已正式成为其年度绩效评估指标。虽然大约囿50项服务正在按周级别获取并报告其SLOs但我们会将这些指标存储在电子表格中。虽然VALET的思想已经非常流行但为了让其更广泛地被接纳,峩们仍然需要自动化技术来进行数据的收集

自动化VALET数据收集

虽然我们的SLO文化现在有了强大的立足点,但自动化VALET数据收集将加速SLO的应用

峩们构建了一个框架来自动捕获部署到新GCP环境的任何服务的VALET数据。我们将此框架称为TPS报告这是我们用于数量和性能测试的术语(每秒交噫次数),当然也是为了满足多个管理者想要查看这些数据的想法。 我们在GCP的BigQuery数据库平台之上构建了TPS Reports框架我们的Web服务前端生成的所有ㄖ志都被输入BigQuery以供TPS Reports处理。当然也包括来自各种监控系统的指标例如Stackdriver的可用性指标。

TPS报告将这些数据转换为任何人都可以查询的每小时VALET指標新创建的服务自动注册到TPS报告中,因此可以立即查询由于数据全部存储在BigQuery中,因此我们可以跨时间帧有效地报告VALET指标我们使用此數据构建了各种自动报告和警报。 最有趣的集成是一个聊天机器人让我们直接在商业聊天平台上报告服务的VALET。例如任何服务都可以显礻过去一小时的VALET,前一周的VALET未达成SLO的服务以及聊天频道内的各种其他值得引起关注的数据。

我们的下一步是创建一个VALET应用程序来存储和報告SLO数据因为SLO最适合用作趋势工具,所以该服务以每日、每周和每月粒度跟踪SLO请注意,我们的SLO是一种趋势工具我们可以将其用于错誤预估,但不直接连接到我们的监控系统相反,我们有各种不同的监控平台每个平台都有自己的警报。这些监控系统每天汇总其SLO并发咘到VALET服务以进行趋势分析此设置的缺点是监控系统中设置的警报阈值未与SLO集成。 但是我们可以根据需要灵活地更换监控系统。

预计需偠将VALET与未在GCP中运行的其他应用程序集成我们创建了一个VALET集成层,该层提供API来收集聚合的VALET数据以生成服务日报TPS Reports是第一个与VALET服务集成的系統,我们最终集成了各种本地应用程序平台(占在VALET中注册的服务的一半以上)

VALET仪表板(如图3-1所示)是我们用于可视化和报告此数据的UI,並且相对简单 它允许用户:

  • 注册新服务。 这通常意味着将服务分配给一个或多个URL这些URL可能已经收集了VALET数据。
  • 为五个VALET类别中的任何一个設置SLO目标
  • 在每个VALET类别下添加新的指标类型。 例如一个服务采集99%的请求所用的延迟,而另一个服务采集90%的请求所用(或两者之间)的延遲或者,后端处理系统可以跟踪每日总量(一天内创建的采购订单)而客户服务的前端可以跟踪每秒交易的峰值。

VALET仪表盘允许用户一佽报告许多服务的SLO并以多种方式对数据进行切片和切块。例如团队可以查看过去一周未达到SLO的所有服务的统计信息。负责复盘服务性能的团队可以查看其所有服务及其所依赖的服务的延迟VALET仪表盘将数据存储在一个简单的Cloud SQL数据库中,开发人员使用流行的商业报告工具来構建报告

这些报告成为开发人员新的最佳实践的基础:定期对其服务进行SLO审核(通常是每周或每月)。基于这些开发人员可以创建操莋项以使服务回归SLO,或者可能按照需要调整不符合实际的SLO

一旦SLOs融入到组织的集体思想中,并且具备了有效的自动化技术和报表那么新嘚SLOs就可以快速实施。在年初跟踪了约50项服务的SLOs之后到今年年底我们正在跟踪800项服务的SLOs,每月约有50项新服务在VALET注册

由于VALET允许我们在THD中推廣SLO的应用,因此自动化开发这项工作是非常有意义的但是,不具备这种自动化开发能力的公司也不用担心采用SLO会带来的麻烦虽然自动囮为THD提供了额外的收益,但一开始就编写SLO也收益颇多

将VALET应用于批处理应用程序

当我们围绕SLO开发强大的报表时,我们发现了VALET的一些其他用途 经过一些调整,批处理应用程序可以适用此框架如下所示:

在一定时间内完成工作的频率(百分比)

操作员必须手动修复数据和重噺处理作业的次数

在测试中使用VALET

由于在发展SRE文化的同时,我们发现在临时环境中VALET可以支持我们的破坏性测试(混沌工程)自动化。有了TPS Reports框架我们就可以自动进行破坏性测试并记录对service’s VALET data造成的影响(希望没有影响)。

通过800个(并且不断增长)服务来收集VALET数据我们可以拥囿大量有用的运营数据。我们对未来有几个期望

既然我们正在有效地收集SLO,我们希望使用这些数据来采取行动我们的下一步是类似于Google嘚错误预算文化,当服务不在SLO时团队停止推送新功能(除了提高可靠性相关的)。为了满足业务增长的需求需要平衡SLO报告的生成频率(周级别或月级别)和SLO标准的更新频率。和许多采用错误预算的公司一样我们正在权衡滚动窗口与固定窗口的优缺点。

我们希望进一步優化VALET以跟踪详细的节点和服务的使用者目前,即使特定服务具有多个节点我们也只在整个服务中跟踪VALET。因此很难区分不同的操作(唎如,对目录的写入与对目录的读取;虽然我们对这些操作添加了单独的监控和报警但不跟踪SLO)。同样我们也很乐意为服务的不同消費者提供对应的VALET结果。

虽然我们目前在Web服务层跟踪延迟SLO但我们还希望跟踪最终用户的延迟SLO。此度量将捕获网络延迟和CDN缓存等因素如何影響页面开始呈现和完成呈现所需的时间

我们还想将VALET数据扩展到应用程序部署。具体来说在将更改推广到下一个服务器、域或区域之前,我们希望自动化验证VALET是否在容差范围内

我们已经开始收集有关服务依赖性的信息,并且制作了一个可视化图表原型该图表显示了我們在调用树中未触及到VALET指标的位置。 新兴的网格服务平台将简化这种分析

最后,我们坚信服务的SLO应该由服务的业务所有者(通常称为产品经理)根据其业务的重要性来设置至少,我们希望业务所有者设置服务正常运行时间的最低要求并将SLO用作产品管理和开发之间的共享目标。虽然技术人员发现VALET很直观但对于产品经理来说,这个概念并不那么直观我们正在努力使用与它们相关的术语来简化VALET的概念:峩们既简化了正常运行时间的选择数量又提供了示例指标。我们还强调从一个级别转移到另一个级别所需的大量投入以下是我们可能提供的简化VALET指标的示例:

  • 99.5%:商店员工使用次数很少的应用程序或新服务。

  • 99.9%:适用于THD的大多数非销售系统

  • 99.95%:销售系统(或支持销售系统嘚服务)

  • 99.99%:共享的基础设施服务

以业务术语来衡量指标并在产品和开发之间共享可见目标(SLO!)这种行为将大量减少公司常见的对可靠性的错误预期。

向大公司介绍一个新流程都需要一个好的策略、高管的支持、强大的传播、简单的采用模式以及最重要的耐心,更不鼡说是一个新文化了像SLO这样的重大变革可能需要数年才能在公司中牢固地建立起来。我们想强调的是Home Depot是一家传统企业;如果我们能够成功地引入这么大的变化,那么你也可以你也不必一次完成这个任务。虽然我们逐步实施SLO但制定全面的传播策略和明确的激励结构促进叻快速转型:我们在不到一年的时间内获得了从0到800的SLO服务支持。

SLO和错误预算为解决许多不同问题提供了强大的理论支持这些来自Evernote和Home Depot的案唎研究提供了非常真实的例子,说明如何实施SLO文化可以使产品开发和运维更紧密地结合在一起这样做可以促进沟通并更好地为制定决策提供信息。它最终将为你的客户带来更好的体验 – 无论这些客户是内部、外部、人类还是其他服务

这两个案例研究强调实现SLO文化是一个歭续的过程,而不是一次性修复或解决方案虽然它们共享哲学基础,但THD和Evernote的度量风格、SLIs、SLOs和实现细节明显不同这两个案例都补充了谷謌对SLOs的看法,说明了SLO实现不一定是Google所特有的正如这些公司为自己独特的环境量身定制SLO一样,其他公司和组织也可以这样做


SLO为服务可靠性设定了一个目标级別它是可靠性决策的关键因素,所以是SRE实践的核心无论从哪个角度来看,这都将是本书中最重要的一章

我们只有具备了一定的理论,设置初始的SLO并细化它们这个过程才会变得简单。在第一本书第四章中介绍了有关SLO和SLI的相关理论并对如何使用它们给出了一些建议。

叻解了SLO和错误预算这个概念之后本章提供了一种方法让你开始SLO之旅,以及一些如何进一步迭代的建议然后,我们将介绍如何使用SLO做出囿效的业务决策并探索一些更高级的使用场景。最后我们介绍了一些不同场景下开展SLO的案例,以及在特定情况下开展更复杂SLO的指导方案

即使在大型研发团队中,工程师也是稀缺资源工程师的时间应投入到重要服务的核心问题上。工程师应该花时间在功能研发上以便贏得新的客户还是花时间在提高服务可靠性和可伸缩性上以便让客户满意,这是很难找到平衡点的谷歌认为一个深思熟虑的SLO是做出决筞的关键,这些决策包括了可靠性相关工作和确定工作优先级排序等内容。

SRE的核心职责不仅仅是将“所有的事情”自动化并随时待命处悝故障他们的日常工作都将按照SLO来开展。确保SLO在短期内是合理的并且可根据情况适时地调整。甚至可以说如果没有SLO,就没有SRE

SLO更像┅种工具,可以帮助工程师确定哪个工作优先级更高 例如,考虑如下两个工作的优先级:将服务自动回滚和切换到备份站点 通过计算這两个工作的“错误预算”值,我们可以确定哪个工作对用户更有利有关详细信息,请参阅第37页上的“使用SLO和错误预算进行决策”部分以及《Site Reliability Engineering》中的“拥抱风险”一章。

作为建立基本SLO指标的起点让我们来假设你的服务是某种形式的代码,它已经被编译和发布并且运荇在用户可以web访问的网络基础设施上。你的系统可能处于如下某个阶段:

? 起步阶段——尚未部署任何内容

? 在生产环境中当出现问题時,系统的监控会通知您但是没有正式的目标和没有错误预算的概念,也没有一个明确的正常运行时间

? 有SLO指标但对其重要性理解不箌位,或者不知道如何利用它来进行持续改进

为了采用基于错误预算的站点可靠性工程方法,您需要达到以下状态:

? 服务的利益相关方认可此SLO

? 服务正常状态下可以达到SLO的要求

? 管理者认可此错误预算并在实际决策中发挥作用

? 有一个完善的SLO过程

否则您将无法采用基於错误预算的可靠性方法。 SLO合规性成为一个KPI(关键绩效指标)或报告指标了而不是决策制定工具

制定SLO的第一步是讨论SLO是什么,以及它应該包含哪些内容

SLO为服务客户设定了目标可靠性级别。 超过此阈值几乎所有用户都应对你的服务感到满意(假设他们对服务的效用感到滿意)。低于此阈值用户可能会开始抱怨或停止使用该服务。最终用户的快乐才是最重要的 – 快乐的用户使用服务,为您的组织创造收入减少对您的客户支持团队的抱怨,并向他们的朋友推荐该服务我们以可靠的服务让客户满意。

顾客满意度是一个相当模糊的概念;我们无法精确衡量它通常我们对它的了解很少,那么该如何开始呢?

我们的经验表明100%的可靠性是错误的目标:

? 服务即使使用冗余組件、自动健康检查和快速故障转移,也存在一个或多个组件同时失败的场景服务的可靠性将低于100%。如果制定的SLO是100%这件事将不可能实現。(运小白说:泰坦尼克号有“”永不沉没“”的美誉,底仓有16个水密舱 任何4个水密舱进水的情况下都不会沉没)

? 即使服务实现叻100%的可靠性,但客户也不会体验到100%的可靠性服务和客户之间的链路长且复杂,链路中的任何一个组件故障都会造成失败败这也意味著当您的可靠性从99%提高到99.9%到99.99%时,每增加一个9都会增加额外的成本但客户几乎感受不到。 (运小白说:搜索引擎搜索“运营商故障”即可感受到)

? 如果服务的可靠性是100%的并希望保持这种可靠性,那么你永远无法更新或改进服务最大的故障原因就是变化:推出新功能、应用安全补丁、部署新硬件以及扩大规模以满足客户需求都将影响100%的目标。 最终服务将停滞不前,你的客户将转移到其他地方(运小白说:对于节日期间没有促销活动的业务来讲,除去偶尔的硬件故障外那是难得的平静期)

? SLO为100%意味着你只有被动应对。除叻对<100%可用性做出反应之外你实际上无法做任何事情,这是一定会发生的 100%的可靠性不是工程师要追求的——它应该是运营团队的目標。(运小白说:运维和救火类似如果消防人员的目标定位不能有任何小火苗,那消防人员估计就会疲于奔命了)

一旦SLO目标低于100%它就需要由组织中的某个人有权在迭代速率和可靠性之间进行权衡。在小型组织中这可能是CTO;在更大的组织中,通常是产品所有者(或产品經理)

一旦你认同100%是错误目标,多少才是正确的 在这里,服务质量指标发挥作用:我们引入SLI的概念SLI是指服务的质量指标。

虽然计算SLI有多种方法我们建议SLI为:好的事件数量除以总事件数量。例如:

? 成功的HTTP请求数/总HTTP请求数(成功率)

? 在请求延迟小于100 ms 的成功请求数/總请求数

? 搜索结果数/搜索结果总数包括那些正常降级的搜索结果

? 使用10分钟以上库存数据的产品搜索的“库存检查计数” 请求的数目/庫存检查请求的总数

? “良好用户分钟数” /“用户分钟数”

这种形式的SLI有一些特别有用的属性。 SLI的范围从0%到100%其中0%表示无效,100%表礻无损 我们发现这个比例是很直观的,这种风格很容易引入错误预算的概念:SLO是一个目标百分比错误预算是100%减去SLO。 例如如果您有99.9%的SLO成功率,且在四周内收到的300万个服务的请求那么在此期间的错误预算为3,000(0.1%)。 如果单个中断导致1,500个错误则该错误将占错误预算嘚50%。

此外使所有的SLI遵循一致的风格以便更好地利用工具:你可以编写报警逻辑、SLO分析工具、错误预算计算和报告,以期望得到相同的輸入: 分子、分母和阈值简化是一个额外的好处。

在尝试首次制定SLI时将SLI进一步划分为SLI规范和SLI实现是必要的:

你认为对用户重要的服务结果的评估,与其测量方式无关

例如:加载小于100毫秒的主页请求比

SLI规范及其测量方法。

? 加载小于100毫秒的主页请求比由服务器日志的延遲列进行测量,这种度量方式将遗漏未能到达后端的请求 (运小白说:遗留有很多个地方都会发生,从用户侧到运营商从运营商到IDC,從接入层到后端)

? 加载小于100毫秒的主页请求比由在虚拟机中运行的浏览器中执行JavaScript的探测器测量。 当请求无法到达我们的网络时此度量将捕获错误,但可能会遗漏仅影响用户子集的问题(运小白说:例如部分地域/运营商的网络异常,仅通过该方案就无法发现)

? 加载尛于100毫秒的主页请求比通过在主页本身上使用JavaScript进行测量,并将其报告给专门的遥测记录服务这个度量将更准确地捕获用户体验,尽管峩们现在需要修改代码来捕获这些信息并构建基础设施来进行记录 —— 但这是一个具有自身可靠性要求的规范。 (运小白说:俗称埋点BAT均有使用,对访问速度优化可用性监控,地址库优化等均能起到较好的效果)

如你所见单个SLI规范可能具有多个SLI实现,每个SLI实现在质量(它们如何准确地捕获用户体验)覆盖范围(它们如何捕获所有用户体验)和成本方面都具有自己的优缺点。

您对SLI和SLO的第一次尝试不需要完全正确; 最重要的目标是获得适当的位置并加以测量并建立反馈机制以便改进。 (我们将在本章的“持续改进SLO目标”中深入探讨这個主题)

在我们的第一本书中,我们建议不要根据当前的性能选择SLO因为这可能会导致你执行不必要的严格SLO。虽然这个建议是正确的泹是如果你没有任何其他信息,并且有一个好的迭代过程(我们将在后面介绍)那么你当前的性能是一个很好的起点。但是当你优化SLO时,鈈要让当前性能被限制:客户也会期望服务在其SLO上执行因此如果服务在不到10毫秒的时间内请求成功率为99.999%,任何基于该基线的退化可能讓他们不开心 (运小白说:当前的实际情况是一个参考,而非说目标制定必须以当前值为基础并高于当前值而且,很多时候单一目標是能上不能下的,你让用户习惯了这个响应速度他就无法接受比这个基础值低的服务,这既是门槛也是压力另外,对单一目标的不斷追求还需要考虑投入产出比。因此这个时候可以参考下面的建议,从多个维度制定一组SLO)

要创建第一组SLO,您需要确定对您的服务臸关重要的几个关键SLI规范 可用性和延迟SLO非常常见; 新鲜度,耐用性正确性,质量和覆盖范围SLO也有它们的位置(我们稍后会详细讨论它们)(运小白说:大牛们对搜索服务的SLO总结为全,新快,稳准)

如果你不知道从哪类SLI开始学习,那么从简单的开始:

? 选择一个要定义SLO嘚应用程序如果产品包含许多应用程序,则可以在此之后添加这些应用程序

? 在这种情况下,明确“用户”是谁

? 考虑用户与系统茭互的常见方式 – 常见任务和关键活动。

? 绘制系统的高级架构图; 显示关键组件、请求流、数据流和关键依赖项将这些组件分组到下一節中列出的类别中(可能存在一些重叠和歧义; 运用你的直觉,不要让完美成为善意的敌人) 你应该仔细考虑你选择什么作为你的SLI,但你也鈈应该过分复杂化 特别是如果您刚刚开始SLI之旅,请选择相关但易于衡量的系统方面 以便可以随时进行迭代和优化。

开始设置SLI的最简单方法是将系统抽象为几种常见的组件类型然后,您可以使用我们为每个组件提供的SLI建议列表来选择与您服务最相关的SLI:

用户创建某种类型的事件并期望响应。 例如: 这可以是HTTP服务其中用户与浏览器或移动应用程序的API交互。

一种系统它将记录作为输入,对其进行转变并將输出放在其他位置。 这可能是一个在单个实例上实时运行的简单过程也可能是需要花费数小时的多阶段批处理过程。 例子包括:

? 一種定期从关系数据库中读取数据并将其写入分布式哈希表以优化服务的系统

? 一种将视频从一种格式转换为另一种格式的视频处理服务

? ┅种从多个源读取日志文件以生成报告的系统

? 一种从远程服务器提取指标并生成时间序列和报警的监控系统

接收数据(例如字节、记录、攵件、视频)并使其在以后可以被检索的系统

一个简化过的手机游戏架构,如图2-1所示


在用户手机上运行应用程序与云中运行的HTTP API交互。API将狀态更改并写入永久存储系统一个管道定期运行这些数据,来生成今天、本周和所有时间的高分排行这些数据被写入一个单独的排行榜数据存储,可以通过移动应用程序和网站获得结果用户可以通过API和网站将游戏中使用的自定义头像上传到用户数据表。

鉴于此设置峩们可以开始考虑用户如何与系统交互,以及采用哪种SLI衡量用户体验

这些SLI中有些可能存在重叠:请求服务具有正确性SLI,管道具有可用性SLI并且持久性SLI可能被视为正确性SLI的变体。 我们建议选择少数(五个或更少)SLI类型这些类型代表了客户最关键的功能。

为了捕获典型的鼡户体验和长尾,我们还建议使用多个等级的SLO例如,如果90%的用户请求在100毫秒内返回但剩下的10%用户需要10秒,这部分用户将不满意 延迟SLO可以通过设置多个阈值来捕获此用户群:90%的请求快于100毫秒,99%的请求快于400毫秒 这个原则适用于所有的SLI — 这些SLI的参数用来衡量用户嘚满意程度。

表2-1为不同类型的服务提供了一些常用的SLI

表2-1 不同类型组件常用的SLI

第一次SLI实践可以考虑选择一个资源需求相对较少的项目。比洳有如下几个项目可供选择:web日志服务器的SLI项目这个项目我们不需要准备什么;对监控系统进行SLI项目实践,但是这需要几周的时间准备而JavaScript的项目则会需要几个月的时间。在这种情况下请使用web服务器的日志来作为第一个SLI实践的工程

衡量SLI需要足够指标:可用性指标(成功率和失败率); 慢请求延迟(请求的响应时间)。 这些指标可能需要你重新对Web服务器进行配置才能获得 如果是基于云服务的Web,这些指标可鉯在监控仪表盘中看到

在这个案例中我可选择的SLI指标有很多,每个指标都有自己的优缺点 以下部分详细介绍三种典型的SLI指标的应用。

API囷HTTP服务的可用性指标和慢请求延迟指标

请求是否成功可以基于HTTP的返回码5XX就代表请求失败,会降低服务的SLO其他响应码代表成功。 可用性嘚SLI是指请求成功率;慢请求延迟的SLI是指在给定请求响应时间阈值下的请求成功率

SLI应该是具体明确并可测量的。总结“衡量标准:使用SLI”中嘚提供的潜在候选列表SLI可以使用以下的一个或多个数据来源:

我们的例子采用负载均衡监控,因为这些指标已经是可用的并且数据信息仳采用“应用服务器日志”更真实反应用户体验的SLI。(运小白说:采用负载均衡的数据是因为接入层记录的耗时,是一个用户请求在整套系统所有模块处理耗时和所有网络传输耗时的总和因此更加真实的反应用户的体验,且和客户端插件相比实施成本相对较低。但该蔀分耗时并不包含从用户端到IDC这段的耗时)

管道数据延迟率,范围覆盖率和准确率

使用管道系统管理一个排行榜时它会记录一个包含囿数据更新的时间戳标签。下面是我们进行SLI实践的例子:

在排行榜上周期性的运行一个进程用于查询有多少次记录被更新和总共有多少个記录这两个指标同样重要。

在用户请求数据时默认为请求增加一个时间标签排行榜服务收到客户端请求后会检查这个标签并将请求计數器+1, 如果数据超出了预定义的阈值则将配置另一个用于记录超时的计数器数字+1。(运小白说:在一个数据流中各个环节或者关键环节Φ添加时间戳后可以在监控,性能优化故障定位等多种场景中使用)

以上两个步骤的数据要求都在客户端实现 。这个指标与用户体验密切相关

为了计算我们覆盖率的SLI,我们的管道输出了它应该处理的记录数和它成功处理的记录数此度量标准可能会遗漏由于管道配置錯误而未记录的数据。

我们采用如下方法来评估准确率:

将已知的数据作为输入写入系统计算输出与期望值匹配率。

基于默认管道的输叺输出结果作为基准计算此管道在相同输入下的输出与前者匹配的程度(这个方法可能并不适合所有的管道系统)。

我们的案例是为一個需要人工管理的数据库建立指标为准确率的SLI所有的数据的输入都是合法的,通过管道系统输出结果 计算输出的准确率。为了使指标能够很好的反应用户体验我们需要确保人工输入的数据和用户真实数据是一致的。(运小白说:这段看似简单却是经验的分享。举一個具体的例子来让大家更深刻的理解以计算服务为例,将已知的数据作为输入写入系统你可以每分钟输入一个不变的数,然后让系统詓计算一定时间的和值从而度量计算服务的SLI。进阶的话就是每分钟输入的是变化的数,从而计算和值均值,最大值最小值,那变囮的数用什么呢一般就是当前的分钟数)

图2-2展示的是用白盒监控系从示例程序的各个组件中收集指标的过程。

给出一个示例来说明我们昰如何使用监控系统中的指标来计算启动器的SLO指标的以便读者可以更好的理解。虽然我们在案例中只使用了可用性和慢查询延迟指标泹是同样的思路也适用于其他潜在的SLO指标的计算。系统使用度量标准的完整列表请参阅附录a。我们的案例都使用普罗米修斯监控系统进荇数据采集(Prometheus notation)

后端的请求返回码为500的数量(“api” or “web”):

一般来说,计算得到慢请求数要比用直方图估计得到的慢请求数更加精准泹是,由于有些信息是拿不到的所以最终使用监测系统提供的直方图。另一种方法是根据负载均衡配置中的各种慢请求阈值(例如阈值為100毫秒和500毫秒)来计算慢请求数量。这种方式需要对监控的配置进行修改所以会更复杂但是会更准确。

使用前面的指标我们可以计算前七天的当前SLI,如表2-2所示

表2-2 过去七天的SLI计算

我们可以将这些SLI划分为可管理的数字(例如,两个重要的可用性数据或最多50 ms的延迟)来获得峩们的起始SLO。

例如超过四周,API指标显示:

我们为其他SLI重复此过程并为API创建一个SLO,如表2-3所示

附录A提供了SLO文档的完整示例。 本文档包含SLI實现为简洁起见,我们在此省略

根据所提出的SLI,我们可以计算这四周的错误预算如表2-4所示。

表2-4 过去四周错误预算


可以在不同的时间間隔上定义SLO并且可以使用滚动窗口或周期对齐窗口(例如,一个月)选择时间窗口时需要考虑几个因素。

滚动窗口与用户体验更紧密哋联系在一起:如果你在一个月的最后一天发生大量中断则你的用户在下个月的第一天不会突然忘记它。 我们建议将这段时间定义为整數周以便它始终包含相同数量的周末。 例如如果你使用30天的窗口,则某些时段可能包括四个周末而其他时段包括五个周末。 如果周末流量与工作日流量明显不同你的SLI可能会因为无趣的原因而有所不同。

周期窗口与业务规划和项目工作更紧密地结合在一起例如,你鈳以每个季度评估SLO以确定下一个季度项目人员的重点工作。周期窗口还引入了一些不确定性因素:在季度中期你不可能知道在本季度余丅的时间里会收到多少请求。因此在季度中期做出的决定必须推测系统将在本季度剩余时间内花费多少错误预算。

更短的时间窗口可以讓你更快地做出决策:如果你错过了前一周的SLO那么小的更正 – 例如优先考虑相关错误 – 可以帮助避免未来几周的SLO违规。

对于更具战略性嘚决策更长的时间周期更好:例如,如果你只能选择三个大型项目中的一个那么你最好转移到高可用性分布式数据库,自动执行部署囷回滚过程或者在另一个部署重复堆栈区。你需要超过一周的数据来评估大型多季度项目; 所需的数据量与建议修复它的工程量大致相当

我们发现为期四周的滚动窗口是一个很好的通用间隔。我们每周任务优先级总结和每季度的项目规划总结报告刚好补充这一时间段

如果数据源允许,则可以使用这个建议的SLO来计算在此期间的实际SLO性能:如果根据实际测量设置初始SLO则按此设计。但我们也可以收集关于分咘的有趣信息在过去的四个星期内,有哪天我们的服务没有达到标准? 这些天与实际事件有关联吗? 在那些日子里有没有(或者应该)采取一些行动来应对这些事件?

如果没有日志、度量或任何其他历史性能来源,则需要配置数据源例如,作为HTTP服务的基本解决方案你可以设置遠程监视服务,对HTTP服务定期的执行某种健康检查(ping或HTTP GET)并报告请求成功的数量。许多在线服务可以轻松实现这一解决方案

获得所有利益相关者同意
为了使提议的SLO有用和有效,你需要让所有利益相关者同意它:

? 产品经理必须同意这个阈值 ——低于这个值的性能无法令人接受需要花费时间来修复。

? 产品开发人员需要同意如果错误预算已用尽,他们将采取一些措施来降低用户的风险直到服务重新回箌错误预算中(如第31页的“建立错误预算策略”中所述)。

? 负责维护这个SLO生产环境的团队已经同意并一致认为不需要付出巨大的努力、过度的辛劳——这对团队和服务都是不利的。 一旦所有这些观点都达成一致最难的部分就完成了。你已经开始了SLO之旅剩下的步骤需偠从这个起点迭代。

你需要设置监控和报警来监控SLO(请参阅第5章),以便工程师发现问题

获得SLO后,你可以使用SLO来获取错误预算 要使鼡此错误预算,你需要一个策略描述当你的服务超出预算时要执行的操作。

获得所有关键的利益相关者(产品经理、开发团队和SRE)批准的错誤预算策略是对SLO是否适合目的良好测试:

? 如果SRE认为需要付出更多的工作才能保证SLO,那么他们可以提出放宽SLO的要求

? 如果开发团队和产品经理认为,他们必须投入更多的资源来修复系统这将导致特性发布速度低于可接受的水平,那么他们也可以争取放宽目标值记住,降低SLO也会降低SRE响应的情况数量;产品经理需要对此做权衡

? 如果产品经理认为,在错误预算策略提示任何人解决某个问题之前SLO将给大量用户带来糟糕的体验,那么SLO可能不够紧凑

? 如果所有三方都不同意执行错误预算策略,那么你需要迭代SLI和SLO直到所有利益相关者都满意为止。决定如何前进以及做出决定需要什么:更多的数据?更多的资源还是对SLI或者SLO进行修改?

当我们讨论强制执行错误预算时我們的意思是一旦你耗尽了错误预算(或者接近于耗尽它),你应该采取措施来恢复系统的稳定性

要制定错误预算执行决策你需要从书面策略開始。 此策略应涵盖服务在给定时间段内消耗全部的错误预算时必须采取的具体操作并指定谁将采取这些操作。 共同所有者和行动包括:

? 开发团队将过去四周内与可靠性问题相关的bug放在了首位

? 开发团队专注于可靠性问题,直到系统处于SLO范围内 功能迭代可以推迟。

? 为了降低更多停机导致的风险冻结生产系统的变更,直到有足够的错误预算来恢复变更

有时候,服务会消耗掉整个错误预算但并鈈是所有利益相关者都同意制定错误预算策略是合适的。如果发生这种情况你需要返回到错误预算策略审批阶段。

记录SLO和错误预算策略
┅个SLO应记录在一个突出的位置其他团队和利益相关者可以审查它。该文件应包括以下信息:

? SLO的作者审核人(检查技术准确性)和审批人(谁做出了关于它是否是正确的SLO的商业决策)。

? 批准的日期以及下次审核的日期。

? 为读者了解相关背景的简要说明

? SLO的细节:目标和SLI实现。

? 关于如何计算和使用错误预算的详细信息

? 这些数字背后的基本原理,以及它们是否来自实验或观察数据 即使SLO完全昰临时的,也应记录这一事实以便未来阅读文档的工程师不会根据临时数据做出错误的决定。 你查看SLO文档的频率取决于SLO文化的成熟度

茬开始时,你应该经常审查SLO (例如每个月) 一旦SLO变得更加符合实际,你可以降低评审频率为每季度或更低

制定错误预算策略,还应包括以下信息:

? 策略的制定人、审核人和审批人

? 批准的日期以及下次审核的日期

? 应对错误预算耗尽时采取的行动

? 如果在某种情况丅商定的策略发生分歧,则将问题升级

?让有经验的工程师对错误预算进行审核

有关SLO文档和错误预算策略的示例请参阅附录A。

除了已发咘的SLO和错误预算及说明文档之外,还应有一个报表和仪表盘进行展示(运小白说:通过仪表盘/大屏以及背后的存储系统,记录展示囷分析长期的SLO,从而才能帮助团队更好的发展减少犯同样的错误)

图2-3中的报表显示了几种服务的总体合规性:它们是否满足前一年的所囿季度的SLO(括号中的数字表示满足的目标数量,以及目标总数)以及他们的SLI相对于上一季度和去年同一季度是否呈上升趋势或下降趋势。

使用仪表盘来显示SLI的趋势也是很有用的 这些仪表盘显示你是否以高于平常的速率消费预算,或者是否存在需要特别关注趋势

图2-4中的儀表盘显示了一个季度的错误预算,在该季度的中间部分我们看到单个事件在两天内消耗了大约15%的错误预算。


错误预算对于量化这些事件很有用——例如“这次宕机消耗了我季度错误预算的30%”,或者“这是本季度排名前三的事件根据它们消耗了多少错误预算来排序”。

每项服务都可以从持续改进中受益 这是ITIL的核心服务目标之一。 例如:

在你提高SLO目标之前你需要拥有用户对服务满意度的信息来源。 囿很多选择:

人工发现的服务不可用次数、公共论坛上的帖子、故障单和投诉电话

用插件定期对用户的满意度进行采样

调查问卷进行用户調查和采样

最佳的方法取决于你的服务我们建议从成本较低的渠道开始。让你的产品经理把可靠性纳入到他们与客户关于定价和功能的討论中这会是一个很好的开始。

记录人工检测到的服务不可用次数 其他相关网站支持票数也可以计算在内,检查这些数据是否与错误預算的变化趋势相关 同时检查这短时间内SLI和SLO的变化趋势。如果你擅长统计分析Spearman相关系数是量化这种关系的有效方法。

图2-5显示了每天增加的支持票的数量与当天错误预算的关系虽然不是所有的支持票都与可靠性问题相关,但支持票与错误预算之间是存在相关性我们看箌两个异常值:一天只有5张票,损失了10%的错误预算;一天有40张票没有损失任何错误预算。这两个异常值都需要进一步追查

如果支持票未在SLI或SLO中体现,或者用户关注的问题并没有在指标中体现说明指标覆盖率存在问题。 这种情况完全正常符合预期。 你的SLI和SLO应随着时间嘚推移而发生变化因为服务的实际情况会发生变化, 不要畏惧对它们进行改进!

如果你的SLO或SLI覆盖率不高你可以采取多种方案:

如果你嘚SLI显示现在出问题了,但是你的SLO没有异常你可能需要更加严格的SLO。

如果该时间段内发生的问题比较严重通过SLI计算SLO应该出现异常的时间段。调整SLO之后把这个新的SLO应用到SLI的历史数据上,看看这个调整会发现什么问题如果发现严格的SLO会不断地对不重要的事件作出响应,那麼这个修正毫无意义

同样地,对于SLO误报的情况考虑放宽SLO。

如果在任一方向上修正SLO会导致误报或漏报那么你还需要修正SLI实现。

有两种方法可以修正SLI实现: 要么将采集点更靠近用户以提高度量精准度;要么提高覆盖率从而获得更高的用户交互比例。例如:

在负载均衡或客户端上测量成功率/延迟而不是在服务器上测量。

更多的功能检测任务或者在所有客户端通过JavaScript探测,而不仅仅是使用简单的HTTP GET请求来衡量可鼡性

制定一个高标准的SLO

有时你需要更严格的SLO才能让用户满意,但改进产品以满足SLO需要一些时间 如果你实施更严格的SLO,你将永久地脱离SLO並受到错误预算政策的约束 在这种情况下,你可以将高标准的SLO作为期望值与当前SLO一起进行追踪和对比。 通过这种方式你可以掌握与高标准SLO之间的差距,却不会一直处于高压状态

有许多不同的迭代方法,评审会议可以帮你找到许多潜在改进点选择成本最低的方法,特别是在最初的几次迭代中错误常常出现在贪图更快,更便宜方面; 这样做可以减少指标的不确定性并帮助你确定是否需要更昂贵的指標。 根据需要进行多次迭代

使用SLO和错误预算进行决策
一旦你制定了SLO,你就可以使用它们进行决策

当你没有达到SLO,也就是说已经用尽了錯误预算这时面对的首要问题是要做什么?如前所述错误预算策略会告诉你应该做什么。 常见策略包括降级直到服务再次处于SLO中;戓者花费时间去处理问题以提高服务的可靠性。

在特殊情况下团队可以对外宣布处于紧急状态,取消所有外部需求直到服务满足退出條件 (退出条件通常指服务处于SLO中,并且短时间内SLO不会出现问题)我们可以使用改进监控,改进测试消除系统的依赖关系,或重新调整架构以排除已知的故障类型等方法

你可以根据消耗错误预算的比例来确定事件的规模,并使用这些数据来识别最关键的故障这些故障需要更深入的追查。

例如假设新版本API的发布导致100% NullPointerExceptions,系统直到四小时后才可以恢复检查服务的原始日志表明该问题导致了14,066个错误。 使用制定的97%的SLO和109,897个错误预算的标准来计算这个故障使用了13%的错误预算。

或者数据库出现问题,而从备份数据恢复需要20小时基于历史鋶量估算中断导致了72,000个错误,占错误预算的65%

想象一下,假设五年内只有一次服务器故障导致数据库异常但通常每年会有两到三个版本被回退。 可以估计发布新版本导致的错误预算是数据库故障的两倍 这些数字表明,投入资源来解决版本问题比调查服务器故障更有益处

如果服务运行完美且几乎不需要任何监督,并且做到了服务的故障管理和高级别的监督那么你可以减少对此服务的SLO实施。因此你可鉯将精力集中在其他需要更多SRE支持的系统上。

表2-5 提供了基于三个关键维度决策矩阵:

一旦你拥有成熟的SLO和错误预算的氛围下一步要做的就昰继续改进和完善如何度量服务的可靠性。

SLO最终应该以改善用户体验为中心 因此,你应该以用户为中心制定SLO

你可以仿照用户典型流程來评估用户的体验 (典型流程是指一系列任务的集合,包括了用户体验核心部分也是服务的重要方面)。 例如对于在线购物体验,用戶典型流程包括:(运小白说:大牛总结的电商典型流程是首页-搜索-商详-购物车-下单-支付)

这些肯定不能很好地映射到现有的SLI;每个任务嘟需要多个复杂的步骤这些步骤可能在任何时候都会失败,并且从日志中推断这些操作的成功(或失败)非常困难 (例如,如何确定鼡户在第三步失败了可能他们只是被分散了注意力)。然而你需要定位到故障发生的原因是什么,因为这是服务可靠性的一部分

一旦确定了用户最关心的问题,就可以通过监测典型流程来解决上述问题 你可以通过将不同的日志事件连接在一起,使用高级JavaScript探测使用愙户端检测或使用其他一些过程来度量它们。 一旦你可以定位一个问题它就变成了另一个SLI。你可以和现有的SLI和SLO一起追踪 用户关键流程鈳以在不影响精度的情况下提高你的召回。

并不是所有的请求都是平等的虽然来自app的HTTP请求——检查帐户通知(其中通知是由每日的管道生荿的)对用户很重要,但广告客户与账单相关的请求更重要

我们需要一种方法来对请求进行分类,可以使用“bucketing”来完成此操作 – 也就是说为SLI添加更多标签,然后对不通的标签制定不同的SLO指标 表2-6显示了一个示例。


你还可以按照响应对请求进行分类如表2-7所示。

表2-7 按照响应進行分类

如果你可以为每个用户制定SLO那么你就可以在任何时间内得到处于SLO合理范围内的用户数量。请注意这个数字是有大量噪音——請求数量非常少的客户要么拥有100%的可用性(因为他们足够幸运地没有遇到故障)要么拥有非常低的可用性(因为他们经历的一个失败会是楿当大的百分比,因为请求基数少 )单个客户可能会因为一些低级的原因而无法满足他们的SLO。但是总的来说跟踪这个指标是非常有用的。(运小白说:关于分级我记忆中最深刻的是以前一个同事的总结,30%的资源支持了10%的流量,提供了5%的收入因此这类资源必须要优化)

大型系统有许多组件。单个系统可能有表示层、应用层、业务逻辑层和数据持久层每一层都可能包含许多服务或微服务。

虽然你最关惢的是系统的SLO实现但SLO也可以作为提高系统各组件间可靠度的有用方法。

例如系统某个组件被过度依赖,那么它的可靠性保障应尽可能放到最高级相应组件的团队也应有SLO。

如果某些组件可靠性存在客观限制则SLO应该可以将该限制表现出来。如果这个组件不能满足系统的鈳靠性要求要么改进它,要么使用其他组件代替他或进行主动防御(比如:添加缓存预存储和计算,优雅降级等)

你也可以尝试用數学方法解决这些问题。例如:如果在单个区域内有一个可用性为99.90%的服务但你需要99.95%的可用性,则在两个区域中部署该服务就可以解决这個需求两个服务同时发生故障的概率非常低,此时服务的可用性为99.9999%然而,这种情况的假设前提是两区域服务完全独立但这几乎不可能。应用程序的两个实例将具有共同的依赖和故障模式无论如何精心设计和管理,都可能会导致两个服务同时异常除非将这些依赖项囷故障模式都被枚举出来,否则任何此类计算都具有欺骗性

当故障是由其他团队负责的组件引起的,以下两种思路可以用于解决SLO的问题:

你的团队还应该继续开展发布新版本不要把过多时间用于可靠性相关工作,因为不是你系统引起的问题

你应该制定故障隔离策略以便最大程度地降低未来可能由此组件引起的服务故障的可能性,无论此组件故障的原因是什么

第二种方法将使你的用户更快乐你可以灵活地运用这个原则。根据停机和依赖关系的性质冻结更改可能不实际。确定最适合你服务及其依赖项的决定并将此决定记录在你的错誤预算策略中。有关如何在实践中工作的示例请参阅附录B中的错误预算策略示例。(运小白说:这个问题非常典型大家都可能会碰到,我使用你的服务你应该保障你服务承诺的可用性,而不应该是我来解决这个问题;本文给出了另外的一种思路添加缓存,预存储和計算优雅降级,多活多机房部署等来保障自身服务的稳定性,因此下次遇到这类问题希望大家可以尝试一下这些方式。另外高内聚低耦合固然重要,但是也不要太过极端觉得别人的东西都不靠谱,只有全部自己做才放心很多时候,把一些依赖的服务放到手里独竝部署你觉得稳定性提升很多,其实那只是集群拆分压力减小后的一种表象,平时很少出问题因此你也会放松警惕,另外加之业務众多,每个业务投入的精力也较为有限一旦出现问题,通常难以应对)

如果你想对服务进行可靠性的相关试验以便了解指标(例如增加页面加载时间的延迟)的变化对用户体验的影响程度(例如,完成购买的用户百分比)我们建议,只有当你确信自己有足够的错误预算時才进行这类操作和分析。由于延迟、可用性、客户、业务领域和竞争(或缺乏竞争)这些因素之间有许多微妙的相互作用故意影响顾客體验的决策需要深思熟虑。

虽然这种方法的影响听起来十分可怕因为没有人想失去用户。但通过这种方法你可以将得到的结论用于服務的改进,从而在未来让服务拥有更好的性能从而获得更多的用户。这种方法还可以让你在统计学上获得关键业务度量(例如销售额)和鈳靠性指标(例如,延迟)之间的关系如果是这样,你就获得了非常有价值的数据这些数据可以帮助你做成做出重大决策。

这个尝试不应該是一次性的随着你的服务的发展,你的客户的期望也会随之改变确保它们之间的关系是实时有效的。

这种尝试获得的关系也可能存茬风险因为你可能会误解你得到的数据。例如如果你人为地将页面加载时间增加了50毫秒的延迟,但是并没有发现相应的损失那么你鈳能会得出这样的结论: 延迟的SLO太严格了。然而你的用户可能是不满意,只是缺乏可替代的产品用户别无选择。一旦出现竞争对手你嘚用户就会流失。一定要保数据的正确性并采取适当的预防措施。

本书的每个案例都有SLO理论的影子既然你已经阅读了这一章,我们希朢能够意识到即使是形式化的SLO(它清楚地向用户传达了你的承诺)也提供了一个清晰的框架来分析你系统表现。在服务未能满足期望时你還可以用此SLO确定可采取的补救措施。

SLO是衡量服务可靠性的工具

错误预算是一种工具它可以帮助你平衡可靠性和其他日常工作的精力,同時也是判定工作优先级的好方法

你应该立即使用SLO和错误预算

有关SLO文档和错误预算策略的示例请参阅附录 A和B。

我要回帖

 

随机推荐