马哥 Linux SRE + AIOps智能运维文档
第 42 章 / 42

SRE

← 上一章:CICD DevOps | 返回总目录 | [下一章 →]


  • 产品研发团队和SRE团队一起为服务及用户选择适当的可用性目标,并将确保达成

  • 尽力减少“人肉”投入,推动问题解决的自动化

    • SRE不倡导甚至是反对任何不必要的“人力”介入,要尽可能地减少手工操作

    • Google实践的SRE对团队成员可以花费在辛勤劳动上的投入作为硬件规定:不得超过50%

  • 通过降低失败成本而提升服务效能

    • SRE的好处未必一定要可靠性提升,实际上,它的好处更在于改进产品开发的输出速度,因为MTTR的降低, 减少了工程师将时间浪费在解决问题之上的精力成本
  • 与开发团队共享所有权

    • SRE倾向于关注生产问题而非业务逻辑问题(那是研发人员的任务),但他们也会创建出软件工程工具来解决问题,这些工具能共享给研发团队为其工作提供基础支撑

    • SRE更关注服务的可用性、延迟、性能、效率、变更管理、监控、应急响应和容量规划方面的需求

    • 产品开发和SRE团队应该对技术栈有一个一致的观点——前端、后端、库、存储、内核和物理机

http://www.magedu.com

SRE和DevOps

 对比

DevOps是一套有关运维和产品开发之间全生命周期协作的广泛原则。

SRE是一个工作角色,一组有效的实践,以及激励这些实践的信念。

http://www.magedu.com

什么是SRE?

  • 全称为:Site Reliability Engineering,由Google工程副总裁Ben Treynor Sloss首次提出

  • “SRE就是让一个软件工程师来主导设计一个新型运维团队的结果。”

    • Google SRE团队主要是两类工程师

      • 软件工程师(50-60%)

      • 具有系统及网络知识的但开发能力稍弱一些的软件工程师(40%-50%)

    • SRE团队的所有成员必须非常愿意,也非常相信用软件工程的方法可以解决复杂的运维问题

      • 对重复性的手工操作有天然的排斥感

      • 有足够的技术能力快速开发出软件系统替代手工操作

  • 从本质上来说,SRE就是用软件工程的思维和方法论完成之前由系统管理员团队手动完成的任务,团

  • 队成员倾向于通过设计、构建自动化工具来取代人工操作

    • SRE模型成功的关键在于对软件工程的关注,从而避免了传统Ops团队规模随产品规模和流量规模增长而线性成长的局面

    • 因此,SRE团队必须有足够的时间进行编程,Google的SRE团队甚至设立了50%的硬指标

  • SRE是一门工程科学 ,旨在帮助组织在其基础设施和应用系统中可持续地达成预设的可靠性目标

http://www.magedu.com

SRE 核心职责

 SRE的核心职责主要体现在以下几个方面

  • 可用性改进

  • 延迟优化

  • 性能优化

  • 效率优化

  • 变更管理

  • 监控

  • 紧急事务处理

  • 容量规划与管理

  • 影响系统可靠性的常见因素

  • 人员误操作

  • 雪崩效应

  • 未经充分、完整测试的版本发布

  • 基础设施故障及定期升级维护

http://www.magedu.com

SRE 方法论

  • 确保长期关注研发工作

    • Google将SRE团队的运维工作限制在50%以内,余下的工作时间要投入到研发中

    • 无法满足该目标时,采取一些暂时性的措施将运维压力转移回开发团队处理,例如

      • 将生产环境发现的Bug和产生的工单转给研发管理人员去分配

      • 将开发团队成员加入到轮值on-call体系中共同承担轮值压力

    • 这种措施可激励研发团队设计、构建出不需要人工干预、可以自主运行的系统

    • 所有的产品事故都应该有对应的复盘

      • 事故发生、发现、解决的全过程

      • 事故的根因,预防或者优化解决方案

  • 在保障服务SLO的前提下最大化迭代速度

    • 产品和运维团队间最主要的矛盾是迭代创新的速度与产品稳定程度之间的矛盾

    • SRE使用“错误预算(error budget)”正面这种矛盾

      • 100%可用并非正确的可靠性目标:任何软件系统都不是,也不应该追求做到100%可靠

      • 基于用户期待的可用性标准建立一个合理的可靠性目标,错误预算=“1-可靠性目标”

      • 产品研发部门和SRE部门可以在这个范围内将预算用于新功能上线等任何与产品创新相关的事务

    • 基于错误预算,可靠性目标不再是“零事故运行”,于是,生产事故也不再是一件坏事,而是创新流程中一个不可避免的环节,产品研发团队和SRE团队通过协作共同管理这些事故

http://www.magedu.com

SRE 方法论(2)

  • 监控系统

    • 合理的指标设计和告警策略是提升系统整体可用性的必要手段

    • 监控系统不应该依赖人工来分析告警住处,而是由系统自动完成,仅当需要用户操作时,才发送通知

    • 监控系统应该只有三类输出:紧急警报(需要立即处理)、工单(在给定的时间窗口内处理)和日志(调度和事后分析时使用)

  • 应急事件处理

    • A = MTBF/(MTBF + MTTR)

      • MTBF:平均无故障时间

      • MTTR:平均修复时间

    • 通常,人工操作是故障恢复过程最为消耗时间的因素,建设具有“自愈”能力的系统是首要目标

    • 不可避免地需要人工介入时,要有记录有清晰调度步骤和分析方法的“运维手册”指导快速修复

      • 运维手册及其使用要确保on-call的所有成员熟练掌握

      • 日常要有例行的故障应急演练

    • Google SRE的工作重心之一就是运维手册的维护

http://www.magedu.com

SRE 方法论(3)

  • 变更管理

    • 大约70%的事故由变更所触发

◼ 最佳实践是要能够自动化地完成以下任务

  - 采用渐进式发布机制

  - 迅速而准确地检测到问题

  - 出现问题时,要能安全、迅速地执行回滚
  • 需求预测和容量规划

    • 需求预测和容量规划简单来说就是保障一个业务有足够的资源冗余度去服务预测中的未来需求

    • ◼ 容量对系统可用性来说至关重要,SRE必须主导容量规划的过程及资源部署的过程

    • 一个业务的容量规划要考虑两个方面的因素

      • 自然增长:用户增长、流量增长等导致的资源用量上升

      • 非自然增长:新功能发布、商业推广等

    • 容量规划的步骤

      • 预测模型要能准备预测自然增长

      • 要合理、及时、准备统计各类可能的非自然增长

      • 必须要有周期性的压力测试,以获取系统的准确容量

http://www.magedu.com

SRE 方法论(4)

  • 资源部署

    • 部署新资源仅应该在必要的情况下进行

      • 资源通常有较高的成本

      • 部署和配置过程必须要确保能正确执行完毕

    • 新资源的部署与配置是一个相对危险的操作

      • 增加现有容量,通常需要启动新实例甚至是整个集群,这可能会导致大幅修改现有的集群配置

      • 同时还要执行一系列的测试,以确保新上线的资源可以正确地服务用户

  • 效率与性能

    • 对于商业组织来讲,必然追求高效地利用各种资源,以降低系统的总体拥有成本

    • 服务的利用率指标与服务的工作方式以及为其置备容量有关,于是,容量配置策略也就事关总体拥有成本

    • 业务在资源层面的需求通常由用户需求(流量)、可用容量和软件的资源使用效率驱动

http://www.magedu.com

接受风险,拥抱风险

 追求极端的可靠性会带来成本的极大上升

◼ 机会成本:限制了新功能的开发速度和将产品交付给用户的速度

◼ 冗余物理服务器/计算资源成本:基础软硬件成本大幅增加

  • SRE眼中的可靠性

◼ 寻求快速创新和高效的服务营业务之间的风险平衡,而非简单地将服务在线时间最大化

◼ 努力提高一项服务的可靠性,但不能超过该服务需要的可靠性,或者不能越过太多

 系统可用性评估方式

◼ 基于时间的可用性

  • 可用性=系统正常运行时间/(系统正常运行时间+停机时间)

  • 基于请求的可用性(请求成功率)

    • 可用性=成功请求总数/总的请求数

http://www.magedu.com

接受风险,拥抱风险(2)

  • 确定“可用性目标”

    • 目标应该因服务而异,通常取决于服务提供的功能,以及服务在市场上的定位

    • 确定可用性目标时需要考虑的问题

      • 用户期望的服务水平是什么?

      • 该服务是否直接关系到收入(自身的收入或者客户的收入)?

      • 是有偿服务,还是免费服务?

      • 市场上竞争对手提供的服务水平如何?

      • 该服务是ToB的业务,还是ToC的业务?

    • 成本是决定一项服务的可用性目标的一个关键因素

      • 构建和运维可用性再多一个“9”的系统,收益会增加多少?

      • 额外的收入是否能够抵消为了达到这一可靠水平所付出的成本?

  • 设立“错误预算”

    • 错误预算提供了一个明确的、客观的指标来决定服务在一个时间窗口内能接受多少不可靠性

    • 这能够排除SRE与产品研发部门谈判时的政治因素

    • 做法:错误预算=SLO-服务实际在线时间

      • 由产品管理层设定一个SLO,从而确定该服务在指定时间窗口内的预计正常运行时间

      • 由监控系统来判定服务的实际在线时间

http://www.magedu.com

接受风险,拥抱风险(3)

  • 产品研发小组和SRE小组的对立

    • 产品研发的绩效很大程度上是通过产品研发速度确立,这会激励员工尽可能快地创建新代码

    • SRE的绩效表现取决于该服务的可靠性,这意味着SRE会对高频率的更新提出抗议

    • 而两个团队间又存在着信息不对称:产品开发更了解编码和发布相关的事项,而SRE更了解服务的可靠性程度

  • 需要建立的共识,以帮助确立错误预算

    • 软件对故障的容忍度

      • 投入资源较少,故障率太高,程序过于脆弱;

      • 投入资源太多,运行非常稳定,也未必意味着产品用户会很多

    • 测试

      • 测试不充分,故障可能会频发,甚至出现严重问题,如泄露隐私数据

      • 过于强调测试,可能会失去市场先机

    • 发布频率

      • 每一次的发布都是有风险的;团队应该在减少风险上投入多少时间?
    • 金丝雀测试的持续时间和大小

      • 测试范围多大?

      • 要等多久?

http://www.magedu.com

服务稳定性治理

 SLI/SLO/SLA的制订与落地

 故障预防

 抑制不可控因素

  • 故障应急演练

 业务MTTR

 灾备建设

http://www.magedu.com

服务质量术语

  • SLI

    • 全称为Service Level Indicator,即服务质量指标

    • 用于评估服务的某项服务质量的一个可量化的角度

      • 性能指标:延迟、吞吐量、处理速率(TPS/QPS)和时效性(Freshness)

      • 可用性指标:可靠性、故障时间/频率、在线时间等

      • 质量指标:准确性、正确性、完整性、覆盖率

    • 大部分服务都将请求延迟 ——处理请求所需要消耗的时长——作为一个关键的SLI

    • 其它常用的SLI包括错误率 (请求处理失败的百分比)、 系统吞吐量 (每秒的请求数量)等

    • 服务可用性 (Availability)是另一个关键的SLI,它代表服务可用时间的百分比

      • 100%的可用性无法实现,但接近100%的可用性指标却是一个可以实现的目标

      • 运行行业通常用9的数量来描述系统的可用程度

http://www.magedu.com

服务质量术语(2)

  • SLO

    • 全称为Service Level Objectives,即服务质量目标

    • 用于定义某个SLI的目标值,或者目标范围

      • SLI ≤目标值,例如请求平均延迟低于100ms

      • 范围下限≤ SLI ≤范围上限

    • 选择一个合理的SLO是非常复杂的过程

      • 确立合理的目标值本身很困难,例如QPS由用户请求决定,也就无法为其订立目标值

      • 此时,只能从侧面去为延迟指标订立一个目标值来间接反应QPS

    • SLO又是基于数据驱动做出事关可靠性决策的关键要素,因此,它是SRE工程实践的核心

    • SLO应该以客户为中心,与客户的体验直接相关

      • SLO的核心目的是用于量化客户对产品和服务可靠性的体验
    • 一个好的SLO,应该是SMART的,应该是具体 、 有时限且可衡量的

      • Specific:特有,能明确表达其具体含义

      • Measurable:可测量,有具体数值

      • Achievable:可达成,不能是无法完成的目标

      • Relevant:要反应到用户体验相关

      • Timebound:要尽量只覆盖系统负载较重的时间段,以免被平均值稀释

http://www.magedu.com

服务质量术语(3)

  • SLA

    • 全称为Service Level Agreement,即服务质量协议

    • 指的是与用户签订的事关服务质量目标的合约,它描述了达成或未达成SLO的后果

      • 一般会具有一定的法律效力,往往涉及到服务付费、质量承诺和违约责任等

      • SLO往往由业务团队自己设立,而SLA则通常是非技术领域的律师或销售人员所设立

      • 但SLA最好能与业务团队的SLO相一致

    • 有些服务可能并未存一个SLA,但确保其较高服务质量却可能事关其形象,进而影响其业务收入 ◆ 例如公共搜索引擎

http://www.magedu.com

  • SRE不应该将监控系统中的所有指标都定义为SLI,只有理解用户对系统的真实需求才能真正决定哪

  • 些指标是否有用

  • 指标过多会影响对那些真正重要指标的关注,而选择指标过少则会导致某些重要行为被忽略

  • 常见的服务,根据它们的相关SLI通常会归类为以下几个大类

◼ 用户可见的服务系统:可用性、延迟,以及吞吐量

  • 可用性:是否能够正常处理请求

  • 延迟:每个请求花费的时长

  • 吞吐量:有多少请求可以被处理

  • 存储系统通常强调:延迟、可用性和数据持久性

  • 大数据系统:吞吐量和端到端的延迟

  • 所有系统:正确性

    • 是否返回了正确的回复,是否读取了正确的数据,或者是否进行了正确的数据操作

    • 正确性是系统健康程度的一个重要指标,但它取决于系统内部数据,而非系统本身,因此通常不是SRE负责的

http://www.magedu.com

故障自愈

 基于“主备”的冗余设计

◼ 存在切换不成功、切换后状态不一致等通病

◼ 要主节点故障导致主备切换后,一般需要尽早跟进问题并修复节点

 基于“负载均衡”的设计

 基于平台的设计

◼ 云平台,包括k8s系统上的自动恢复和扩缩容功能本身就是故障自愈的实现  基于业务架构的设计

◼ 许多分布式自身就能支持自愈机制,且大部分都涉及到了CAP原则

◼ 例如Zookeeper、Etcd等

http://www.magedu.com

灾备建设

  • 同机房灾备

    • 通常在同一机房跨机架基于两个以上的服务做主备集群

    • 运维工程师需要了解服务器的真实物理连接和部署拓扑

    • 容灾能力:同一机房内涉及到的单机或单机柜

  • 同城双活

    • 将业务部署至同一城市的两个机房中

    • 距离要足够远(不会被同一故障影响),又不太远(方便管理及建立起高速专用线路),50公里以内能确保网络延迟低于3ms

    • 两个机房间的通信链路需要高可用和高容量,需要双线,且应该基于不同的ISP链路

  • 异地数据灾备

  • 数据成为业务的关键资源时,进行异地灾备,能给影响到全市范围的灾害事件后储备恢复业务的基础

  • 两地三中心

    • 两个城市,三个数据中心的灾备方式,可以在城市级的灾害中,快速恢复上线业务,甚至是确保线上业务不离线

    • ◼ 需要从数据底层开始设计,通常的设计是数据库多写,然后互相进行数据同步

    • 需要对业务模块有清晰的认识,尽量降低应用请求的跨机房操作

    • 需要定制专门的数据同步工具,要支持数据路由和多路复制等功能

  • 分布式多活

    • 理论上出现故障,系统均能通过切换流量和数据的方式,确保业务继续运行

    • 系统自带数据同步和数据一致性逻辑,通常会基于Raft、Paxos等协议实现,支持全自动的灾备切换

http://www.magedu.com

故障排查

  • 故障排查是系统运维工作中的一项关键技能

  • 新手们常常不能有效地进行故障排查,是因为这个过程,在理想情况下同时需要两个条件

    • 对通用的故障排查过程的理解(不依靠任何特定的系统)

    • 对发生故障的系统足够了解

      • 理解系统内部运行的原理

      • 理解系统的设计方式和构建原理

  • 虽然只依靠通用性的流程和手段也可以处理系统中的一些问题,但这样通常很低效

http://www.magedu.com

故障排查(2)

  • 故障排查过程的定义

    • 反复采用“假设—排除”手段的过程

    • 针对某系统的一些观察结果和对该系统运行机制的理论认知,基于收到的问题报告, 不断地提出造成该问题的假设,进而针对这些假设进行测试和排除

  • 通过观察系统的监测指标、日志信息和请

  • 求跟踪信息了解系统目前的状态,再结合掌握的系统构建原理、运行机制,以及失败模型等提出一些可能导致失败的原因

故障报告定位检查诊断治愈测试/修复要考虑重新定位如果事情有变,需

http://www.magedu.com

故障定级

  • 事故等级制度

    • 团队只有知道相关问题的严重程度,才可以按照问题等级投入资源进行优化
P0 P1 P2
影响时间长度 大于30分钟 大于15分钟 大于1分钟
功能比例 错误率大于50% 错误率大于20%,小于50% 错误率小于20%
资金损失 10万元 1万~10万元 0~1万元
舆论影响 客户投诉大于1000例 客户投诉大于200例 客服投诉大于10例
  • 从SRE团队的角度看,发生一个严重事故时,往往意味着线上业务的稳定性受到了很大冲击

  • 这个时候SRE团队会决策接下来的线上运维策略执行收紧原则,开始严格控制变更频率,加强变更评审等方式压制可能继续导致线上稳定性波动的因素

http://www.magedu.com

异常响应流程

  • 异常处理环节的设计要求

    • 从SRE的角度来看,异常处理流程应该固化到平台上
处理环节 要求
异常发现 监控发现为主,用户反馈为辅
问题跟进 问题响应时间小于5分钟,一个人处理,一个人同步信息
问题升级机制 按照时间长度对问题进行汇报升级(15分钟升级通知到总监)
问题分析 需要完全定位问题
问题通知 有明确的通知机制,5分钟播报一次进度
问题解决 完全修复问题
问题后续追踪 暴露问题分析定性,安排跟进,形成处理闭环

http://www.magedu.com

服务器故障排查思路

  • 网站服务器崩溃的可能性原因

    • 服务器硬件故障或者系统内核Bug

    • 并发的多线程出现了死锁,或者后端数据库崩溃

    • 存放业务数据变动的磁盘空间耗尽

    • 流量过高,系统超载

      • 服务器硬件配置过低,正常流量增长下的系统超载

      • 正常的短暂性流量突增

      • 遭受攻击,出现异常流量尖峰

    • 触发了应用程序未曾测试出的潜在Bug,例如死循环或内存泄露等导致系统资源耗尽

    • ◼ 系统参数设置不合理,例如fd数量过低,或者是并发连接数上限过低

    • 人为误操作等

http://www.magedu.com

服务器故障排查思路(2)

  • 处理流程

    • 优先恢复业务

    • 借助监控、日志和跟踪信息分析问题,排查原因

    • 制订解决方案

    • 完善监控和告警机制

    • 复盘总结,避免重蹈覆辙

    • 完善知识库

  • 处理思路

    • 若处于“假死”状态,可以kill并restart业务进程;

    • 分析监控数据,尤其是注意排查宕机前的异常指标数据,比如CPU或内存尖峰等

    • 查看系统日志,获取详细信息

      • 查看/var/log/messages文件,分析宕机前后的系统日志,注意排查错误信息

      • 若启用了kdump,还要分析宕机生成的crash文件

      • 硬件故障相关的日志通常位于/var/log/dmesg

http://www.magedu.com

SRE究竟意味着什么?

 SRE:是一套用确保系统稳定性的体系化实践方法

◼ MTBF:Mean Time Between Failure,平均故障时间间隔,即平均无故障时间 ◼ MTTR:Mean Time To Repair,平均故障修复时长

参考自:https://time.geekbang.org

http://www.magedu.com

关于MTTR

  • MTTR的细分指标

    • MTTI:Mean Time To Identify,即平均故障发现时间

      • 从故障发生到SRE团队开始响应之间的时长

      • 该过程可能由用户或客服反馈、舆情监控或者监控告警所触发

    • MTTK:Mean Time to Know,平均故障获知时间

      • 更通俗的说法是,平均故障定位时间

      • 找出故障根因,完成故障定位

    • MTTF:Mean Time To Fix,平均故障修复时间

      • 从定位故障根因开始至业务恢复之间的时长

      • 对应的是解决问题的措施(例如限流、降级、熔断等)及效率

    • MTTV:Mean Time To Verify,平均故障验证时间

      • 故障解决后,借助于用户反馈、监控指标等手段,来确认业务是否真正恢复所消耗的时长

http://www.magedu.com

如何提升系统可用性

  • 提升可用性的方式

    • 缩短MTTR指标的时长

    • 拉长MTBF指标的时长

  • 措施方向

    • Pre-MTBF阶段

      • 在架构设计层面提升系统可用性,以冗余机制通过故障隔离降低MTTR:主从模式、集群模式、多AZ(Availability Zone)的高可用、单元化、跨地域(Region)容灾、异地多活容灾等

      • 在架构设计层面提升系统韧性:异步、重试、限流、降级、熔断、反压(降低下游效率低进而迫使上游承压)

      • 面向失败设计(Design-for-Failure),实现故障修复自动化

        • ⚫ 常见的失败:导致崩溃的Bug、OMM、系统负载过高导致的夯死、系统级软件的问题,以及混部场景中的作业干扰等 ⚫ 自动化修复是指在故障发性时自动触发事先准备的修复机制
      • 借助于“混沌工程”模拟故障场景,并设计合理的应对举措

    • Post-MTBF阶段

      • 故障复盘,找出不足,落地改进措施

      • 将更好地应对问题的预防机制常态化、例行化,并固化至日常操作流程中

    • MTTR阶段

      • 完善监控系统,提升故障告警的及时性和精准度,必要时可引入AIOps

http://www.magedu.com

如何衡量系统可用性?

  • 衡量系统可用性的方式

◼ 时间维度(故障自身的角度):Availability = Uptime / (Uptime + Downtime)

◼ 请求维度(实际的服务感受角度):Availability = Successful requests / Total requests

 故障的测量和判定

◼ 衡量指标:即用于进行衡量的角度

◼ 衡量目标:即在特定衡量角度上,用于区隔正常与不正常的临界值或阈值

◼ 持续时长/统计周期:在特定衡量指标上,其值处于不正常区间的时长

  • 短暂异常,持续时间较短,通常不被认作故障

  • 但频发性的短暂异常,就应该被视为稳定性不佳

  • 时间维度的可用性衡量机制无法对此场景进行精确描述

  • 请求维度的系统可用性衡量,是从成功请求占比的角度出发,对系统的稳定性进行评估 ◼ 更合理、更严谨

 设定系统稳定性目标时要考虑的要素

  • 成本因素:做好ROI评估

  • 业务容忍度

  • 系统当前的稳定性状况

http://www.magedu.com

SLI和SLO

  • 系统稳定性目标:数9衡量

    • SRE强调的稳定性,并非取决于单次请求的成功与否,而是基于大样本来设定一个可接受的目标

    • 这种“确定成功请求的条件,设定目标阈值”的过程,即是在SRE中设定稳定性衡量标准的SLI和SLO的过程

  • SLI和SLO

    • SLI:Service Level Indicator,即要监控的指标

    • SLO:Service Level Objective,即各监控指标分别对应的目标

  • 系统稳定性建设的关键就在于选定SLI,并分别为之设定合理的SLO

  • 常见的指标

    • 系统层面:CPU使用率、Load值、Memory使用率、磁盘使用率、磁盘IO和网络IO等

    • 应用服务器层面:端口存活状态、JVM的GC状况等

    • 应用运行层面:请求返回的状态码、时延、应用层QPS、TPS及连接数等

    • 中间件层面:MySQL、Redis、Kafka和分布式文件存储等各组件的类似于应用运行层面的指标

    • 数据层面:大数量处理平台的批处理或流处理任务,包含呑吐率、及时率和准确率等指标

    • 业务层面:以电商为例,有在线用户数、新注册用户数、下单数、交易数、支付笔数以及业务层面的成功率等指标

http://www.magedu.com

如何选择SLI

  • 从众多指标中快速选择SLI的方法:VALET (Volume, Availability, Latency, Error和Ticket)

    • Volume(容量)

      • 服务承诺的最大容量,例如一个应用集群的QPS、TPS、会话数及连接数等等,这些就是容量相关的SLI

      • 对这些指标设定一个日常目标,就是日常的SLO,对大促期间设定一个目标,就是大促的SLO

    • Availability(可用性)

      • 服务是否能够正常响应客户端请求

      • 请求调用的非5xx类响应码的占比,就是衡量可用性的常用指标

    • Latency(延迟)

      • 用于评估是否能够足够快地响应请求,通常用于评估每个请求是否能在规定的时间内完成

      • 该指标与用户访问体验相关

      • 时长通常符合正态分布,因而不应该使用平均值进行衡量,而要使用Histogram或Summary类型的指标

        • ⚫ 同时也应考虑极端情况,例如404的响应时间短到会影响整体分布,或者个别延迟较大的请求会长到影响整体分布
    • Errors(错误率)

      • 常规错误,例如5xx,以及高频度的影响到用户体验的4xx响应

      • 自定义状态码,包括对业务有损的状态码,例如热门商品的高缺货率、例如验证码的高错误率等

    • Tickets(人工介入)

      • 人工介入通常意味着低效

      • 可以为某服务设定一个Tickets总的数量指标

http://www.magedu.com

错误预算

  • 如何确保达成SLO?

    • 将容许的犯错空间转换为具体可行的指标(犯错的次数或标准),即错误预算(Error Budget)

    • ◼ 以具有冲击力的方式提示剩余的犯错机会

  • 如何应用Error Budget?

    • 稳定性燃尽图

    • 故障定级

      • 可以按错误预算在单次故障中消耗的比例进行定级

◆ 效用:借助于错误预算将故障定级量化

  • 稳定性共识机制

    • 剩余错误预算充足或未尽之前,对问题要有充分的容忍度

    • 剩余错误预算消耗过快或即将耗尽之前,SRE有权终止和拒绝任何线上变更

      • ⚫ 避免“带病工作”,并等待下一个预算周期

      • ⚫ 确保运维、运营、产品和开发就此达成一致

  • 基于错误预算的告警

    • 制订好告警收敛策略

    • 基于错误预算进行告警

http://www.magedu.com

如何衡量SLO的有效性?

  • 根据实际运行结果判定有效性,通常存在三个关键纬度

    • SLO达成情况:可用“达成(Met)”和“未达成(Missed)”标识

    • 人工介入程度(Toil):泛指大量人工投入、重复、繁琐的低价值事务,可用投入程度高(High)和低(Low) 标识

    • 用户满意度(Customer Satisfaction):可通过客服投诉、客户访谈或舆情监控等真实渠道获取,可用满意度高(High)和低(Low)来标识

总体处置策略有三种:
1、收紧SLO
2、放宽SLO
3、保持现状

参考自:https://time.geekbang.org

http://www.magedu.com

落地SLO 要考虑的因素

  • 确定核心链路

    • 一般来说,分布式在线系统的各服务通常可划分为核心应用和非核心应用两大类

    • 核心应用及其强依赖项组成的调用关系即为核心链路

      • 以电商系统为例,核心应用通常是指电商交易关键路径上的应用,例如首页、详情页、购物车、价格、优惠券、SKU 和支付等

      • 找出核心应用之后,还要确认这些应用的依赖项,核心应用彼此间的依赖构成“强依赖”,对核心应用的依赖即为弱依赖

参考自:https://time.geekbang.org

http://www.magedu.com

落地SLO 要考虑的因素(2)

 设定SLO的原则

  • 核心应用的SLO要严格,而非核心应用的可以放宽

  • 强依赖之间的核心应用,SLO要一致

  • 弱依赖项中,核心应用对非核心的依赖,要有降级、熔断和限流等服务治理手段

  • 错误预算策略中,任意核心应用的错误预算影响范围都是整个核心链路

    • 若某核心应用错误预算耗尽,原则上,整个链路都要暂停变更操作,直至问题完全解决
  • 验证核心链路的SLO的常用方法

    • 全链路压测

      • 判定容量目标能否达成,主要评估QPS和TPS,并确认扩容水位

      • 判定在极端容量场景下,预设的限流、降级、熔断策略是否能正常触发

    • 混沌工程

      • 主动模拟故障场景,测试线上应急机制,提前发现隐患

        • ⚫ 模拟机房断电,测试双活机房或备用机制的流量切换

        • ⚫ 模拟网络丢包或流量满载、磁盘写满、CPU满载、服务器重启、接口延迟、返回异常、线程池满载等

      • 会对线上业务造成影响

        • ⚫ 必须事先在隔离环境中反复演练

        • ⚫ 在模拟的故障超出预估时要能快速进行隔离,快速恢复业务

      • 是SRE稳定性体系建设的高级阶段,要在服务治理、全链路压测、链路跟踪、监控告警和运维自动化建设完善后考虑

http://www.magedu.com

全链路压测

http://www.magedu.com

Thank You!

确保用于研发工作的工作时间比例: 50%

经常度量团队成员的时间分配,确保目标达成确保长期关注研发工作将查找生产环境 Bug 的工单转给研发团队研发时间比例因 “ 人肉 ” 运维工作繁重而无法达成将研发团队成员加入 on-call 轮值时的解决方案督促研发团队设计、构建不需要人工干预,可自主运行的系统在保障服务 SLO 的前提下最大化迭代速度充分利用监控系统监控服务质量
A=MTBF/(MTBF+MTTR )
基于主备的系统设计基于负载均衡的系统设计故障自愈基于带自愈能力平台(例如 Kubernetes )的系统设计基于分布式业务架构的设计提升 MTBF
同机房灾备同城双活应急事件处理
SRE 方法论灾备建设异地数据灾备提升系统可靠性的途径两地三中心分布式多活尽可能减少人工操作降低 MTTR
创建有自愈能力的系统持续维护和改进的 “ 运维宝典 ”
不得已的人工操作故障梳理故障演练故障预案混沌工程变更管理需求预测和容量规划资源部署效率与性能

复杂信息系统的运行和维护需要由专业人员(运维)完成运维团队的核心职责在于减少故障的发生对立的岗位职能研发团队的核心职责在于快速构建和发布功能部署新版本的业务应用变更是导致绝大部分生产故障的 “ 罪魁祸首 ” 传统时代修改系统的配置 “ 政治斗争 ” 必然发展为保障各自利益的手段运维制订严苛的发布规范,减少发布、降低故障概率运维团队与开发团队对 “ 风险 ” 的定义不一致研发创造出功能开关调整、增量更新和补丁化机制避开 “ 发布 ” 流程为何需要 SRE 通过雇佣软件工程师,创造软件系统来维护系统运行以代替传统模型中的人工操作对重复性的手工劳动具有天然的排斥感 SRE 团队成员的特点 SRE 的解决之道有足够的技术能力快速开发出软件系统以替代手工操作采用工程化的方式来应对运维问题 Google SRE 要求团队成员必须将 50% 的工作时间用于工成功的关键具开发通过持续、工程化的解决方案,规避随系统规模增长而导致的运维团队的线性增长

若软件工程师职业主要专注于设计和构建软件系统,那么应该有另外一种职业专注于整个软件系统生命周期管理。从其设计一直到部署,历经不断改进,最后顺利退役。

这一种职业必须具备非常广泛的技能,但是和其他职业的专注点都有不同他们关注的焦点在于
SRE,中文全称为“站点可靠性工程” ,
可靠性
SRE并不是无止境地追求完美:当一个系统已经“
足够可靠”时,SRE便将精力转而投入到研发新的
功能和创造新的产品中去
SRE团队通过雇佣软件工程师,创造软件系统来
维护业务系统运行以代替传统模型中的人工操作
对重复性、手工性的操作有天然的排斥感
有足够的技术能力快速开发出软件系统以替代手
工操作
特点 倾向于将基本的运维工作全部消除,全力投入在
研发任务上
终极目标是推动整个系统朝向于无人化运行,而
非仅仅自动化其中的部分人工流程
SRE团队成员必须将50%的精力花在真实的研发
工作上
SRE概述 SRE团队的目标不再是传统的“零事故”运行
可用性改进 SRE团队和产品研发团队的目标一致,即在保障业务服务
可靠性需求的同时,尽可能地加快功能上线速度
延迟优化
性能优化
效率优化
大概有70%的生产事故由某种部署的变更而触发
变更管理 采用渐进式发布机制
变更管理的最佳实践是使用自动化完成几个关键操作 迅速而准确地检测到问题的发生
出现问题时,安全迅速的完成回滚
监控 监控系统不应该依赖人来分析告警信息,而是应该由系统
自动分析,并采取操作完成自愈
职责 仅当需要用户执行某种操作时,才需要通知用户
致力于创建有自愈能力的系统,尽可能减少人工介入
必须人工介入时,需要由“运维手册”做为保障,而不能依
赖于个别经验丰富的万能工程师
应急事件处理 需要进行故障修复时,巨大压力下,运维手册中的清晰调
试步骤和分析方法至关重要
正确的做法:由经历过多次演习的on-call工程师基于运
维手册进行故障处理
Google SRE将大部分工作重心放在维护”运维手册“之上
SRE可以通过模型预测用户需求,合理部署和配置可用容
量,同时改进软件以提升资源使用率
容量规划与管理 有一个能准确预测需求自然增长的模型
容量规划的几个必要步骤 准确的非自然增长需求来源的统计
进行周期性压力测试,在系统原始资源信息与业务
容量建立起准确的对应

服务质量目标( SLO )

服务质量指标(Service Level Indicator) 用于评估服务的某项服务质量的一个可量化的角度
度量服务质量时最为重要的几项指标
请求延迟:处理请求所消耗的时长
错误率:请求处理失败的百分比
系统吞吐量:每秒的请求数量
可用性:服务可用时间的百分比,常用9的个数来表
达
理想情况下,SLI应该直接度量某一个具体的服务质量
直接度量信息难以获取,或无法预测时,则要使用其它指
标进行替代
服务上某个SLI的目标值,或者目标范围 SLI ≤目标值,例如请求平均延迟低于100ms
范围下限≤ SLI ≤范围上限
SLO又是基于数据驱动做出事关可靠性决策的关键要素,
因此,它是SRE工程实践的核心
确立合理的目标值本身很困难,例如QPS由用户请
求决定,也就无法为其订立目标值
服务质量目标(Service Level Objective) 选择一个合理的SLO是非常复杂的过程 此时,只能从侧面去为延迟指标订立一个目标值来
间接反应QPS
服务质量术语(SLI、SLO和SLA) SLO应该以客户为中心,与客户的体验直接相关 SLO的核心目的是用于量化客户对产品和服务可靠性
的体验
Specific:特有,能明确表达其具体含义
一个好的SLO,应该是SMART的,应该是具体、有时限 Measurable:可测量,有具体数值
Achievable:可达成,不能是无法完成的目标
且可衡量的 Relevant:要反应到用户体验相关
指的是与用户签订的事关服务质量目标的合约,它描述了
达成或未达成SLO的后果
区别SLO和SLA的一个简单方法是问“如果SLO没有达到
时,有什么后果?”
Timebound:要尽量只覆盖系统负载较重的时间
段,以免被平均值稀释
一般会具有一定的法律效力,往往涉及到服务付费质量承诺和违约责任等
服务质量协议(Service Level Agreement) SLA的特性 、
SLO往往由业务团队自己设立,而SLA则通常是非技
术领域的律师或销售人员所设立
但SLA最好能与业务团队的SLO相一致
有些服务可能并未存一个SLA,但确保其较高服务质量却
可能事关其形象,进而影响其业务收入
基于用户对系统体验的真实需求确定有效的指标
选择指标时的注意事项 指标一般以四五个为最佳 过多的指标会淹没真正重要的指标
指标过少会遗漏系统的某些重要行为
用户可见的服务系统(前端) 可用性:是否能正常处理请求
延迟:每个请求花费的时长
吞吐量:多少请求可以被处理延迟:读写数据需要的时长
服务分类及其关键指标 存储系统
可用性:是否可以随时访问数据
数据持久性:一段时间之后是否仍然可用
在实践中如何确定指标 大数据系统 吞吐量:处理的数据量
端到端的延迟:数据从输入到产出经历的时长
是否返回了正确的响应
所有系统都应该关心”正确性“
是否读取了正确的数据
借助于监控系统(例如Prometheus),大部分指标都能
轻松完成收集
是否进行了正确的数据分析操作
指标的收集与汇总 汇总需要小心进行,大部分指标都应该以”分布“而非平均
值来定义
将一些常见的SLI标准化,可以避免每次都要重新评估
指标的标准化 汇总间隔:每1分钟汇总一次
汇总范围:集群中的全部任务
常用的标准 度量频率:每10秒钟一次
包含哪些请求:从黑盒监控任务发来的HTTP GET请
求
数据如何获取:通过监控系统获取数据访问延迟:从收到请求到最后一个字节被发出
SLO应该具体指出它们的度量方法以及有效条件以进行清
晰定义
目标的定义 在事关性能的一个指标上,可以指定多个SLO
应该为不同的用户类型(例如批处理用户和在线用户)设
定不同的SLO
不应该要求SLO能够100%达成,以免影响创新和部署的
速度,或增加一些成本过高、过于保守的方案
确立SLO并非纯粹的技术活动,还涉及产品和业务层面的
决策
不要仅以目前的状态为基础进行目标选择
目标的选择 保持简单
关于目标选择需要讨论的一些方向
避免绝对值
如何在实践中为指标确立目标 SLO越少越好
监控并且度量系统的SLI 不要追求完美
控制手段(SLI和SLO在决策系统运维时也非常有
用)
比较SLI和SLO,以决定是否需要执行操作
若需要操作,则要决定执行何种操作以满足目标
执行这些操作
留出一定的安全区 对内使用更高的SLO
SLO可以帮助用户建立正确的预期 实际的SLO也不要过高 对外使用稍低的SLO
琐事特指那些在运维服务中手动性、重复性、可
被自动化的,战术性,没有持久价值的工作
琐事与服务数量呈线性关系,会随服务数量的增
加而线性增长
何为琐事 手动性:需要手工介入的操作,例如手动运行脚本
重复性的:至少三次以上的、重复执行的任务
可被自动化:能够设计程序执行相关的操作
每个琐事都满足的一个或多个属性 战术性的(非战略性的):突发、临时、应对式的任务,
非由策略驱动,也非主动安排
没有持久价值:执行的操作无法为服务带来户外性的改变
与服务同步呈线性增长:工作中任务量与服务的大小、流
量或用户数量㕵线性增长关系
琐事太多,通常意味着不佳的系统设计,很多复
杂性也是不必要且能够人为减少甚至消除的
例如,某项服务可能每天都要发出数次告警,并且每个告
警都需要大量主观判断的复杂响应
重新设计和重构完成以及完整发布之前,依赖主观判断来
应对每个告警的工作就属于琐事的范畴
为何琐事越少越好 若不加控制(例如不得超过50%),琐事会变得越来越
多,直到占据团队成员的所有工作时间
SRE需要将50%的时间花在工程项目上,以减少
未来的琐事或都加服务功能;增加服务功能包括
提高可靠性、性能或利用率,同时也会进一步消
除琐事
减少琐事和扩大服务规模的工作就是SRE中的E(
Engineering)
对工程工作的关注使SRE可在服务规模扩大的同时减少人
数,并且比单纯的研发和单纯的运维团队更能有效地管理
服务
工程工作是一种新颖的、本质上需要主观判断的
工作;它是符合长期战略的,会对我们的服务进
行长久性改善的工作
工程工作通常是有创新性和创造性的,着重通过
设计来解决问题,解决方案越通用越好
编写自动化脚本
软件工程:编写或修改代码,以及所有其他相关的设计和
创造工具或者框架
减少琐事
什么算作工程工作
文档工作 增加可扩展性和可靠性的服务功能
修改基础设施代码使得其更稳健
系统工程:配置生产系统、修改现存配置,或者用一种通过一次性工作产生持久的改进的方法来书写系统文档还 监控的部署和更新
;
包括与研发团队进行的架构、设计和生产环境方面的咨询
工作
负载均衡的配置
典型的SRE活动主要存这样几种类型 服务器配置
操作系统的参数调整和负载均衡器部署
琐事:与运维服务相关的重复性的、手工的劳动
招聘、人力资源书面工作
团队/公司会议
流程负担:同运维服务间接相关的行政工作 任务系统的定期清理工作
工作总结
同行评价和自我评价
培训课程
已知的和重复性的工作有一种让人平静的功效,
完成这些事可以带来一种满足感和快速胜利感
琐事甚至可能是低风险、低压力的活动,有的员
工甚至喜欢做这种类型的工作
在SRE所扮演的角色中,一定数量的琐事是不可
避免的,这也是任何工程类工作都有的特点
花在工程项目上的时间过少,就会使得职业发展变
琐事繁多是不是一定不好 慢,甚至停滞
职业停滞 Google确实会奖励那些做脏活、累活的人,但是仅仅该工作避免且有着巨大正影响的时
是是不可,面候才这么做
士气低落:过多的琐事会导致过度劳累、厌倦和不满
造成误解:个人过多参与琐事会让人误解SRE是一个工
,
程组织这一本质
但琐事一理变多,就会相当有害 进展缓慢:团队生产力下降
错误的示范效应:可能带动其他SRE同事也得承担更多琐
事
促进摩擦产生:队友不开心
违反承诺
监控:收集、处理、汇总,并且显示关于某个系
统的实时量化数据,例如请求的数量和类型等
白盒监控(white-box monitoring):依靠系统
内部暴露的一些性能指标进行监控,包括日志分
析、Java虚拟机提供的监控接口,或者一个列出
内部统计数据的HTTP接口进行监控
黑盒监控(black-box monitoring):通过测试
监控相关的术语定义 某种外部用户可见的系统行为进行监控
监控面板(dashboard):提供某个服务核心指
标一览服务的应用程序(一般是基于Web的)
告警(alert):发往某个系统地址的一个通知,
目的地可以包括工单系统、E-mail地址、或者某
个即时通信软件的接收地址等
根因(root cause):指系统中的某个缺陷,该
缺陷被修复后,就可以保证相关问题不会再以同
样的方式发生
分析长期趋势
为什么要监控(监控一个系统通常有多 个原因)
跨时间范围的比较,或者是观察实验组与控制组
之间的区别
告警:在系统发生故障主动通知给管理员
构建控制台页面(大屏显示)
临时性的回溯分析(也就是在线调试)
紧急告警出现得太频繁时,员工会进入“狼来了”
效应,怀疑告警的有效性甚至忽略该告警,以致
于有时候甚至有可能忽略掉真实故障的告警
要注意防止告警风暴 无效信息太多时,分析和修复就可能会变慢,故障时间也会相应延长

高效的告警系统应该提供足够的信息,并且误报
率非常低
避免任何“魔法”系统——例如试图自动学习阈值或者自动
检测故障原因的系统
要坚持监控规则越简单越好,同时要求这些监控规则可
以检测某个非常简单、具体,但是严重的异常情况
Google趋向于使用简单和快速的监控系统配合高
效的工具进行事后分析
监控数据可能还会用于容量规划、流量预测等场景,这些
方面的监控规则对错误和稳定性的要求更低,也就可以稍
微复杂一些
针对某个实验功能的数据观测,可能时间跨度非常长,取
样率也很低,因而也就可以容忍一定的错误率,因为这些
偶发错误不会掩盖真正的长其趋势
由于Google基础设施的重构速度很快,很少有团队在监控系统中维护复杂的依赖关系
对监控设置合理的预期 从现象到根源问题的定位速度可以更快尤其是在一个不
,
断改变的系统中
监控系统应该进行持续优化的方向 监控系统中最重要的一点就是整个“生产故障,人工处理
紧急警报,简单定位和深入调试”过程必须要保持非常简
单,必须能被团队中任何一个人所理解
监控系统的信噪比应该很高,发出紧急告警的组件需要非
常简单而且可靠
告警系统的指导原则 产生告警的监控系统规则应该非常容易理解,同时代表一个清晰的故障场景
监控系统应该解决两个问题:什么东西出故障
了,以及为什么出故障
现象与原因 “什么东西出故壁了”即为现象(symptom)
“为什么”则代表了原因(可能只是中间原因,并
不是根源问题)
“现象”和“原因”的区分是构建信噪比高的监控系统
时最重的概念
黑盒监控是面向现象的,代表了目前正在发生的而非预测会发生的问题即“系统现在有故障”
黑盒监控与白盒监控的核心区别 ,
白盒监控大量依赖对系统内部信息的检测,如系统日志、
抓取提供指标信息的HTTP节点等,因此可以检测到即将
发生的问题及那些重试所掩盖的问题等
白盒监控有时是面向现象的有时是面向原因 因为在一个多层系统中,某个服务的现象可能是另一个系
统原因
黑盒监控与白盒监控 ,
的,于是,收集用于调试的数据时,白盒监控是
必不可少的
例如数据库的性能问题:数据库读操作慢是数据库SRE检
测到的一个现象,而前端SRE看到的现象则是网站缓慢,
分布式系统的监控 但数据库读操作慢才是原因
黑盒监控可以保证系统只在某个问题目前正在发
生,并且造成了某个现象时才会发出紧急告警,
对于尚未发生的问题,黑盒监控通常是没用的
延迟(Latency):服务处理某个请求所需要的 在监控请求延迟时需要将成功请求同失败请求区分开来
时间 例如,因数据库丢失或其它后端问题导致的HTTP 500错误导致失败请求的延迟可能会很低将其同成功请求一起
,
计算延迟会导致严重偏差
对Web服务器来说,该指标通常是每秒HTTP请求数量,
同时可能按请求类型分类(静态请求与动态请求)
流量(Traffic):使用系统中某个高层次的指标
针对系统负载需求所进行的度量
针对音频流媒体系统来说,这个指标可能是网络I/O速
率,或者并发会话数量
针对键值对存储系统来说,指标可能是每秒交易数量,或
每秒的读取操作数量
4个黄金指标 要么是显式失败(例如HTTP 500),要么是隐式失败(
例如HTTP 200回复中包含了错误内容),或者是策略原
因导致的失败(例如,若要求回复在1秒内发出,任何超出1秒的请求就请求
错误(Errors):请求失败的速率 是失败)
当协议内部的错误代码无法表达全部的失败情况时,可以
利用其他信息,如内部协议,来跟踪一部分特定故障情况
通常是系统中目前最为受限的某种资源的某个具体指标的
度量,例如在内存受限的系统中,即为内存;而在I/O受
限的系统中,即为IO;
饱和度(Saturation):服务容量有多“满” 需要注意的是,很多系统在达到100%利用率之前性能会
严重下降,增加一个利用率目标也是很重要的
另外,饱和度同样也需要进行预测,例如“看起来数据库
会在4个小时内填满硬盘”
对于节点的平均CPU使用率一类的指标来说,由于利用率
的波动可能会很大,平均值将会掩盖异常尖峰
构建监控系统时,多数人都倾向于采用某种量化
指标的平均值
同样的场景也适用于延迟指标,例如某个Web服务每秒
处理1000个请求,平均请求延迟为100ms,这完全会掩盖
掉请求在5s时间的1%的请求
关于长尾问题 区分平均值的“慢”和长尾值的“慢”的一个最简单 将延迟0-10ms作为一个区间,统计请求的数量,同时分
别统计的还有10-30ms的区间,30-100ms的区间,100-

的办法是将请求按延迟分组计数(可以用来制作
直方图)
300ms区间等
将直方图的边界定义为近似指数式分布(前面的例子中倍
数约为3)通常是直观展现请求分布的最好方式
度量指标时采用合适的精度 系统的不同部分应该以不同的精度进行度量 高频收集、存储分析指标数据的成本可能会很高
应该仔细设计度量指标的精度 若需要监控目标上的高精度数据,但却不需要极低的延
迟,则可以通过在服务器上执行内部采样来降低这些成
本,然后配置外部系统随时间或跨服务器的方式来收集和
聚合这些数据
复杂是没有止境的。就像任何其他软件系统一
样,监控系统可能会变得过于复杂,以至于经常
出现问题,变更非常困难,维护起来难度很大
那些最能反映真实故障的规则应该越简单越好,可预测性
强,非常可靠
简化,直到不能再简化 少即是多 那些不常用的数据收集、汇总,以及警报配置应该定时删
除(某些SRE团队的标准是一个季度没有用到一次即将其
删除)
收集到的信息,但是没有暴露给任何监控台,或者被任何
警报规则使用的应该定时删除
和其他软件工程的理念一样,保持系统相对独
立,清晰简单,松耦合的接口是更好的策略(例
如,利用Web API来收集性能数据,采用
一种可以持续很久不变的简单数据格式)。
按季度进行紧急警报的频率统计,保证每个决策
者都理解目前的运维压力,以及系统的健康状况
长跑 长远来看,要建立一个成功的on-call轮值体系,
以及构建一个稳定的产品需要选择那些正在发生
和即将发生的问题来进行报警,设置一个可以实
际达到的合理目标,保证监控系统可以支持快速
的问题定位与检测

Google 的自动化系统的演进

在运维行业,自动化这个术语一般用来指代通过
编写代码来解决各种各样的问题;因此,从更广
泛的意义上来说,自动化程序是“元软件”,即操
作其它软件的软件
对于SRE而言,自动是一种力量倍增器,但也不
是万能药
对力量的倍增并不能改变力量用在哪的准确性:
草率地进行自动化可能在解决问题的同时增生出
其它问题;因此,自动化的价值不仅源于它所做
的事情,同时还依赖于对它的明智应用
尽管多数情况下以软件为基础进行自动化优于手
动操作,但更好的选择是创建出一个有自治能力
的系统
一致性:对于重复性的工作,一致性地执行范围
明确、步骤已知的程序是自动化的首要价值
平台能够将错误集中化,在代码中修复某个错误可以保证
该错误被永远修复
平台性:通过正确地设计和实现,自动化的系统
可以提供一个可以扩展的、广泛适用的,甚至可
能带来额外收益的平台
平台能够更容易地被扩展,从而执行额外的任务,这比教
授人类要容易得多
取决于任务的性质,平台可能能比人类更持续或者更频繁
地运行任务,甚至完成一些对于人类而言并不方便执行的
任务
自动化的价值 平台可以暴露自身的性能指标,也可以帮助人们发现流程
中以前不知道的细节,这些细节在平台范围内更容易衡量
修复速度更快:其成功执行能够降低一些低级故 工程师可以把节约的时间投入到其它任务上,例如SRE工
具的开发工作
障的MTTR 构建一个在问题发生之后马上应对的自动化系统,对干降
低系统的总成本非常有利,前提是该系统足够大
行动速度更快:在基础设施中,SRE自动化系统
应用广泛,这是因为人类通常不能像机器一样快
速反应
节省时间:一旦你用自动化封装了某个任务,任何人都可以执行它们 时间的节省适用于该自动化适用的所有人
自动化能够将某个操作与具体操作的人进行解耦
Google更倾向于自动化,这种偏爱来自于Google
特有的业务挑战:Google的产品和服务是全球部
署的,而SRE团队也没有时间手动维护这些系统
自动化对Google SRE的价值 Google花了很多时间来克服自身自动化系统管理
的各种障碍,然后坚决地进行了自动化系统管理
本身的开发
当然,尽管Google在思想上倾向于尽可能使用机
器管理机器,但实际情况需要一定的变动,毕竟
将每个系统的每个组件都自动化是不合适的,而
且也未必每个人都有能力或者倾向在一个特定的
时间中开发出自动化系统
SRE使用不同的工具来管理自动化,同时关注的重点也可
能有所不同
Google SRE的自动化使用案例 广泛使用的工具有PuetChefcfenine甚至Perl Perl这种完整的语言提供了POSIX级别的API接口,
理论上在系统API层面上提供了一个基本上是无限的扩展范围
pp、、g,
都提供了自动化完成特定任务的方法,主要区别在于对帮
助进行自动化的组件的抽象层次不同

Chef和Puppet则提供了一些“开箱即用”的抽象层,
通过对这些抽象层的操作可以直接操作服务或者其

他高级对象
没有自动化:手动将数据库主进程在多个位置之
间转移
自动化的应用案例 外部维护的系统特定的自动化系统:SRE在他或
她的主目录中保存了一份故障转移脚本
自动化演进的路径 外部维护的通用的自动化系统:SRE将数据库支
持添加到了每个人都在使用的“通用故障转移”脚
本中
内部维护的系统特定的自动化:数据库自己发布
故障转移脚本
自动化分类的层次结构 不需要任何自动化的系统:数据库注意到问题发
生,在无须人工干预的情况下进行故障转移
这些变更同样需要安全地管理,并且能在必要的情况下进行回退
相对于特定系统相关配置上变更的自动化,另一种自动是面向整个生产领域的变更
在变更数量超过一定范围之后,这种全生产范围内的变更也几乎不可能手动完成
面对各种异常情况,都要尽早着手将手动的处理
机制转化为程序自动化
让自己脱离工作:自动化所有的东西 拥抱失败,承认故障是不可避免的,并因此通过
自动化进行快速恢复
全面自动化有一个连锁效应:节省的时间越多,
优化和自动化其他烦琐工作的时间就越多
每一个自动化程序(尤其是修复程序)都应该重
点考虑幂等性,必须要确保所有的依赖关系都能
得到满足,非如此,则不能简单、安全的修复问题
幂等地解决不一致情况
不具备幂等性的修复程序是一种严重缺陷,它可能会造成系统处于不一致的状态
能力,即准确性
自动化程序间的不同体现在一个方面 延迟,开始执行后,执行所有步骤需要多久
相关性,自动化所涵盖的实际流程比例
专业化倾向 负责敏捷产品开发的团队没有动力帮助运维团队减少在生
产流程后期运维服务产生的技术负债
基本的维护法则 不亲自运行自动化的团队很难有动力去建设一个自动化的
系统
若产品经理的时间表没有受到低质量的自动化的影响,他
将永远优先新功能的开发,而不是简化和自动化
自动化发展的最终结果,通常是使用一个数据库来跟踪机
器状态,并且采用先进监控工具负责监控,进而能够自动
管理机器的生命周期:机器坏了的时候移除服务,送去修
理并且在它们修复完成后恢复配置
自动化发展的最终结果 这种自动化很有用,但限制也很多,因为系统抽象与物理
机紧密相关
Borg:仓库规模计算机的诞生 Borg系统的最大创新是,从相对静态的主机/端口/作业
分配,到将一系列机器看作受管理的海量资源的创新
Borg成功的核心是把集群管理变成了一个可以发送API的中央协调主体;对比以前的机器“独占”模式Borg能够让
自动化编排系统的出现 ,
机器来调度任务,例如在同一台机器上同时进行批处理和
面向用户的任务
对于SRE来说,在Borg环境中,机器的损坏和生命周期管
理基本上已经不再需要任何操作,这最终实现了把集群管
理升级为自治系统,而不是自动化系统
随着自动化覆盖范围的日益增长和全面化,运维
人员与系统的有用的、直接接触会逐渐减少,不
可避免的,当自动化系统出现问题时,运维人员
将无法成功地操作该系统
可靠性是最基本的功能 于是,无论系统规模大小,系统中具有更多自主
行为的系统仍然有很多好处
可靠性是最基本的功能,并且自主性、弹性行为
是达到这一特征的有效途径

作为生产系统的监管者, on-call 工程师负责处理生产环境中即将或者正在发生的业务事故,以及评审对生产系统的变更请求

on-call工程师需要在分钟级别执行产生系统中的维护需
求,具体时间范围是SRE团队和产品业务团队共同商议得
出的,也通常会跟业务需要的可靠性目标相关

on-call 轮值

on-call的职责及轮值方式 值班过程中,值班人员必须保证可以随时响应紧
急问题,不管是在工作时间,还是在非工作时间
一般来说,对任何直接面向最终用户的服务,或者时间非
常紧迫的服务来说,这个时间定为5分钟;而非敏感业务
通常来说是30分钟;
在IT行业里,on-call任务一般是由专门的运维团
队(Ops)进行的,主要目标是保障他们所运维的
服务维持正常运转
一旦接收到报警信息,工程师必须确认(ack),
on-call工程师必须能够及时定位问题,并且尝试
解决问题
on-call工程师的工作机制 必要的话,on-call工程师可以联系其他团队,或
者升级(escalate)请求支援
很多团队同时有主on-call人和副on-call人值班,
主副分工每个团队都各有不同;有些关系较为密
切的团队甚至互为主副,互相值班,共同分担工
作压力
至少将SRE团队50%的时间花在软件工程上,在其余时间
中,不超过25%的时间用来on-call,另外25%的时间用
来处理其他运维工作
利用25%这个时间上限,可以计算出满足7x24 on-call轮
值制度的最少SRE人员数量:假设每次on-call需要主副两
名工程师,则这个团队至少需要8名工程师;若每次轮值
为1周,则每个月需要轮值一次;
数量上(在on-call事务上所花费的时间)保持平
衡
长时间执行夜间任务对人的健康不利。多地团队可
以利用“日出而作,日落而息”(Follow the sun)的轮
值制度使整个团队避免夜间值班
大型服务可能需要更多的人手,但扩展出多地团队,将好
于只在当地扩展团队成员
通过限制一个团队在on-call轮值制度中的人员数
量,可保障每个工程师对生产环境的熟悉程度
但多地团队会增加沟通和合作的成本,因此,是否将当地
团队转为多地团队应该慎重地决定,仔细考虑两种模式的
成本,业务系统的重要性,以及每个系统的业务压力
on-call工作平衡 每次on-call值班过程中,轮值工程师必须有足够的时间
处理紧急事件和后续的跟进工作,例如写事后总结报告
质量上(每次on-call轮值发生的事故数量)保持
平衡
平均下来,处理任何一个生产环境事件,包括事件根源分
析、事件处理,以及事后总结等,至少需要6个小时;因
此,我们认为,每12个小时的轮值周期最多只能产生两个
紧急事件
为了维持这个范围,告警事件每日的发生概率应该很低;
若某个团队轮值期间不断地超过这个标准,则管理团队必
须采取一些修正措施保证运维压力下降到可持续水平
补贴措施 针对工作时间之外的on-call工作应给予合理的补贴
不同的组织团队用不同的方式进行补贴,Google提供年
假或者现金补贴,同时按一定程度的工资比例作为上限
人类面临挑战时的问题处理方式有两种 依赖直觉,自动化、快速行动
理性、专注、有意识地进行认知类活动
处理复杂系统问题时,第二种行事方式是更好的选择,可
能会产生更好的处理结果,以及计划更周全的执行过程
让on-call工程师保持在第二种处理方式的范围内 直觉一般都不是基于明确的数据支持的,因此,在
处理问题的过程中,on-call工程师很有可能由于凭
直觉去解释问题产生的原因而浪费宝贵的时间
直觉很可能是错误的 快速反应主要是由习惯而产生的,习惯性的快速反
应的动作后果一般都没有经过详细考虑,这可能会
将灾难扩大
安全感 在应急事件处理过程中,最理想的方法是这样的:
在有足够数据支撑的时候按步骤解决问题,同时不
停地审视和验证目前所有的假设
让on-call SRE知道他们可以寻求外部帮助,可有助于减
轻压力
最重要的资源(需要由SRE团队于日常工作中创建、维护 清晰的问题升级路线
和优化) 清晰定义的应急事件处理步骤
为了确保on-call工程师能够保持在第二种处理方
式范围内,我们必须减轻on-call所带来的压力感
无指责,对事不对人的文化氛围
Google内部开发使用了一个Web工具,可自动化大
部分操作
比如提供方便的职责交接流程,以及保留对外状态
更新公告的历史等
在处理复杂的、需要同时引入多个团队的问题时,或者经
过一段时间调查仍然不同预测多久可以恢复时,应该考虑
启用某种正式的应急事务处理流程
利用这些工具,on-call工程师可以专注于解决问
题,而不是在格式化公告邮件,或者是同时更新多
个对外沟通渠道上浪费时间
SRE团队必须大型应急事件发生之后书写事后报告,
详细记录所有事件发生的时间线,这些事件要对事
不对人,主要为日后系统性地分析问题产生的原因
提供宝贵的数据
报警策略必须跟服务的SLO目标一致,每条报警信息
必须是可实际操作的(指收到报警后有明确的动作
需要执行)
错误的监控系统配置常常是导致运维压力过大的原因 一个每小时都触发的低优先级报警会严重影响on-
cal工程师的生产力,同时,“狼来了”效应也会导致
真正重要的告警被忽略
将针对同一个事故引起的告警进行聚合以减少on-
call工程师收到的告警数量也很重要
如何应对运维压力过大? SRE需要和三切团队设立一个共同目标,解决运维压
力问题
在极端情况下,SRE团队可以选择停止支持某个服务将服务转交给开发团队负责on-call轮值直到
有时候,造成运维压力上升的因素并非由SRE控制,例如
研发团队可能修改了程序导致程序稳定性下降,或者更容生
,,
系统达到SRE团队设立的稳定性目标为止
易产告警 多数情况下,SRE总是可以和研发团队共同努力,使得运维压力下降在有些情况下降低系统运维压
避免运维压力过大 ;,
力可能需要改变复杂的系统架构,甚至需要几个季
度来完成;这种情况下,SRE团队不应该承担全部运
维压力,而是应该和研发团队协商,将某些或者全
部的告警信息转交给研发组处理
SRE团队运维压力不够也是一个不良现象,长时间不操作
生产环境会导致自信心问题,包括自信心太强以及自信心
不够,这些现象只有在下一次发生问题时,才会显现出来
奸诈的敌人——运维压力不够 为了避免这种问题,应该控制SRE团队的大小,保证每个
工程师每个季度至少参与on-call一次,最好两次,这样
可以保证团队成员有足够的生产环境操作经验

故障排查过程是一个可以习得的技能,也是一个可以传授的技能

有效的故障排查

故障排查是运维岗位的一项关键技能 新手们通常不能有效的进行故障排查的原因有两
个
对通用的故障排查过程的理解(不依靠任何特定系
统)有限
对发生故障的系统不够了解
对系统内部运行的了解往往限制了SRE处理系统
问题的有效性,对系统设计方式和构建原理的知
识是不可或缺的
从理论上讲,我们可将故障排查过程定义为反复
采用‘’假设-排除‘’手段的过程:针对某系统的一些
观察结果和对该系统运行机制的理论认知,不断
提出一个造成系统问题的假设,进而针对这些假
设进行测试和排除
故障排查过程
从收到系统问题报告开始处理问题
故障排查的概念 通过观察系统的监测指标和日志信息了解系统目前的状
态
再结合自身对系统构建原理、运行机制,以及失败模型的
故障排查的通用流程 了解,提出一些可能的失败原因
将假设与观察到的系统状态进行对比,从中找出
支持假设或者不支持假设的证据
测试假设是否成立的两种方法 主动尝试“治疗“该系统,也就是对系统进行可控
的调整,并观察操作的结果
基于上面两种排查方式中的任何一种,都可以重复
造成低效故障排查过程的原因通常集中在定位( 测试假设,直到找到根本原因
triage)、检查和诊断环节上,主要由于对系统
不够了解而导致
关注了错误的系统现象,或者错误地理解了系统现象的含
义;这样会在错误的方向上浪费时间;
不能正确修改系统的配置信息、输入信息或者系统运行环
造成低效的故障排查过程的原因 常见的陷阱 境,造成不能安全和有效地测试假设
将问题过早地归结为极为不可能的因素(例如认为是宇宙
射线造成数据变化,虽然有可能发生,但是并不应该在解
决问题初期做这个假设),或者念念不忘之前曾经发生过
的系统问题,认为一旦发生过一次,就有可能再次发生
要记住,相关性(corelation)不等于因果关系(
causation)
试图解决与当前系统问题相关的一些问题,却没有认识到
这些其实只是巧合,或者这些问题其实是由于当前系统的
问题造成的。(比如发现数据库压力大的情况下,环境温
度也有所上升,于是试图解决环境温度问题。)
一些同时出现的现象,例如集群中的网络丢包现象和硬盘
损坏现象可能是由同一个原因造成的,比如说供电故障。
但是网络丢包现象并不是造成硬盘损坏现象的原因,反之
亦然。
更糟的是,随着系统部暑规模的不断增加,复杂性也在不
断增加,监控指标越来越多。不可避免的,纯属巧合,一
些现象会和另外一些现象几乎同时发生。
每个系统故障都起源于一份故障报告,可以由自
“”
动报警产生,或者仅仅是你的同事说系统很慢
有效的故障报告应该写清预期是什么,实际的结
故障报告 果是什么,以及如何重现
理想情况下,这些报告应该采用一致的格式,存
储在一个可以搜索的系统中,例如Bug记录系统
中
很多团队都使用定制表单,或者小型的Web收集
信息程序,同时自动发送和传递错误报告
还可以为常见问题提供一个自服务分析工具或者
自服务修复工具,这也可以帮助错误汇报
收到问题报告后,下一步就是弄清楚如何处理它
问题的严重程度可能会有所不同:有问题只会影响特定用
户在特定条件下的情况(可能还有临时解决方法),而有
的问题则可能导致服务完全中断
你的反应应该适合问题的危害程度:对于严重级别较高的
评估问题的严重性需要运用良好的工程判断力,
并且通常需要在压力下保持一定程度的冷静
问题,立即声明一个全员参与的紧急情况可能是合理的,
但这么做对小型问题是反应过度
人们的第一反应可能是立即开始故障排查过程,试图
故障鉴别与分类(Triage) 尽快找到问题的根源。但这是错误的!不要这样做正确的做法是:尽最大可能让系统恢复服务缓解系
,
统问题是第一要务
将用户流量从问题集群导向其他还在正常工作的集
群
应对严重故障的步骤:恢复第一,排障第二 恢复服务时可能需要一些应急措施,几种常见的做法 或者将流量彻底抛弃以避免连锁过载问题
如果一个Bug有可能导致不可恢复的数据损坏,停止整个
系统要比让系统继续运行更好
或者关闭系统的某些功能以降低负载
理想情况下,监控系统记录了整个系统的监控指
快速应对问题时仍应该及时保存问题现场,比如服务日志
等,以便后续进行问题根源分析时使用
标,这些指标记录的时序数据是找到问题所在的
关键之一
日志应该清晰记录着每个操作的信息和对应的系统状态
检查:验证系统各组件的运行状态 日志是则是帮助问题排查的另一个关键所在 文本日志对实时调试非常有用
在日志中支持多级记录是很重要的,尤其是可以在线动态
调整日志级别
这项功能可以让你在不重启进程的情况下详细检查
某些或者全部操作,同时这项功能还允许当系统正
常运行时,将系统日志级别还原
更进一步,你可能需要在日志系统中支持过滤条件
第三个有用的工具则是请求跟踪系统
对系统设计有详细了解,是针对目前系统出现的
——记录所有满足某种条件的操作
问题提出合理猜想的关键依赖 对于组件间有着清晰接口的系统,可以通过检查各
组件间的链接,或者是中间传输的数据来判断其是
否工作正常
将已知的测试数据(尤其是针对某种错误情况的
专用测试数据)输入到系统中,检查输出是否正
确(这也是黑盒测试的一种),是非常有帮助的
若系统有配套的测试用例,则调试起来将轻轻松
简化和缩略 很多一个多层系统中整个系统需要多层组件共同协
,
作完成;最好的办法是从系统的一端开始,逐个
检查每个组件,直到系统底层
诊断 问题分解是另一种非常有用的通用解决方案 对于大型系统来说,这种方法可能太慢了,好的策略是采用二分法将系统分为两部分确认问题
但也有一些通用手段可以帮助在没有领域知识的
情况下提供帮助
”什么“,”哪里“和”为什么“ 在一个异常系统中,该系统经常还正在执行某种操
作,只是这些操作不是你想让系统执行的操作
那么找出系统目前正在执行“什么”,然后通过询问该
系统“为什么”正在做这些操作,以及系统的资源都被
用在了“哪里”可以帮助你了解系统为什么出错
计算机系统有惯性存在:我们发现,一个正常工作
的计算机系统会维持工作,直到某种外力因素出
现,例如一个配置文件的修改,用户流量的改变
等。因此,检查最近对系统的修改可能对查找问题
根源很有帮助。
,
所在再重复进行
关注最后一个修改 设计良好的系统应该有详尽的生产日志,记录整个
架构中新版本部署或者配置文件的更新,包括从处
理用户请求的服务进程,一直到集群中每个节点的
安装的版本信息。通过将系统的环境改变与系统性
能和行为进行对比,可能比较有用
相对于通用工具和通用手段来说,针对具体系统开
有针对性地诊断 发的诊断工具和诊断系统会更有用
SRE团队应该花时间开发和改进这样的工具,以备不
时之需
有了一个相对较短的可能原因列表,接下来就应
该试着找出具体哪个原因才是真正的根源问题
通过一些具体的试验,可以确认和推翻我们所列举的假设
一个理想的测试应该具有互斥性,通过执行这个测试,可
以将一组假设推翻,同时确认另外一组假设;但实际实现
起来可能较难
测试和修复 先测试最可能的情况:按照可能发生的顺序执行测试,同
时考虑该测试对系统的危险性。先测试网络连通性,再检
查是否是最近的配置文件改变导致用户无法访问某机器可
能更合理。
某项测试可能产生有误导性的结果。例如:防火墙规则可
能只允许某些IP访问,所以在你的工作机上ping数据库可
设计测试时,必须注意到的几个问题 能会失败,而实际从应用服务器上ping数据库可能是成功
的。
执行测试可能会带来副作用。举例说明:让一个进程使用
更多CPU可能会让某些操作更快,也可能会导致数据竞争
问题更容易发生(单线程与多线程运行)。同样的,在运
行中开启详细日志可能会使延迟问题变得更槽,同时也让
你的测试结果难以理解:是问题变得更加严重了,还是因
为开启详细日志的原因?
某些测试可能无法得出准确的结论,只是建议性的。死锁
和数据竞争问题可能是非常难以重现的,所以有的时候你
负面结果不应该被忽略,或者被轻视。意识到自 并不能找到非常确切的证据。
己的错误通常意义更大:一个明确的负面结果可
以给某些最难的设计问题画上句号。
就算该负面结果无法被其他人直接利用,这项试
验收集到的数据也可以帮助其他人选择新的试
神奇的负面结果(测试试验中的预期结果没有
现)
出
验,或者避免之前设计中的问题。
如果你对一项测试的结果感兴趣,那么很有可能
其他人也感兴趣。当你公布结果的时候,其他人
不需要再重新设计和运行一套类似试验。
应对任何没有提到失败的设计文档、性能评估文
档以及短文保持怀疑,因为这篇文章可能经过了
过度筛选,也可能因为作者的方法不是那么严
谨。
通过各种努力将一系列可能的错误原因减少到一
个后,下一步,就是证明它就是问题的根源 很可能有多个因素共同作用导致了系统问题,而真实系统
通常是路径依赖的,这意味着它们必须牌一个特定状态
下,问题才会发生
治愈 在生产环境中试图通过重现一个原因而明确地证
明它就是问题的原因是很困难的
在生产环境中重现某个问题也许是不可能的:要么因为将
系统置于某种问题状态过于复杂,或者是系统过于重要,
不能再出问题
最终确定了某个因素是问题根源后,应该将系统
中出错的部分,你是如何定位问题的,以及你是
如何修复问题的,如何防止再次发生该问题等信
息记录下来。这就是事后总结,也称为验尸报
告。
“Things break; that’s life.”(东西总是会坏的,
生
应对紧急事件的方式,反映了一个组织的特质,
这无关组织规模
几乎没有人天生就能很好处理紧急情况,采取恰
当的应急举措的能力来自于平日的实战训练
这就是活) 公司需要建立和维护一套完备的训练和演习流
程,同时也需要一批专注投入于此的人力
公司必须着力确保:当系统出现问题时,能有训
练有素的专业人士严格依照公司建立起来的灾难
应急流程镇静地及时、正确处理这些问题
Google经常主动进行灾难处理和应急响应演习,
SRE故意破坏系统、模拟事故,然后针对失败模
式进行预防以提高可靠性
这种测试可以帮助发现一些系统的弱点和潜在的
依赖关系,制定了修改计划以解决这些问题
测试导致的紧急事故 多数时候,这些模拟事故都能按照计划进行,目
标测试系统和依赖系统基本都能正常工作,个别
时候,假设与结果也可能相差很远
及时停止测试,并按严格照应急响应流程处理问题;
平日里要持续建设、优化和测试应急响应流程工具;
正确的应对举措 所有的大型测试都必须要事先测试回滚机制;
另外,每项测试进行之前都要进行充分的评审,以确保其
是必要的,且内部意见一致的
Google有很多配置文件,这些文件非常复杂,也
牌不停地修改中;每次变更配置前都会进行大量
测试以避免意外事故,但系统自身的规模和复杂
程度决定了,一定会存在无法预料到的意外情
况,这些意外情况意外被触时就会导致配置变更
不能完全按期望的方式运行
持续建设、维护和优化监控系统,确保其随时能够报告任
何异常,但要尽力降低垃圾告警
变更部署带来的紧急事故 严格遵循应用响应流程处理问题,并将问题及时通知给相
关人员
正确的应对举措 要保持一些非常可靠的、低成本备份访问系统的运行,以
确保在紧急情况下有备用预案;
在专用的变更系统之外,还要维护一套基础的(命令行可
用的)更新和回滚工具,并要确保日常的频繁测试以保证
工程师们能熟练使用
紧急事件响应 为大型变更操作提供限速机制,限制其分发变更的速
度 ,这样能够在触发问题之时能抑制其导致问题发生的
速度。
Google在机器管理自动化上投入了大量的时间和
精力,这样能轻松地在整个集群里运行、停止和
重新配置大量任务;但在意外来临时,自动化的
效率有可能非常可怕
流程导致的严重事故 应急团队能够严格依照应急事故处理流程及时、快速、正
确地执行流程
正确的应对举措 平日里多进行事故应急演练,以确保应急处理过程中的沟
通和协作的流畅、顺利
时间和经验一再证明,系统不但一定会出问题,
而且会以人们无法相到的方式出问题
Google学到的最关键的一课,所有的问题都有对
应的解决方案,虽然对于一个面对着告警风暴的
工程师来说,它可能不是那么显而易见
所有问题都有解决方案 如果你找不到办法,那就在更大的范围内寻求帮
助,找到更多的团队成员,寻求更多的帮助,做
你需要做的一切事情,但是要快!
最高优先级永远是将手头问题迅速解决掉;很多
时候,触发这个事故的人对事故了解得最为清
楚,一定要充分利用这一点
非常重要的是,一旦紧急事件过去之后,一定要
留出时间书写事后报告
没有什么比过去的事故记录是更好的学习资料了,历史就
是让后人能够学习到其他人曾经犯的错误,并从中汲取经
验和教训
为事故保留纪录 在记录中,请一定要诚实,一定要事无巨细,尤其重要的
是,提出关键的问题,并随时留心寻找如何能在战术及战
略上避免这项事故的再次发生
公布和维护事后报告,确保全公司的每个人都能从中学到
你所学到的知识
假如整栋大楼的电源坏了怎么办?假如网络设备被泡在半
米深的水里了怎么办?如果主数据中心突然下线了怎么
办?如果有人入侵了你的Web服务器怎么办?
向过去学习,而不是重复它 提出那些大的,甚至不可能的问题 面对这些问题你该如何处理?找谁联系?谁来付钱?有对
应的应急计划吗?你知道如何应对吗?你知道你的系统会
如何应对吗?如果上述所说正在发生,你能够立刻最小化
灾难损失吗?坐在你身边的人能做到同样的事吗?
面对失败,理论和实践是两个完全不同领域,直到系统真
的失败的那一刻,你并不真的了解它,以及依赖它的系
统,或者它的用户会如何应对
鼓励主动测试 在所有人手齐备的情况下,经过评审后,通过主动测试了
解系统间的依赖关系,发现弱项并动手加固,显然优于将
故障留到仅有值班人员的时候

过于关注技术问题:遇到事故时,直接开始并陷入技术操作,将导致完全没有时间和精力去思考如何能够通过其他手段缓解当前服务的问题

沟通不畅:过于关注技术问题,也将导致根本没
有时间清晰和有效地与其他人进行沟通,也就没
因最终用户面临服务不可用的问题,业务部门的领导人愤
怒异常
无流程的紧急事故管理中可能遇到的问题 有人知道他们的同事正在做什么 其它能帮忙调试和处理问题的工程师也无法被有效利用起
来
不请自来:其他看到故障的同事出于善意,或者
应对问题等原因,也可能会自主开始处理问题,
这将导致局面的进一步恶化
在事故处理中,让每个人清楚自己的职责是非常重要的:
明晰职责反而能够使每个人可以更独立自主地解决问题,
因为他们不用怀疑和担心他们的同事都在干什么
很可能,某个人在事故处理过程中会面对手头任务过多的 纵向分解:将手头的任务创建分解为多个子任务并
交给从负责人那里申请来的其他人手;或者将负责
管理的事故分解为多个子事故,并交由各相关的下
级部门进行处理
情形,他可以纵向分解或横向分解相关的任务 横向分解:将任务中的某个系统组件完全交给同事
来处理,而该同事直接向上级负责人汇报
嵌套式职责分离 负责组建事故处理团队,按需求和优先级将一些
任务分配给团队成员,未分配的职责仍由事故总
控人负责
事故总控(总指挥) 负责协调工作,辅助事务团队可更有效地解决问
题,比如申请访问权限、收集联系信息等
事故处理团队负责人,负责在与事故总指挥充分
沟通的情况下,指挥团队具体执行合适的事务来
解决问题
事务处理团队(执行故障修复) 事务处理团队是在一次事故中唯一能够对系统做
修改的团队
可以在事故管理中分配的角色 向事故处理团队和所有关心该事故处理过程的人
发送周期性通知 (通常以电子邮件形式进行)
发言人(负责信息发布) 负责维护目前的事故文档,以保证其正确性和信
息的及时性
紧急事故的流程管理要素 负责为事务处理团队提供支持,包括一些持续性
的工作,例如填写Bug报告记录系统,给事务处
理团队订餐,安排职责交接记录等
规划负责人(事务处理团队后勤) 负责记录在处理过程中对系统进行的特殊操作,
以便未来事故结束后能够恢复
紧急事故管理 面对不断升级的复杂事故,建立一个作战室,将参与处理
问题的所有成员集中在一起办公,能够有效提升应急处理
效率
建立应急事故控制中心(作战室) 其他相关联的团队成员若希望在自己的工位上处理问题,
则可以通过E-mail或其它通讯系统关注事态进展
事故总控负责人最重要的职责就是要维护一个实时事故文档
实时维护事故状态文档
该文档可以以wiki的形式存在,但是最好能够被多人同时
编辑
明确公开的职责交接
先宣布事故发生,随后找到一个简单解决方案,
然后宣布事故结束,要比在问题已经持续儿个小
时之后才想起流程管理更好
何时对外宣布事故 应当针对事故设立一个明确的宣布条件;Google
团队依靠下面几个宽松的标准——如果其中任何
一个条件被满足,则事故就应该被及时宣布
是否需要引入第二个团队来帮忙处理问题?
这次事故是否影响最终用户?
在集中分析一小时后,这个问题是否依然没有得到解决?
若平时不常使用,事故流程管理的可靠性会萎缩
得很快
加强流程应用和应急演练 必须要经常使用流程管理框架处理生产变更请求
必须要周期性地组织灾难恢复演习,并要在演习
过程中严格遵循事故管理流程完成演习过程
划分优先级:控制影响范围,恢复服务,同时为
根因调查保存现场
事前准备:事先和所有事故处理参与者一起准备
一套流程
信任:充分相信每个事故处理参与者,分配职责
后让他们自主行动
反思:在事故处理过程中注意自己的情绪和精神
状态,如果发现自己开始惊慌失措或者感到压力
事故流程管理最佳实践(需要不断演练) 难以承受,应该寻求更多的帮助
考虑替代方案:周期性地重新审视目前的情况,
重新评估目前的工作是否应该继续执行,还是需
要执行其他更重要或者更紧急的事情
练习:平时不断地使用这项流程,直到习惯成自
然
换位思考:上次你是事故总控负责人吗?下次可
以接一个职责试试,鼓励每个团队成员熟悉流程
中的其他角色

事后复盘:从失败中学习

一篇事后总结是一次事故的书面记录,包括该事
故造成的影响,为缓解该事故采取的措施,事故
的根本原因,以及防止未来问题重现的后续任务
什么是事故处理的事后总结或者复盘? 进行事故复盘,进行事后总结的主要目的是为了
保证该事故被记录下来,理清所有的根源性问
题,同时最关键的是,确保实施有效的的措施使
得未来重现的几率和影响降到最低,甚至不再重
现
SRE负责运维的大型、复杂分布式系统,随着发
展,还会不断地增加新功能和新系统;显然,这
种频繁的改动速率和部署规模,发生事故是难以
避免的
为何需要事后的复盘? 在事故发生后,我们要修复根源性问题,同时将
服务恢复到正常状态;若没有一种方法从已发生
的事故中学习经验,那么事故就可能循环往复
而且随着系统规模和复杂度的增加,事故甚至可
能成倍增长,最终导致我们没有足够的资源处理
事故,从而影响最终用户
在任何一个事故发生后,团队必须书写一份事后
总结
书写事后总结并非一种惩罚措施,而是整个公司
的一次学习机会;但事后总结确实需要消耗团队
的一定时间和精力
用户可见的宕机时间或者服务质量降级程度达到一定标准
任何类型的数据丢失
一份合格的事后总结的基本标准有这样几条 on-call工程师需要人工介入的事故(包括回滚、切换用
户流量等)
问题解决耗时超过一定时限
Google的事故复盘哲学 监控问题(预示着问题是由人工发现的,而告警系统)
事后总结必须要重点关注如何定位造成这次事故的根本
问题,而非指责某个人或者团队的错误或者不当举动
事后总结要对所有参与事件处理的人都是善意的,他们在
自己当时拥有的信息下做了正确的举动
SRE文化中,事后总结要“对事不对人” 若事后总结系统性、逻辑性地讨论为什么某些团队或者个
人会在事故过程中获利“错误”的信息时,我们才能建立更
好的预防措施,防止问题再现
我们不能“修好”某个人,但是可以通过改善系统和流程从
而更好地协助他在设计和维护大型复杂系统时,做出更多
“正确”的判断
不能把事后总结当成例行公事,而应该将其看作
一个修复问题,并让系统变得更可靠的机会
实时协作:让写作过程可以很快地收集数据和想法
事后总结可以基于模板使用协作工具编写 开放的评论系统:使大家都可以参与进来提供解决方案,
以及提高对事故处理细节的覆盖程度
邮件通知:可以在文档中给其他用户发消息,或者引入其
他人来共同填写文档
协作和知识共享 在实践中,团队首先在内部发布,同时有目的地找一些资
深工程师来评估文档的完整程度
最佳实践:所有的事后总结都需要评审
未经评审的事后总结还不如不写,因此,为了保障
每个写完的草稿都能够得到评审,我们鼓励定期举
行评审会议
书写事后总结的过程还包括正式的评审和发布过
程
评审条件 关键的灾难数据是否已经被收集并保存起来了?
本次事故的影响评估是否完整?
造成事故的根源问题是否跟踪深入?
文档中记录的任务优先级是否合理,能否及时解决
根源问题?
这次事故的处理过程是否共享给了所有相关部门?
初期评审完成后,事后总结应该在更大范围的研发部门内
部传阅,或者以内部邮件列表形式传阅;传播范围越广越
好,直到传递给所有能够以此获益的部门
Google通过高级管理层的主动参与协作和评审环节来不
断加强内部事后总结的文化
管理层负责建立起“对事不对人”的氛围,而具体的过程还
是应该由工程师自主驱动,以获利更好的效果
本月最佳事后总结:通过每周一次的新闻邮件,与
整个组织共享一篇有趣并且高质量的事后总结
Google+事后总结小组:本小组共享和讨论内部与
外部的事后总结,同时包括一些最佳实践和事后总
结的评论文章
建立事故复盘的文化 事故复盘文化知易行难,建立起事后总结的文化
需要不断地培育和加强
为了更好地建立事后总结文化,SRE可以经常搞一些集体
学习活动
事后总结阅读俱乐部:在团队内部经常性地组织阅
读俱乐部,所有参与者共同开发式地讨论一篇有趣
或很有影响力的事后总结,包括事件的发生过程,
学习到的经验和教训,以及善后处理;
命运之轮:将之前的某篇事后总结进行场景再现,
一批工程师负责扮演该文档中提到的种角色,甚至
可以邀请当时事故的总指挥参与其中,以提高演习
的真实性
逐渐引入事后总结流程:首先进行几次的完整的和
成功的事后总结,证明它们的价值,同时帮助确定
具体书写事后总结的条件
引入事后总结机制时,最大的阻力来源于对投入产出比的
质疑,我们可以使用一些策略来应对这些挑战
确保对有效的书面总结提供奖励和庆祝,这不仅要
体现在公开渠道中,也应该体现在团队或个人的绩
效考核中
鼓励公司高级管理层认可和参与其中

事后总结为单个故障提供了详细的信息,但是它们只是整个解决方案中的一部分,只有影响非常大的故障才会进行事后总结,所以小型但是频繁发生的故障经常不会被包含在内

跟踪故障

系统性地从过去发生过的问题中学习是服务运维
的必要手段,但事故复盘并不能覆盖所有的场景
故障总结常常用于讨论对整个服务或者整套服务体系的改
进意见,有可能错失一些对小型服务的改进意见的讨论
同时,单独故障的事后总结有可能错过一些从全局来看非
常有用,但是对单独故障不那么划算的改进讨论
为什么要跟踪故障? 提高系统可靠性的唯一可靠的方法论是为系统可
靠性建立一个基线,同时不断跟踪其改变
故障跟踪系统就用于实现这个目标:被动收集监
控系统发出的的所有告警信息,同时提供标记、
分组和数据分析功能
某个单独的故障,可能(经常会)触发多个告
警;在级联场景中尤其常见
聚合:将多个告警信息合并成一个 试图减少同一个故障造成的报警信息总数量是值
得做的,但是有时候在考虑过滤掉虚假报警以及
漏报报警的危险性时,可能无法完全避免
将多个告警信息“聚合”成一个单独的故障,能够
有效地消除重复告警,从而避免重复性工作
加标签:为告警信息添加建议类的元数据信息 故障跟踪工具为告警信息添加的标签对团队来说
可能会非常有用,它能够让团队在哪买员在不做
详细分析的情况下快速看到服务的一些问题
记录告警历史数据并基于这些数据分析系统性
的、周期性的,以及更广泛范围内的系统问题,
会对SRE团队带来莫大的好处
报告细节对每个团队来说会有所不同
底层的分析包括计数和基本的汇总统计报告 一般包括每周/每月/每季度的故障数量和每次故障的告警
数量
分析(记录告警并进行简单处理,例如计数和汇
总) 例如,同一时间长度内,告警次数是有所上升还是有所下
下一层的分析通常是对比团队/服务以及按时间 降等
分析趋势和模式 也可以将自己的告警数据与其他团队的告警数据对比,以
判断自己的告警是否过于频繁等
数据分析的下一步是找到影响更广泛的问题,不
仅仅是简单的计数,而是需要一些语义分析
运维痛点也是软件问题 做好运维是一个软件问题
SRE应当使用软件工程的方法来解决问题
SRE不会企业提供100%的可用性
以服务质量目标(SLO)为准绳 产品团队和SRE团队需要协同为用户设立合理的
可用性目标(SLO)
SLO也是利益相关者之间的协作准绳
“” 任何需要人工操作的、重复性的任务都不受欢迎
尽量减少琐事(人肉运维事项) 要不断地创造工具自动化这些任务
哪些内容需要自动化、在什么条件下自动化、如
何自动化
确定要自动化的工作 Google SRE要求其成员花在琐事上的时间不超过

50%
降低常规故障平均修复时间,有助于提升产品开
发人员的迭代速度
故障解决的越快,进度就越快 后期问题的发现和解决交由SRE负责是更有效的
方案
SRE团队并非成本中心,他们是生产运营得以保
障的根本
基于软件工程解决运维问题,同样是研发团队
SRE的背景情况 可用性
SRE更关注生产问题,而非业务逻辑问题 延迟
性能
负责确保服务质量 效率
与开发人员同舟共济 变更管理
监控
应急响应
容量规划和容量管理
前端
后端
产品开发团队和SRE需要共同掌握的技术栈 库
存储
内核
物理机
岗位虽然不同,但工具应该统一