书籍介绍
这本书主要介绍SRE运维中一些指导思想和实践方法论。主要分为4个部分:
- 概览部分:介绍SRE方法论、以及从SRE视角看待生产环境。
- 指导思想:介绍风险应对、服务质量、琐事、监控、系统演进、发布工程、简单化等方向思想
- 具体实践:涉及监控、on-call、故障排除、响应以及紧急事故管理等等。
- 管理:主要介绍如何培训、沟通、团队建设等方面的问题。
第一部分 概览
第二部分 指导思想
第7章 Google 的自动化系统的演进
这章的标题可能有点误导,感觉这章的内容重点是放在自动化上面,而不是演进。
自动化的价值
提到自动化,首先进入我脑海的就是无人系统,比如自动驾驶、机械自动化等等。在运维角度的自动化也是类似的作用:如命令执行的自动化,批量将一个脚本(修改)分发到许多机器中,将一个变更应用到多个实例中。在原文中称这个为"一致性":
一致性地执行范围明确、步骤已知地程序——是自动化地首要价值。
自动化地目的当然就是解放人力、让人尽可能得少参与到其中。自然而然带来的一个价值就是成本的降低以及效率的提高。在原文中为"行动速度更快"和"节省时间".
此外,如果无法做到故障的处理,自动化肯定也无从谈起,因为一旦出错就需要人工介入的话怎么算得上是自动化呢?因此自动化的另一个必然的价值就是"自我修复能力".这相比于人工而言,机器的修复的速度必然也是更快的。
此外还需要一个自动化平台,对自动化进行统一管理。
总结文中的价值如下:(当然可能也有许多价值,这些也只是作者举得几个例子)
- 一致性
- 平台性
- 修复速度更快
- 行动速度更快
- 节省时间
自动化对Google SRE的价值
这章主要介绍了Google为什么坚定得选择了自动化,以及选择自动化的背景。此外还指出,并不是实际情况下任何组件都是需要进行自动化的。比如某些Demo和一些快速原型并不需要长久运行,这些生命周期短暂的应用也并没有应对自动化做出相应的设计。
自动化的应用案例
运维行业中对自动化的定义: 通过编写代码来解决各种各样的问题。
Google SRE中的自动化,除了上面运维行业的定义之外,更加侧重于:
自动化管理系统的生命周期,而非系统内部的数据,比如部署新的集群服务。
自动化的演进路径:
- 没有自动化
- 外部维护的系统特定的自动化系统
- 外部维护的通用的自动化系统
- 内部维护的系统特定的自动化
- 不需要任何自动化的系统
让自己脱离了工作: 自动化所有的东西
讲了Google将Mysql迁移到Borg上面的过程,考虑到Mysql的高可用性而开发了自动故障转移,利用容器化技术,提高了硬件的利用率、自动化程度,以及Mysql集群(主从架构)的高可用性。
舒缓疼痛:将自动化应用到集群上线中
集群上线的难点:
一些服务有超过一百个不同的组件子系统,每一个都具有复杂的网状依赖。某个子系统的配置失败,或者是没有按照其他集群来配置一个系统或组件,将造成潜在的故障发生。 为了加速集群的交付,会大量通过SSH执行Shell脚本来应对繁琐的包分发和服务初始化问题,但这些这些格式自由的Shell脚本会逐渐形成技术债务。
- 不一致问题解决方案
- 使用Prodtest(生产测试)检测不一致情况【单元测试】
- 幂等地解决不一致情况【修复程序周期性得执行,而不会对集群配置造成损害】
专业化的倾向:
自动化代码和单元测试代码一样,当维护团队不再关心它与覆盖的代码仓库同步的时候就会逐渐失效。
从SSH到Admin服务器: SRE从在自己的主目录里维护Shell脚本迁移到了构建评审过的RPC服务器与细粒度的ACL上。做了最小权限的SRE,以及完整的审计过程。
后面关于Borg的内容其实就是K8S的前身,不介绍了。
第三部分 具体实践
第10章 基于时间序列数据进行有效报警
监控是运营一个可靠的稳定服务不可缺少的部分
- 早期的监控(探针模型):使用脚本进行测试,检查回复信息)和图形化展示。
- 现代的监控: 自动收集时间序列数据,再通过时间序列操作语言转化为图表和报警信息。