来自《老友记》里瑞秋跳舞的GIF视频,尺寸飙升到数百GB,导致Discourse的备份崩溃
简短概述
Discourse 是一个流行的在线讨论平台,目前拥有超过 22,000 个社区。
最近在备份网站时出现了严重问题:一张 GIF 文件(1.6 MB)被用户复制了 246,173 次,超出了 ext4 文件系统对硬链接的限制,导致备份大小膨胀到 377 GB。
以下是对情况、原因和解决方案的详细分析。
1. 发生了什么?
- Discourse 平台
- 社区数量 >22,000
- 文件问题:GIF “《老友记》里的瑞秋”,尺寸 1.6 MB
- 复制次数 246,173(硬链接)
- ext4 限制 ~65,000 个硬链接到同一 inode
- 最终备份大小 377 GB
为什么会这样?
Discourse 允许在任何帖子中插入表情符号和 GIF 文件。
当文件从一个上下文移动到另一个(例如,从私人聊天转到公开帖子)时,系统会为其生成新的随机 SHA‑1 哈希值。这意味着即使内容相同,Discourse 也将其视为新对象。
因此,一张 GIF 可能出现在数万条消息和私聊中——每次都会创建一个独立文件。最终 246,173 个复制品超过了 ext4 限制,系统开始生成新的文件而不是硬链接,导致“丢失”181,000 次备份。
2. 第一次解决方案 – 哈希聚合
Discourse 首先尝试通过 SHA‑1 将上传分组:
1. 备份时将所有相同哈希的文件归为一组。
2. 只保留每组中的第一份副本。
3. 对其余部分创建硬链接。
看起来很优雅,但没有考虑 ext4 的链接数量限制。一旦达到上限,系统会自动生成新文件而不是链接,导致备份大小急剧增加。
3. 新方案 – EMLINK 错误时的“切换”
Discourse 开发了更灵活的策略:
1. 正常创建硬链接。
2. 若文件系统返回 EMLINK(超出链接限制)错误,则下一份副本成为新的“主”文件。
3. 从此以后,新链接再次指向这个新的主版本。
这样,每次超过上限时都会切换到新的父文件,系统继续正常工作。这一方案兼容任何文件系统,无需额外配置。
4. 结论与启示
- 一张热门 GIF(《老友记》中的瑞秋舞蹈)导致备份膨胀至 377 GB。
- ext4 对 ~65,000 个硬链接的限制是关键因素。
- 第一次哈希聚合方案未考虑文件系统限制,导致数据丢失。
- 新的 EMLINK 切换策略能够正确管理大量副本并保持备份效率。
> “现在我们知道珍妮弗·安妮斯顿可以进行基础设施压力测试,”Discourse 在其博客中以讽刺语气指出。
评论 (0)
分享你的想法——请保持礼貌并围绕主题。
登录后发表评论