Files
nexus/sreweekly/markdown/200/02-a-conjecture-on-why-reliable-systems-fail-zh.md

2.2 KiB
Raw Blame History

关于可靠系统为何失效的一个猜想

简介

一旦系统达到某种可靠性水平,大多数重大事件都会涉及:为缓解一个小事件而进行的人工干预,或某个主要目的本是提升可靠性的子系统出现意外行为。

正文

(我的一些同事称之为洛林定律(Lorin's Law))

即使是高度可靠的系统偶尔也会宕机。在仔细阅读了多起事件的细节后,我开始注意到一种模式,由此得出了以下猜想:

一旦系统达到某种可靠性水平,大多数重大事件都会涉及:

  • 为缓解一个小事件而进行的人工干预,或
  • 某个主要目的本是提升可靠性的子系统的意外行为

以下是来自亚马逊对几次重大 AWS 故障的事后复盘(post-mortem)中的三个例子:

2017 年 2 月 28 日的 S3 宕机涉及一次人工干预——当时是为了排查导致 S3 计费系统进度慢于预期的问题。

2015 年 9 月 20 日的 DynamoDB 宕机(也影响了 SQS、自动扩缩和 CloudWatch)涉及健康的存储服务器因为执行一个(大概)为容错而设计的分布式协议而自行退出服务。

2012 年 10 月 22 日的 EBS 宕机(也影响了 EC2、RDS 和 ELB)涉及一个负责监控 EBS 服务器健康状况的代理中的内存泄漏 bug。

在《The Systems Bible》(我推荐)这本有趣的书中,有这样的观察(还有其他怪论):"失效安全系统(fail-safe systems)会以不安全的方式失效"。

系统中获得安全性的一种常见方式,是引入某种为此目的设计的子系统。因此,当这个子系统失效时……我想你也可以设计一个系统,让安全性来自系统自身的结构(而不是作为外加组件),但我不确定你是否能有意识地做到这一点!

四年过去了,我对这个猜想的现状很好奇。

我觉得它经受住了考验。