写点什么

从谷歌 20 年站点可靠性工程(SRE)中学到的 11 个经验教训

Adrienne Walcer, Kavita Guliani, Mikel Ward, Sunny Hsiao, and Vr

  • 2023-11-13
    北京
  • 本文字数:3154 字

    阅读完需:约 10 分钟

大小:1.52M时长:08:50
从谷歌20年站点可靠性工程(SRE)中学到的11个经验教训

让我们回到 2016 年,当时 YouTube 提供了大家最喜欢的视频,例如“Carpool Karaoke with Adele”和一直很吸引人的“Pen-Pineapple-Apple-Pen”。由于 YouTube 的分布式内存缓存系统的一个 bug,YouTube 经历了长达 15 分钟的全球宕机故障,中断了 YouTube 的视频提供能力。以下是我们从这次故障中学到的三个经验教训。

 

1、故障削减措施的风险应与故障的严重程度成比例

 

有一个表情包,其中一个人发布了一张在他们家里看到蜘蛛的照片,家长说:“是时候搬新家了!”。可笑的是,这一事件(看到一只可怕的蜘蛛)会得到严厉的削减措施(放弃你现在的家,搬到新家中)。我们 SRE 在选择比宕机风险更大的削减措施方面有一些有趣的经验。在上述 YouTube 宕机期间,一个有风险的减载过程并没有解决宕机问题……反而造成了级联故障。

 

我们得到了惨痛的教训,在故障发生期间,我们应该监控和评估情况的严重性,并选择一条风险适合该严重程度的故障削减路径。在最好的情况下,风险削减措施可以解决宕机问题。在最坏的情况下,风险削减措施会失灵,并且本应修复问题的措施会导致宕机时间的延长。此外,如果一切都坏了,我们可以做出明智的决定来绕过标准程序。

 

2、在发生紧急情况之前,应对恢复机制进行全面测试

 

在高层城市建筑中进行紧急消防疏散是首次使用梯子的可怕时机。同样,在故障中首次尝试风险减载过程也是一个糟糕的时机。为了在高风险和高压力的情况下保持冷静,事先演练恢复机制和故障削减措施很重要,并需要验证:

 

  • 它们会做你需要它们做的事

  • 你知道怎么做

 

演练恢复机制有一个有趣的副作用,即可以降低执行其中一些操作的风险。自从这次混乱的宕机以来,我们加倍努力地进行演练。

 

3、金丝雀所有变更

 

有一次,我们想要推送缓存配置变更。我们很肯定那不会导致任何坏事。但相当肯定并不是百分之百确定。事实证明,缓存对于 YouTube 来说是一个非常关键的功能,而配置变更产生了一些意想不到的后果,导致该服务完全瘫痪了 13 分钟。如果我们采用渐进式的发布策略来应对这些全球变更,那么这次故障本可以在产生全球影响之前得到遏制。可以阅读这篇论文中了解有关金丝雀策略的更多信息,也可以通过本视频以了解更多信息。

 

大约在同一时间段,比 YouTube 稍微年轻的兄弟公司谷歌日历(Google Calendar)也经历了宕机故障,这也是接下来两个经验教训的背景。

 

4、有一个“大红色按钮”

 

“大红色按钮”(Big Red Button)是一种独特但高度实用的安全功能:它应该启动一个简单、易于触发的动作,该动作将触发不良状态恢复到(理想情况下)关闭正在发生的任何情况。“大红色按钮”有多种形状和大小,在提交一个有潜在风险的操作之前,识别这些大红色按钮可能是什么非常重要的。我们曾经差点就能避免一次重大的宕机故障,因为提交可能触发变更的工程师在更改传播之前拔掉了台式电脑的电源插头。因此,在计划重大部署时,请考虑大红色按钮是什么?确保每个服务依赖项都有一个“大红色按钮”,以便在紧急情况下使用。请参阅“通用削减措施”以了解更多信息!

 

5、仅仅进行单元测试是不够的,还需要进行集成测试

 

啊……单元测试。它们验证单个组件是否可以按照我们需要的方式执行。单元测试的范围是有意限制的,而且非常有用,但它们也不能完全复制可能存在的运行时环境和生产需求。因此,我们大力提倡集成测试!我们可以使用集成测试来验证作业和任务是否可以执行冷启动。事情会按照我们希望的方式进行吗?组件也会按照我们想要的方式协同工作吗?这些组件会成功创建我们想要的系统吗?这一教训是在谷歌日历(Calendar)的故障处理中学到的,在这次故障中,我们的测试没有遵循与实际使用相同的路径,导致了大量的测试......但这并不能帮助我们评估变更在现实中的执行情况。

 

转到 2017 年 2 月发生的一个故障,我们学到了接下来的两个经验教训。

 

首先,不可用的 OAuth 令牌导致数百万用户退出设备和服务,并导致 32000 个 OnHub 和 Google WiFi 设备执行出厂重置。由于登录失败,手动帐户恢复索赔增加了 10 倍。谷歌花了大约 12 个小时才从这次故障中完全恢复过来。

 

6、沟通渠道!还有备份通道!!以及这些备份通道的备份!!!

 

是的,那是一段糟糕的时光。你想知道是什么让情况变得更糟的吗?团队希望能够使用 Google Hangouts 和 Google Meet 来管理事件。但当 3.5 亿用户退出他们的设备和服务时……回想起来,依赖这些谷歌服务是一个糟糕的决定。确保你拥有独立的备份通信通道,并且已对其进行了测试。

 

然后,2017 年的同一故障让我们更好地理解了优雅降级

 

7、故意降级性能模式

 

人们很容易将可用性视为“完全启动”或“完全关闭”……但是能够通过降级性能模式提供连续的最小功能有助于提供更一致的用户体验。因此,我们谨慎而有意地构建了性能降级模式——因此,在粗略的补丁程序中,它甚至可能不会被用户看到(它可能现在正在发生!)。服务应该适度降级,并在特殊情况下继续运行。

 

下一个经验教训建议我们确保最后一道防线系统在极端情况下能如预期的那样工作,例如自然灾害或网络攻击,这些情况会导致生产力或服务可用性的损失。

 

8、故障弹性测试

 

除了单元测试和集成测试之外,还有一些非常重要的其他类型的测试:故障弹性和恢复测试。弹性测试验证我们的服务或系统在发生故障、延迟或中断时是否正常运行,而恢复测试则验证服务在完全关闭后是否能够恢复到稳态。两者都应该是业务连续性战略的关键部分——如“抵御意外”中所描述的那样。一个有用的活动还可以是让你的团队坐下来,研究其中一些场景在理论上是如何发挥作用的——桌面游戏风格。这也是一个探索那些可怕的“假设”的有趣机会,例如,“如果部分网络连接意外关闭怎么办?”。

 

9、自动化故障削减措施

 

2023 年 3 月,几个数据中心的多个网络设备几乎同时发生故障,导致大范围的数据包丢失。在这 6 天的宕机故障中,估计 70%的服务受到了不同程度的影响,具体取决于网络故障时的位置、服务负载和配置。

 

在这种情况下,我们可以通过手动自动化故障削减措施来减少平均解决时间(MTTR)。如果有一个明确的信号表明某个特定的故障正在发生,那么为什么不能以自动化的方式启动故障削减措施呢?有时,最好先使用自动故障削减措施,并在避免了用户影响之后再解决根本原因。

 

10、缩短部署之间的时间间隔,以降低部署出错的可能性

 

2022 年 3 月,支付系统大范围故障,客户无法完成交易,导致 Pokémon GO 社区日被推迟了。原因是删除了一个数据库字段,这应该是安全的,因为该字段的所有使用都事先从代码中删除的。不幸的是,系统某一部分的缓慢部署节奏意味着该字段仍在被线上系统所使用。

 

部署之间有很长的间隔,尤其是在复杂的多组件系统中,会使得我们很难推断出特定变更的安全性。间隔很近部署(并进行适当的测试)可以减少此类故障的意外发生。

 

11、单一全球硬件版本会是单点故障

 

只使用一种特定型号的设备来执行关键功能可以简化操作并能使运维更简单。然而,这也意味着,如果该模型出现问题,则该关键功能将不再执行。

 

这一故障发生在 2020 年 3 月,当时一台网络设备遇到了一个未被发现的零日漏洞,该漏洞触发了流量模式的变更。由于整个网络都在使用相同型号和版本的设备,因此出现了严重的区域性故障。防止这种情况全面故障的原因是存在多个网络主干网,这些主干网允许高优先级流量通过仍在工作的替代路由。

 

关键基础设施中的潜在漏洞可能潜伏在未被发现的地方,直到一个看似无害的事件触发了它们。维护多样化的基础设施虽然本身会产生成本,但可能意味着麻烦的区域故障和全面故障之间的差异。

 

所以你学到了嘛!从谷歌 20 年的站点可靠性工程中汲取的 11 个经验教训。为什么是 11 个呢?好吧,你看,谷歌站点可靠性有着丰富的历史并仍然处于鼎盛时期。

 

原文链接:

https://sre.google/resources/practices-and-processes/twenty-years-of-sre-lessons-learned/

2023-11-13 18:534927

评论

发布
暂无评论
发现更多内容

从零开始学Java系列之Java是什么?它到底是个啥?

千锋IT教育

新鲜出炉|基于深度学习的运维日志领域新进展

云智慧AIOps社区

人工智能 深度学习 日志分析 日志管理 运维管理

如何通过前端培训成为合格的程序员

小谷哥

适用更多会议场景,华为云会议的分组讨论功能来了!

IT科技苏辞

聊聊Mybatis的类型转换的别名管理

急需上岸的小谢

11月月更

进腾讯了!全靠着这两份近千页的Redis+Netty技术笔记

小小怪下士

Java redis 程序员 面试 Netty

先到先得!阿里淘系内传322页Java并发编程核心讲义学习笔记

钟奕礼

Java java面试 java编程 程序员 java

宜昌市委书记王立调研数字经济发展并莅临升哲科技

SENSORO

ThreadPool的线程开启、线程等待、线程池的设置、定时功能

C++后台开发

线程 线程池 后端开发 C++开发 ThreadPool

Python太难懂?火山引擎数智平台这款产品可以了解一下

字节跳动数据平台

Python 大数据 数据分析

不会还有人不知道,面试靠这1700道java面试八股文题库就能杀进大厂吧

程序知音

Java java面试 java架构 后端技术 Java面试八股文

大数据培训学习方法有哪些

小谷哥

互联网大厂必问之MySQL、Redis、Spring三大块,面试必备技术栈

钟奕礼

Java java面试 java编程 程序员‘

商业智能BI工具如何选择?公司方面需学习具体方法

流量猫猫头

大数据

阿里云与信通院邀您参与云原生安全用户调研

阿里巴巴云原生

阿里云 云原生

java培训程序员失业后的发展方向

小谷哥

Spring Boot 3.0 正式发布,这份升级指南必须码住

程序知音

Java spring 微服务 springboot 后端技术

信息论与编码:信道的定义和分类

timerring

11月月更 信息论 信道

多点DMALL × Apache Kyuubi:构建统一SQL Proxy探索实践

网易数帆

hadoop spark 开源 Apache Kyuubi

数据技术前沿趋势、TiDB 产品方向、真实场景 Demo… 丨PingCAP DevCon 2022 产品技术论坛预览

PingCAP

TiDB

前端培训学习,就业前景怎么样

小谷哥

linux高可用软件有哪些?重点推荐哪款?

行云管家

高可用 双机热备

我从外包辞职了,10000小时后,走进字节跳动拿了offer

钟奕礼

Java java面试 java编程 程序员‘

小间距LED显示屏既是机遇也是挑战

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

java培训学习过程中需要什么方法?

小谷哥

Python(文件操作)

浅辄

Python 文件 11月月更

音频“黑科技”上新,华为云会议让“云端”声音更真切!

爱尚科技

Spring Boot 3.0 正式发布,这份升级指南必须码住

程序知音

Java spring 微服务 springboot 后端技术

瓴羊Quick BI工具,为数据分析人员带来帮助

流量猫猫头

大数据

使用RPA机器人快速实现表格数据汇总

YonBuilder低代码开发平台

开发者

又一巅峰神作!14年工作经验大咖出品“JVM&G1 GC深入学习手册”

钟奕礼

Java java面试 java编程 程序员‘

从谷歌20年站点可靠性工程(SRE)中学到的11个经验教训_服务革新_InfoQ精选文章