7月27日事件更新
周二世界协调时间14:18,Deno 组织提供的多项服务中断6分钟。在此期间,托管在 Deno Deploy 和 deno.land 网站上的项目均无法响应。我们已确定此次故障是由于数据库迁移与 Deno Deploy 中的各种内部服务不同步造成的。本文详细介绍了具体发生了什么、我们如何恢复系统以及我们正在采取哪些措施来防止将来发生这种情况。
所有服务现已恢复正常运行。没有数据丢失。我们认真对待此类故障,并对造成的中断深表歉意。
事件时间线
世界协调时间14:18,启动了典型的软件部署。
世界协调时间14:20,自动警报触发,显示对 deno.land/std 的请求失败。
世界协调时间14:21,我们通过将流量重定向到备用 Cloudflare Workers 恢复了 deno.land 网站的服务。此时,在 Deno Deploy 上运行的其他部署仍然无法访问。
世界协调时间14:24,Deno Deploy 项目的服务已恢复。
根本原因
问题是由数据库架构的更改引起的,其中一列被删除并由另一列替换。同时推出了使用新列的代码更改。
修改 Deno Deploy 基础设施不是原子操作。应用数据库更新后,许多运行引用旧列的代码的实例仍然在线。这些实例会定期轮询修改后的表,但由于现在缺少了预期列,它们开始崩溃。
随着更新在接下来的几分钟内进行,所有运行旧代码的实例都被替换,从而恢复了服务。
影响
在6分钟的时间段内,对 Deno Deploy 项目的请求失败,包括对 deno.land/x 和 deno.land/std 的请求。尝试从 /x 或 /std 下载模块的 Deno 程序遇到故障。
下一步是什么?
这个问题应该在第一次部署到暂存环境时就被发现。我们看到暂存日志中存在故障,但这些故障并未导致测试失败或警报。我们添加了新的暂存警报,以便将来捕获此类故障。