
一台服务器上运行 60 个容器
一个裸金属服务器运行数十到数百个 Hoody 容器。KSM 和 BTRFS 去重使边际成本接近零。
加一条 hoody-cron 条目,在 03:00 迁移作业前 5 分钟触发。它 curl 快照 URL,并把产物标记为回滚点。如果迁移失败,一条 PATCH 就能在 30 秒内恢复。
{ "name": "snap-2026-05-04", "alias": "rollback-point", "created_at": "02:55:08Z" }
一晚,五个事件,零次告警
cron 服务调度一条 curl。快照服务负责冻结。两者都不知道五分钟后会跑迁移作业——这正是关键。
# register the recurring snapshot job (one-time setup) curl -X POST \ cron.containers.hoody.com/users/root/entries \ -H "Content-Type: application/json" \ -d '{ "schedule": "55 2 * * *", "command": "curl -X POST $SNAP_URL -d '{\"alias\":\"rollback-point\"}'", "comment": "pre-migration snapshot" }'
# what the cron entry curls every night at 02:55 UTC curl -X POST \ api.hoody.com/api/v1/containers/$ID/snapshots \ -H "Authorization: Bearer $TOKEN" \ -d '{"alias": "rollback-point", "expiry": 7}' # response from the snapshots service → 200 OK · snap-2026-05-04 created in 8s
cron 条目是 Hoody 某个 Postgres 表里的一行。快照 URL 把内容寻址的 blob 写入容器存储后端。两者都持久、都有版本,都不需要在你的笔记本上保留长进程。
四个时刻,四个 URL,安全网与变更之间隔着五分钟。迁移在多数工程师第一个闹钟响起前就完成了。
如果第 03 步失败,回滚就是 `PATCH /snapshots/snap-2026-05-04`,你回到了 02:55:08Z。上方的审计时间线就是同一份数据,以 JSON 形式提供。
不是快照本身,是这种形状:在变更之前就存在的备份,以 URL 寻址,名字带着今天的日期。
大多数事故复盘都以“我们忘了备份”开头。当备份是一条 cron 条目,你忘不了。02:55 的快照就是 runbook 的第一句话——已经提前写好。
恢复 snap-2026-05-04 是对 api.hoody.com 的一次 HTTP 调用。容器在 30 秒内回到 02:55:08Z 的状态。无工单,无 on-call 升级,无“谁还有 AWS 控制台”。
快照按内容寻址,以增量形式存储。你只为 412 MB 的增量(叠在未变的基础磁盘上)付费,且只在 7 天保留窗口内付。成功的迁移几乎不留痕。
过去的 runbook 是什么样,而当快照以今天的日期命名、以 URL 寻址时,它收缩成什么样。
右栏新出现的内容不是工具,而是 runbook 里的一句话。这句话不再以“先做备份”开头,因为备份已经存在。
回滚方案,就是你预先调度好的一个 URL。
围绕迁移前备份的种种繁琐仪式。安排好快照,然后安心睡过迁移窗口。
回滚方案,就是你预先调度好的一个 URL。