惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
Google Developers Blog
S
SegmentFault 最新的问题
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
P
Proofpoint News Feed
博客园 - 【当耐特】
MongoDB | Blog
MongoDB | Blog
L
LangChain Blog
F
Fortinet All Blogs
C
Check Point Blog
博客园_首页
I
InfoQ
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
美团技术团队
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research

犀利豆的博客

《SRE google 运维解密》读书笔记 (六) 《SRE google 运维解密》读书笔记 (五) 《SRE google 运维解密》读书笔记 (四) 《SRE google 运维解密》读书笔记 (三) 《SRE google 运维解密》读书笔记 (二) 2021 总结 终于有一个 Java 可以用的微信机器人了 Vertx入门到实战—实现钉钉机器人内网穿透代理 钉钉机器人回调内网穿透代理--使用篇 周末补习(一)trie 树 那些有趣的代码(三)--勤俭持家的 ArrayList 那些有趣的代码(二)--偏不听父母话的 Tomcat 类加载器 那些有趣的代码(一)--有点萌的 Tomcat 的线程池 从需求第三定律说起--为什么知乎的回答质量下降了 如何利用 Spring Hibernate 高级特性设计实现一个权限系统 居然有人能忘记吃饭?写个微信机器人提醒他 我的2018年总结 从 LongAdder 中窥见并发组件的设计思路 徒手撸框架--实现 RPC 远程调用 我的写作工具链 Java 渲染 docx 文件,并生成 pdf 加水印 撸码的福音--变量名生成器的实现 Raft 协议学习笔记 dubbo 源码学习(一)开篇 Redis 命令的执行过程 Redis 中的事件驱动模型 Redis 数据库、键过期的实现 Redis 的基础数据结构(三)对象 Redis 的基础数据结构(二) 整数集合、跳跃表、压缩列表 Redis 的基础数据结构(一) 可变字符串、链表、字典
《SRE google 运维解密》读书笔记 (一)
Zhengxin Diao 北邮本科,University of Leicester EE 研究生,Java后端开发,目前就职阿 · 2022-04-11 · via 犀利豆的博客

新财年换了领导,管理风格也有一些区别。在团队内增加了一个 SRE 的职位。这一财年我将会承担一部分 SRE 的工作。

之前作为开发者,总的来说从开发的角度来思考系统的稳定性。现在需要从更高更全面的角度来思考和理解站点的稳定性。上网研究了一番,SRE 是 google 的一个职位同时 SRE 也是一套 google 总结出来的站点稳定性的方法论。所以找来了 《SRE google 运维解密》。这本书成书比较早,里面有些章节介绍的技术栈可能过时。具体我也不了解 google 内部是否还在使用。但是方法论还是很合理、科学的。

一直以来我工作过的团队对于风险的态度都是,预防和杜绝。但是在这本书里面,google 对于风险的态度就变成了管理,合理使用,甚至利用风险来保证项目的迭代。

介绍

SER 是指 Site Reliability Engineer(站点可靠性工程师)。SRE 在 google 中有一套比较成熟的方法论包括如下:

  • 可用性改造
  • 延迟优化
  • 性能优化
  • 效率优化
  • 变更管理
  • 监控
  • 紧急事务处理
  • 容量规划与管理

SRE 方法论:

确保长期关注研发

SRE 只有 50% 的时间投入运维工作,如果超过就需要将任务分配至研发团队,形成良性循环,激励研发团队设计构建出不需要人工干预,自主运行的系统。
出现事故需要推动事后总结。

保证服务在 SLO 的前提下最大化迭代

  • 正确认识“错误预算”,系统不能 100% 可用,也不应该追求 100 %可用。
  • 业务系统可用利用错误预算,上新功能,黑度,AB test 等。
  • SRE 目标并不是 0 事故,而是与业务团队一起管理好“错误预算”

监控系统

  • 监控是 SRE 了解系统的重要手段
  • 监控只有三类输出
    • 紧急报警:收到报警的用户必须立即采取某些操作,解决问题或者避免即将发生的问题
    • 工单:收到报警的用户可以采取某些操作非立即,只需要在时效内完成。系统不会受到影响
    • 日志:平时无需关注日志,日志作为调试或者事后分析使用

应急事件处理

  • 可靠性是 MTTF(平均失败时间) 和 MTTR (平均回复时间)的函数
  • 人工操作的事情会延长回复时间
    • 运维手册
    • 事故演练

可以缩短恢复时间

变更的管理

  • 采用渐进式的发布
  • 迅速检测出问题的机制
  • 出现问题可以快速回滚

需求的预测和容量规划

  • 有明确的自然增加的预测
  • 规划中还要考虑非自然增涨的需求来源的统计
  • 定期压测,了解系统

资源部署

资源是变更和规划的产物

  • 快速正确的部署资源是基本的要求

效率和性能

改善利用率,降低成本。
从三个因素推动效率提升

  • 用户需求
  • 可用容量
  • 资源利用率

Google 的生产环境

成书较早,参考价值不大(略)

拥抱风险

管理风险

可靠性的提升,投入并不是线性的

冗余

  • 设备的冗余
  • 计算的冗余,增加一些空间进行奇偶校验

机会成本

  • 如果工程师投入到可靠性建设,就不能从事为用户开发的工作中了

所以,可靠性的管理是通过风险的管理进行的。提升系统可靠性和服务故障的耐受水平同等重要。努力提升服务可靠性,但是不超过服务需要的可靠性。否则将会付出更多的成本。

度量服务的风险

按时间:

可用性= 正常时间/(正常时间+ 不可用时间)

四个九 一年宕机 52 分钟
合计次数

可用性 = 成功次数/总调用次数

对于分布式系统按时间是不合理的,总有部分系统在线,所以 google 倾向使用按次统计

服务的风险容忍度

  • 客户对服务失败的容忍度
    • toB 要比 toC 低很多
    • 付费要比免费低
    • 关系到收入的要低
  • 故障的类型
  • 成本
  • 其他服务指标

基础设施容忍度

  • 可用性目标水平
    • 高可用性很贵
    • 要看人下菜碟,合理保障
  • 故障类型
  • 成本

错误预算使用的目的

错误预算的构建:

  1. 产品管理层定义一个 SLO,确定服务的预计正常运行时间
  2. 通过监控来度量
  3. 而知差值就是不可靠预算
  4. 如果预算为正就能够进行发布和变更。

好处

创新和可靠性的平衡点。

使用这个控制回路来调节发布的速度,有预算就快速迭代,如果频繁违反 SLO 或者错误预算被耗尽,就需要暂停发布,在测试和开发环节投入更多资源,提升系统可用性。

如果客观的故障发生比如光缆被挖断,影响了 SLO 需要扣减错误预算么?需要的,每个人都有义务保障服务正常运行。

利用错误预算机制,还能够找到定的过高的可用性指标。如果预算耗尽,团队无法发布,就可以考虑降低 SLO 来提升创新速度。

注:SLO 并非越高越好,稳定和创新通常是矛盾的。使用错误预算机制,闭环平衡稳定和创新的关系。

服务质量目标

术语:

  • SLI (indicator) 服务的某一个量化指标。比如
    • 延迟(rt)
    • 错误(error)
    • 吞吐量(qps)
    • 可用性
  • SLO (Objective) 可用性目标,通常指:

范围下限 <= SLI <= 范围上限

  • SLA (Agreement) 服务质量协议,指达到或者没有达到某个 SLO 的后果。

SLI 的实践中的应用

关心什么指标

  • 用户可见的系统:
    • 可用性
    • 延迟
    • 吞吐
  • 存储系统:
    • 延迟
    • 可用性
    • 持久性
  • 大数据系统:
    • 吞吐
    • 延迟
    • 时间
  • 所有系统都有关注延迟

收集

汇总

标准化

SLO 在实践中的应用

目标的定义

  • 指出如何被度量
  • 有效的条件

目标的选择

  • 不要仅以目前的状态为基础选择(要用发展的眼光)
  • 保持简单
  • 避免绝对值
  • SLO 越少越好
  • 不要追求完美

控制手段

  1. 监控并度量 SLI
  2. 是否需要人工干预
  3. 如果需要干预,决定怎么干预
  4. 执行具体干预措施

SLO 建立用户预期

  • 留有余量
  • 实际 SLO 不要过高

SLA 的使用

减少琐事

琐事的定义

  • 手动性
  • 重复性
  • 可被自动化的
  • 战术性的(突然出现的,非策略驱动和主动安排的)
  • 没有持久价值的
  • 与服务同步线性增长的(良好的设计至少是有数量级增长的)

SRE 工作内容

50% 琐事,50% 工程项目

工程工作

工程工作,是新颖的,本质上需要主观判断的工作。战略性的。有创新性和创造性的。通过设计来解决问题,越通用越好。

琐事的危害

  • 职业停滞
  • 士气低落
  • 造成误解
  • 进展缓慢
  • 开创先例(如果愿意接受琐事,那就会有更多的琐事)
  • 产生摩擦
  • 违反承诺

分布式系统的监控

术语定义

  • 监控
  • 白盒监控
    • 对系统暴露的性能指标进行监控
  • 黑盒监控
    • 通过测试某种外部用户可见的系统进行监控
  • dashboard
  • 警报
  • 根源问题
    • 某个缺陷被修复,就可以保证这种缺陷不再发生以同样的方式发生。
  • 节点或者机器
  • 推送

为什么要监控

  • 分析长期趋势
  • 跨世纪范围的比较,或者实验组和对照组之间的区别
  • 报警
  • 构建监控 dashboard
  • 临时性问题的回溯分析

监控可以在系统发生故障或者将要发生故障的时候通知我们。
处理报警会占用员工的时间,报警太频繁会造成“狼来了”效应

对监控系统设置合理预期

Google 倾向于使用简单和快速的监控,配合高效的工具进行分析。避免使用“魔方”系统-试图自动学习或者自动检查故障的系统。
监控系统的规则越简单约好。
监控系统信噪比应该很高,发出报警的组件应该简单可靠。

黑盒和白盒监控

白盒监控应该要作为监控的主要手段。
黑盒监控是面向现象的-现在发生的,而非即将发生的。
白盒监控大量依赖对系统内部信息的检测。白盒监控可以检测到即将发生的问题和重试严掩盖问题。白盒系统既可以面向原因也可以面向现象。

4 个黄金指标

  • 延迟(rt)
  • 流量
  • 错误
  • 饱和度
    • 通常是系统中最为受限的某个具体指标的度量。
    • 复杂系统里面,可以配合其他搞层次的负载度量使用。使用一个简介的指标。

长尾

只使用平均值是不足以描述系统的。需要区分平均值的慢,或者长尾值的慢。可以对数据进行分组统计。

简化直到不能再简化

  • 最能反应正式故障的规则越简单越好
  • 不常见的报警就要删除(定时删除没有用到的报警)
  • 没有被报警规则使用的信息,就应该

报警的深层次理论

  • 每当收到报警,需要立即进行某种操作,每天次数有限,过多会有“狼来了”效应
  • 每个紧急报警都应该是可以具体操作的
  • 报警的回复都应该是需要某种智力过程的,如果只需要固定的机械操作,那就不应该是紧急报警
  • 每个紧急报警都应该是正交的,不应该彼此重叠

监控系统的长期维护

系统不断演变,软件经常重构,负载和性能目标也经常变化。所以监控系统的的设计和决策充分考虑长期目标。每一个报警都会占用优化系统的时间。花时间投入监控,换取未来系统的稳定是值得的。

短期和长期的可用性经常冲突。通过一些“暴力”因素,可以使一个摇摇欲坠系统保持一定的高可用性,这种方案不能长久,且依赖个人英雄主义。

短期接受稳定性的降级获得长期的可用性提升。

Google 自动化演进

自动化的价值

  • 一致性
  • 平台性
    • 自动化的系统可以提供一个可以扩展的、广泛适用的。
    • 同时会将错误集中化、意味着修复的缺陷是一劳永逸的。
  • 修复速度更快
  • 行动速度快
  • 节约时间

发布工程

哲学

  • 自服务模型
  • 追求速度
  • 密闭性
    • 构建工具必须确保一致性和可重复性
  • 强调策略和流程

持续构建和部署

  • 构建
  • 分支
    • 所有代码默认提交到主分支上。
    • 构建一个发布分支
    • 发布分支不会并入主分支
    • 代码从主分支 cherry pick 到发布分支
  • 测试
    • 单测
  • 打包
  • 部署
  • 部署

配置管理

一开始就进行发布工程

不要做时候诸葛亮

简单化

软件系统是本质上是动态和不稳定的

  • 系统的稳定性和灵活性

    • 为了灵活性牺牲稳定性是有意义的。
  • 乏味是一种美德

  • 定期删除无用代码

  • “负代码行”作为指标

    • 臃肿的软件置管术是不可取的
    • 添加代码可能引入新的缺陷
    • 小的代码容易理解,也容易测试,缺陷就越少
  • 最小 API

    • 书写一个明确的,最小的 API 是软件系统简单的必要部分
    • 方法越少,参数越少也容易理解
  • 模块化

  • 发布简单化

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