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 程序也遇到了失败。
后续措施?
这个问题在首次部署到预发布环境时本应被发现。我们发现预发布日志中存在未导致测试失败或警报的故障。我们已添加新的预发布警报,以便将来能够捕获此类故障。