【SRE】Google 运维解密

我们无法按照传统方式运维 Google 系统,必须要思考一种新的模式,但是同事我们也没有时间等待其他人验证和支持我们的理论:系统运维本质上是人与计算机共同参与的一项系统性工程。


更新历史

  • 2022.11.26:完成初稿

读后感

Google 的很多实践和经验是非常宝贵和有参考价值的,但是在不同的公司,不同的组织形式,都要有一个摸索的过程,这样才能真正把人的潜力和组织的潜力激发出来。

读书笔记

序言

  • SRE 是工程师,使用计算机科学和软件工程手段来设计和研发大型、分布式计算机软件系统
  • SRE 的关注焦点在于可靠性
  • SRE 的主要工作是运维在分布式集群管理系统上运行的具体业务服务(Service)
  • SRE 最重要的理念:对细节的不懈关注,做好充足的灾难预案和准备工作,时刻警惕着,不放过一切机会去避免灾难发生

概览

  • SRE 团队成员的特点:
    • 对重复性、手工性的操作有天然的排斥感
    • 有足够的技术能力快速开发出软件系统以替代手工操作
  • SRE 模型成功的关键在于对工程的关注。如果没有持续的、工程化的解决方案,运维的压力就会不断增加,团队也就需要更多的人来完成工作
  • SRE 团队必须将 50% 的精力花在真实的开发工作上。
    • 首先,必须不断地度量每个团队的工作时间分配
    • 一些常见的运维工作交还给产品研发部门,或者从产品研发部门抽调团队轮值值班工作
  • DevOps 是 SRE 核心理念的普适版

SRE 方法论

  • 要承担的职责
    • 可用性改进
    • 延迟优化
    • 性能优化
    • 效率优化
    • 变更管理
    • 监控
    • 紧急事务处理
    • 容量规划与管理
  • 方法论 1:确保长期关注研发工作
    • 所有的产品事故都应该有对应的事后总结,无论有没有触发警报
    • 事后总结应包括:事故发生、发现、解决的全过程、事故的根本原因、预防或者优化的解决方案
  • 方法论 2:在保障服务 SLO 的前提下最大化迭代速度
    • 任何产品都不是,也不应该醉倒 100% 可靠。因为对于最终用户来说,99.999% 和 100% 的可用性是没有实质区别的,从最终用户到服务器之间有很多中间系统,这些系统综合起来可靠性要远低于 99.999%。
  • 方法论 3:监控系统
    • 监控系统不应该依赖人来分析警报信息,而是应该由系统自动分析
    • 一个监控系统应该只有 3 类输出
      • 紧急警报 alert:立即执行某种操作,解决问题或者避免问题
      • 工单 ticket:在一段时间内(如几天)执行某种操作
      • 日志 logging:平时没人阅读,除非有特殊需要
  • 方法论 4:应急事件处理
    • 任何需要人工操作的事情只会延长恢复时间
    • 预案并将最佳方法记录在运维手册 playbook 可以使 MTTR 降低 3 倍以上
  • 方法论 5:变更管理。自动化完成以下几个项目:
    • 采用渐进式发布机制
    • 迅速而准确地检测到问题的发生
    • 当出现问题时,安全迅速地回退改动
  • 方法论 6:需求预测和容量规划
    • 必须有一个准确的自然增长需求预测模型,需求预测的时间应该超过资源获取的时间
    • 规划中必须有准确的非自然增长的需求来源的统计
    • 必须有周期性压力测试,以便准确地将系统原始资源信息与业务容量对应起来
  • 方法论 7:资源部署
    • 是变更管理与容量规划的产物,必须能够非常迅速地完成
  • 方法论 8:效率与性能
    • 一个业务总体资源的使用情况是由以下几个因素驱动:用户需求(流量)、可用容量和软件的资源使用率

Google 的生产环境:SRE 视角

概念区分:

  • 物理服务器 machine:代表具体的硬件(有时候也代表一个 VM 虚拟机)
  • 软件服务器 server:代表一个对外提供服务的软件系统

典型的 Google 数据中心拓扑结构:

  • 约 10 台物理服务器组成了一个机柜 Rack
  • 数台机柜组成一个机柜排 Row
  • 一排或者多排机柜组成了一个集群 Cluster
  • 多个集群形成一个数据中心 Datacenter
  • 多个相邻的数据中心组成了一个园区 Campus

指导思想

高昂的成本主要存在于以下两个维度:

  1. 冗余物理服务器/计算资源的成本
  2. 机会成本

选择目标 SLO 不是一个纯粹的技术活动,还涉及产品和业务层面的决策,SLI/SLO/SLA 的选择都应该直接反映该决策:

  1. 不要仅以目前的状态为基础选择目标
  2. 保持简单
  3. 避免绝对值
  4. SLO 越少越好
  5. 不要追求完美

监控系统的 4 个黄金指标分别是延迟、流量、错误和饱和度(saturation):

  1. 延迟。服务处理某个请求所需要的时间,需要区分成功请求和失败请求
  2. 流量。对于 Web 服务器来说,一般是每秒 HTTP 请求;针对流媒体系统来说,一般是网络 I/O 速率;对于 KV 存储来说,一般是每秒交易数量,或每秒的读取操作数量

设计监控系统时一定要追求简化:

  1. 那些最能反映真实故障的规则应该越简单越好,可预测性强,非常可靠
  2. 那些不常用的数据收集、汇总,以及警报配置应该定时删除
  3. 收集到的信息,但是没有暴露给任何监控台,或者被任何警报规则使用的应该定时删除

自动化:允许大规模故障发生。

软件的简单性是可靠性的前提条件。

具体实践

事故流程管理最佳实践

  1. 划分优先级:控制影响范围,恢复服务,同时为根源调查保存现场
  2. 事前准备:事先和所有事故处理参与者一起准备一套流程
  3. 信任:充分相信每个事故处理参与者,分配职责后让他们自主行动
  4. 反思:在事故处理过程中注意自己的情绪和精神状态。如果发现自己开始惊慌失措或者感到压力难以承受,应该寻求更多的帮助
  5. 考虑替代方案:周期性地重新审视目前的情况,重新评估目前的工作是否应该继续执行,还是需要执行其他更重要或者更紧急的事情
  6. 练习:平时不断地使用这项流程,直到习惯成自然
  7. 换位思考:上次你是事故总控负责人吗?下次可以换一个职责试试。鼓励每个团队成员熟悉流程中的其他角色。

协作和知识共享

事后总结文档使用同一个模板。努力确保下列功能:

  1. 实时协作:使得写作过程可以很快地收集数据和想法。这在事后总结早期很有帮助。
  2. 开放的评论系统:使大家都可以参与进来提供解决方案,以及提高对事故处理细节的覆盖程度
  3. 邮件通知:可以在文档中给其他用户发消息,或者引入其他人来共同填写文档

建立事后总结文化

虽然管理层可以鼓励建立“对事不对人”的氛围,但是由工程师自主驱动,效果会更好,SRE 经常搞一些集体学习活动,示例如下:

  1. 本月最佳事后总结:可以是分享会,可以是邮件和帖子
  2. 事后总结聊天小组
  3. 事后总结阅读俱乐部

最佳实践

  • 避免指责提供建设性意见
  • 所有的事后总结都需要评审
  • 公开奖励做正确事的人
  • 收集关于事后总结有效性的反馈

管理

SRE 培训课程

推荐的培训方式

  • 设计一个具体的、有延续性的学习体验,以便学员跟进
  • 鼓励反向工程,利用统计学来思考问题,以及多思考问题本质
  • 鼓励学员分析失败的案例,分享好的事后总结来阅读
  • 创造一些受控的,但是逼真的场景让学员利用真实的监控环境和工具来修复
  • 在团队内以角色扮演的形式演习理论上可能发生的问题,让大家在这个过程中交流彼此的解决问题的方式
  • 给学员创造条件让他们参与见习 on-call,和实际轮值的 on-call 工程师交流经验
  • 让学员与 SRE 老手一起共同修订培训计划中的某个部分
  • 帮许愿一起找到一个具有一定复杂度的项目,帮助他们在整个技术栈内建立自己的地位

错误的培训方式

  • 通过给学员安排一些繁琐的工作(处理警报/工单)来培训
  • 要求严格按照现有的操作过程,检查列表,或者手册来执行命令进行训练
  • 在学员还没有对服务有全面认识的情况下,就要求他们成为主 on-call
  • 将新项目全部分配给 SRE 老手,新手 SRE 只能做一些零工

有抱负的 on-call 工程师的 5 个特点

  1. 对事故的渴望:事后总结的阅读和书写
  2. 故障处理分角色演习
  3. 破坏真的东西,并且修复它们
  4. 维护文档是学徒任务的一部分
  5. 尽早、尽快见习 on-call

发布协调检查列表

架构

  • 架构草图,服务器类型,客户端请求类型
  • 编程性客户端的请求

物理机与数据中心

  • 物理机数量与带宽数量,数据中心,N+2 冗度,网络 QoS
  • 新的域名,DNS 负载均衡

流量预估、容量以及性能

  • HTTP 流量与带宽预估,发布时的峰值,流量的组成,6 个月的预测
  • 压力测试,端到端测试,每个数据中心最高延迟下的容量
  • 对其他我们关注的服务的影响
  • 存储容量

系统可靠性与灾难恢复

  • 当下列情况发生时,服务会怎么样:
    • 物理机故障,机柜故障,集群故障
    • 两个数据中心之间的网络故障
  • 对每种需要联系其他服务器(后端)的服务器来说
    • 如何检测后端故障,后端故障如何处理
    • 如何在不影响客户端和用户的情况下重启服务器
    • 负载均衡,速度限制,超时,重试,以及错误处理
  • 数据备份/恢复,灾难恢复

监控与服务器管理

  • 监控内部状态,监控端到端行为,警报的管理
  • 监控监控系统
  • 有关财务的警报和日志
  • 在集群环境下运行服务的的技巧
  • 不要再代码中给自己发送海量邮件,会导致服务器崩溃

安全

  • 安全设计评审,安全代码评审,垃圾邮件风险,验证,SSL
  • 发布之前的可见/可访问性控制,各种类型的黑名单

自动化与人工任务

  • 更新服务器、数据,配置文件的方式和变更管理
  • 发布流程,可重复的构建过程,金丝雀测试,分阶段发布

增长问题

  • 空余容量,10 倍增长,增长型的警报
  • 扩展性的瓶颈,线性扩展,与硬件性能的同步扩展,所需要的变更
  • 缓存,数据分片/重新分片

外部依赖

  • 第三方系统,监控,网络条件,流量配比,发布时的流量峰值
  • 优雅降级,如何避免意外对第三方服务造成过载
  • 与合作伙伴、邮件系统,以及 Google 内部服务良好对接

发布时间与发布计划

  • 不可改变的截止日期,外部事件,星期一或者星期五
  • 该服务标准的运维流程,以及其他服务的运维流程