docs.rs 服务中断事后分析

2019年10月24日 · Pietro Albini 代表 基础设施团队发布

协调世界时 2019年10月21日 01:38,docs.rs 网站因托管应用程序的服务器上没有可用磁盘空间而宕机。由于同样的原因,自协调世界时 2019年10月20日 00:55 起,crate 构建就已失败。

服务中断的根本原因

docs.rs 需要先将构建好的文档存储在文件系统中,然后才能上传到数据库,存储位置是 /opt/docs-rs-prefix/documentations 目录。然而,docs.rs 从未清理过该目录,因此随着时间推移,其大小不断增加,直至导致了本次服务中断。虽然存在定期清理临时目录的代码,但从未配置它来清理导致本次中断的目录。

解决方案

由于该目录不包含任何持久性数据,我们清除了它并重新启动了 Web 服务器。一旦我们确认情况已解决,所有因服务中断而失败的 crate 都被重新排队等待构建。

事后分析

磁盘使用量的增加是一个持续数周的渐进过程,缓慢达到 100% 并导致了本次服务中断。尽管有监控系统到位并记录了增长曲线,但未配置警报,因此没有人注意到这个问题。我们需要在磁盘使用量达到 90% 时添加警报,以便及时调查和处理问题。

crate 构建在服务中断发生前一天就开始失败,此后几乎没有成功的构建。我们需要在大多数构建失败时设置警报:由于目前我们没有必要的指标来可靠地发出警报,我们还需要增加额外的监测手段。

由于服务值班轮换的问题,我们的响应速度较慢。主要联系人没有所需的访问权限来增加实例的磁盘空间(这是最初调查的临时解决方案,但在发现没有醒着的人可以做到后被放弃),而备用联系人没有任何生产环境访问权限或对 docs.rs 的专业知识。

事件时间线

除非另有说明,所有事件均发生在 2019年10月21日,所有时间均为协调世界时 (UTC)。

  • 2019-10-20 00:55: 由于磁盘空间不足,crate 构建开始失败
  • 01:38: docs.rs 网站宕机警报触发,ashleygwilliams(备用联系人)收到呼叫
  • 01:39: QuietMisdreavus 加入运维频道
  • 01:39: QuietMisdreavus 找到了服务中断的原因(根分区已满)
  • 01:52: ashleygwilliams 提议增加磁盘空间,但没有具有所需权限的人醒着或有空
  • 01:56: ashleygwilliams 联系了 Mark-Simulacrum,他拥有增加磁盘所需的访问权限
  • 01:57: QuietMisdreavus 找到了占用所有磁盘空间的目录
  • 02:00: QuietMisdreavus 删除了占用所有磁盘空间的目录
  • 02:03: QuietMisdreavus 重启了 Web 服务器
  • 02:06: CDN 传播了变更,docs.rs 恢复在线
  • 02:06: Mark-Simulacrum 加入运维频道
  • 08:19: pietroalbini 将服务中断期间失败的构建重新加入队列
  • 19:27: 服务中断期间失败的 crate 的构建完成

行动项

  • 更新 docs.rs 源代码,使其自动清理问题目录。
  • 在服务器可用磁盘空间低于 10% 时添加警报。
  • 在大多数构建失败时添加警报。
  • 重新审视值班轮换,确保每个值班人员都有权限响应事件或升级问题。