《SRE实战手册》学习笔记之切入SRE

2022-04-01 21:24:59 浏览数 (2)

前言

我自己一直是专注在性能测试和稳定性保障领域的,因此买了很多相关的技术课程学习。

极客时间上赵成老师的《SRE实战手册》是线上稳定性保障领域很好的一门技术课程。

这篇文章是学习笔记的第二篇,理解SRE之后,就要找到切入点来落地。

理解SRE中的指标和目标

SRE强调稳定性,一般是看整体的系统情况,也就是常说的"3个9"、"4个9"这样可量化的数字。这个“确定成功请求条件,设定达成占比目标”的过程,在SRE中就是设定稳定性衡量标准的SLI和SLO的过程。

1、SRE的两个核心

SLI(Service Level Indicator):服务等级指标,即选择哪些指标来衡量稳定性(状态码为非 5xx 的比例);

SLO(Service Level Objective):服务等级目标,指设定的稳定性目标(大于等于 99.99%);

落地SRE的第一步:选择合适的SLI,设定合理的SLO,SLO是SLI要达成的目标。

监控体系是SRE体系中很重要的组成部分,也是最直观的指标产出展示方式。

2、常见的监控指标
3、选择监控指标的考量点

两个因素

  1. 要衡量谁的稳定性?即先找到稳定性主体;
  2. 这个指标能够标识这个实例是否稳定吗?

两大原则

  1. 选择能够标识主体是否稳定的指标,如果不是该主体本身或不能标识主体稳定性的指标,就要排除在外;
  2. 针对电商这类有用户界面的业务系统,优先选择与用户体验强相关或用户可以明显感知的指标;
4、快速识别SLI指标的方法

VALET是5个单词的首字母,分别是Volume、Availability、Latency、Error 和 Ticket。

1)Volume-容量:指服务承诺的最大容量是多少。比如一个应用集群的 QPS、TPS、会话数以及连接数;

2)Availablity-可用性:代表服务是否正常。比如请求调用的非 5xx 状态码成功率,就可以归于可用性;

3)Latency-时延:指响应是否足够快,这是会直接影响用户体验的指标。时延的分布符合正态分布,建议以类似“90%RT<=80ms,或者 95%RT<=120ms”这样的方式来设定时延SLO的置信区间。设定不同的置信区间来找出这样的用户占比,有针对性地解决;

4)Errors-错误率:错误率有多少?除了 5xx之外,还可以把 4xx列进来,或增加一些自定义的状态码,看哪些状态是对业务有损的,来保障业务和用户体验;

5)Tickets-人工介入:是否需要人工介入?如果一项工作或任务需要人工介入,那说明一定是低效或有问题的,这里可以将tickets理解为门票。一个周期内,门票数量是固定的,比如每月 20 张,每次人工介入,就消耗一张,如果消耗完了,还需要人工介入,那就是不达标了。

5、Google-VALET-dashboard

Google的SLI和SLO设定模板链接:

https://landing.google.com/sre/workbook/chapters/slo-document

6、如何通过SLO计算系统可用性

系统可用性Availability = Successful request / Total request,常见计算方式有如下两种:

1)根据成功的定义来计算:Successful =(状态码非 5xx)&(时延<=80ms);

2)SLO方式计算:Availability=SLO1&SLO2&SLO3(即综合维度的指标衡量);

SLO1:99.95%状态码成功率;

SLO2:90%RT<=80ms;

SLO3:99%RT<=200ms;

对系统相关监控指标要分层,识别出我们要保障稳定性的主体(系统、业务或应用)是什么,然后基于这个主体来选择合适的 SLI 指标。不是所有的指标都是适合做 SLI 指标,它一定要能够直接体现和反映主体的稳定性状态。可以优先选择用户或使用者能感受到的体验类指标,比如时延、可用性、错误率等。

达成稳定性目标的共识机制

知道了SRE核心是设定目标和指标,但在具体落地过程中,该如何找到切入点呢?反过来看,可以制定一个允许犯错的次数标准,只需要去监控这些错误,就是一个很好的落地切入点。

1、设定错误预算

允许犯错的次数标准在SRE体系中叫做Error Budget,即错误预算。错误预算其实和驾照记分制是一样的,最大的作用就是“提示你还有多少次犯错的机会”。

错误预算的计算方式通过SLO推导得到,参考计算公式:Availability=SLO1&SLO2&SLO3。

2、如何应用错误预算

2.1稳定性燃尽图

特点:尽可能直观的将错误预算表现出来,随时可以看到它的消耗情况。同时加入错误预算消耗告警,如达到80%时开始预警,通过控制各种变更等手段来降低预算消耗频次。

参考:Google的错误预算燃尽图

注意事项

  1. 应用错误预算,应该设定合理的周期,推荐4个自然周;
  2. 要考虑到特殊场景如双11大促,如果这些特殊场景处在某个考核周期内,应适当放大错误预算的值;

2.2故障定级机制

判断一个问题是不是故障,除了看影响时长,还有一点就是按照问题消耗的错误预算比例来评估。通过错误预算来定义故障等级就可以做到量化,一旦可以被量化就意味着可以标准化,有了标准就可以进而推进达成共识。

参考:业内常见的故障定级维度和定义

P0:系统中断1小时以上,造成大范围的用户不可用; P1:系统中断30分钟到1小时,造成部分用户不可用; P2:系统核心模块或功能出问题,造成大量用户投诉; P3:系统次要模块或功能出问题,造成部分用户投诉; P4:便于模块或功能出问题,未导致不可用或投诉,但影响用户体验;

其他维度:如造成公司资产损失超过一定额度或者企业品牌受影响,这些因素要综合考虑!

2.3稳定性共识机制

由于每个人对稳定性的认知不同,因此通过建立稳定性共识机制并且积极推动,也是一种很好的实践方式。

参考:推动稳定性共识机制的2个指导原则

  1. 预算充足或者未消耗完之前,对问题的发生要有容忍度;
  2. 剩余预算消耗过快或即将消耗完之前,SRE 有权中止和拒绝任何线上变更;

从推行的角度来讲,涉及到跨团队沟通共识机制。建立稳定性共识机制一定是 Top-Down,也就是自上而下,至少要从技术 VP 或 CTO 的角度去推行。当有意见不一致的情况出现时,还要逐步上升,直至CTO角度来做决策。一定要自上而下推进周边团队或利益方达成共识。

2.4基于错误预算的告警

监控告警有一点很重要的是告警降噪收敛。即不要被“狼来了”的告警搞定疲惫不堪,要有对应的处理机制。

参考:Google基于SLO和错误预算的几种告警算法

链接:https://landing.google.com/sre/workbook/chapters/alerting-on-slos/

  1. 告警合并:即相同或相似的告警,合并后发送;
  2. 基于错误预算告警,即只关注对稳定性造成影响的告警,如“单次问题错误预算消耗超过20%”;
3、如何衡量SLO的有效性

衡量 SLO 及错误预算策略是否有效,就是看实际运行后是否真的能达到我们的期望。见下面三个关键维度:

  1. SLO达成情况:用达成(Met),或未达成(Missed)来表示。
  2. "人肉"投入程度:英文表示为Toil,泛指需要大量人工投入、重复繁琐且没有太多价值的事情。用投入程度高(High)和低(Low)来表示;
  3. 用户满意度:Customer Satisfaction,可理解为用户体验,通过真实和虚拟的渠道获得。真实渠道如客服投诉、客户访谈和舆情监控获取;虚拟渠道如真机模拟拨测。用投入程度高(High)和低(Low)来表示;

参考:不同维度不同情况的应对策略

针对上述的几种情况,将这些策略总结起来,主要有如下三种策略:

3.1收紧SLO

原因为目标设定太低,即SLO达成(Met),但是用户不满意(Low),常见表现方式为客诉增多或内部吐槽变多;

3.2放宽SLO

原因为目标设定太高,SLO达不成(Missed),但用户反馈很不错(High),这样会造成错误预算提前消耗完,导致很多变更暂停,产品延期,甚至会做一些无谓的优化,这时可以适当放宽SLO;

3.3保持现状,对有问题的维度采取针对性的优化

在SLO可以达成的情况下,尽量提升用户价值交付效率,围绕这个终极目标,不断优化自己的SLO和错误预算策略。

落地SLO时要考虑的因素

1、确定核心链路SLO

所谓核心链路,即某个系统为用户提供业务价值的主流程。

以电商系统来说,导购-搜索-商品详情-购物车-下单-支付即为核心链路。

指导原则:先确定核心链路的SLO,然后根据核心链路进行SLO拆解。

1.1确定核心链路

通过全链路跟踪的技术手段来找出所有应用,即呈现出调用关系的系统拓扑图。

常见工具:cat、jaeger、zipkin、pinpoint、skywalking。

1.2确定核心应用

根据业务场景和特点,从繁杂的应用中通过不断讨论和分析来确认核心应用。

以电商系统为例,核心应用一般有index、search、product、order、coupom、payment等。

参考:核心交易链路图

1.3确认强弱依赖

核心应用之间的依赖关系,称之为强依赖,而其它应用之间的依赖关系,我们称之为弱依赖。

其中包含两种关系,一种是核心应用与非核心应用之间的依赖,另一种是非核心应用之间的依赖。当然,还可以通过其他方式确认强弱依赖关系,比如:是否可以直接熔断等。

2、设定SLO的四大原则

2.1核心应用的SLO要更严格,非核心应用可以放宽。这么做是为了确保SRE精力能够更多地关注在核心业务上;

2.2强依赖之间的核心应用,SLO要一致。如下单的 Buy 应用依赖 Coupon 这个促销应用,我们要求下单成功率的 SLO 要 99.95%,就会要求 Coupon 的成功率 SLO 也要达到 99.95%;

2.3核心应用对非核心的弱依赖,有降级、熔断和限流等服务治理手段。这样做是为了避免由非核心应用的异常而导致核心应用 SLO 不达标;

2.4核心应用错误预算要共享,如果某核心应用错误预算消耗完,那整条链路原则上都要停止变更操作。可以根据实际情况适当宽松,如果某核心应用自身预算充足,且变更不影响核心链路功能,可以按照自己的节奏继续做变更。

3、如何验证核心链路SLO

3.1容量压测

容量压测的主要作用,就是看 SLO 中的 Volume,也就是容量目标是否可以达成。

另一个作用就是看在极端的容量场景下,验证限流降级熔断等服务治理策略是否可以生效。

3.2Chaos Engineering-混沌工程

混沌工程可以帮助我们做到在线上模拟真实的故障,做线上应急演练,提前发现隐患。

容量压测是模拟线上真实的用户访问行为,混沌工程是模拟故障发生场景,主动产生线上异常和故障。

混沌工程是 SRE 稳定性体系建设的高级阶段,一定是 SRE 体系在服务治理、容量压测、链路跟踪、监控告警、运维自动化等相对基础和必需的部分非常完善的情况下才能考虑

4、如何选择系统验证的时机

参考:Google的建议

4.1错误预算充足就可以尝试,尽量避开错误预算不足的时间段。因为在正常业务下,我们要完成 SLO 已经有很大的压力了,不能再给系统稳定性增加新的风险。

4.2评估故障模拟带来的影响,比如,是否会损害到公司收益?是否会损害用户体验相关的指标?如果造成的业务影响很大,那就要把引入方案进行粒度细化,分步骤,避免造成不可预估的损失。

4.3选择业务量相对较小的情况下做演练。这样即使出现问题,影响面也可控,而且会有比较充足的时间执行恢复操作,同时在做全链路压测之前,先进行单链路和混合链路演练,只有单链路全部演练通过,才会执行更大规模的多链路和全链路同时演练。

4.4生产系统稳定性在任何时候,都是最高优先级要保证的。不能因为演练导致系统异常或故障,这是不被允许的。所以,一定要选择合适的时机,在有充分准备和预案的情况下实施各类验证工作。

0 人点赞