需要备份的内容
保持数据库与对象一致
PostgreSQL 中的文件目录引用 bucket 中的对象。刷写时先上传对象,再把它登记到目录。合并与保留策略先移除目录中的引用,垃圾回收器在[storage.gc].grace_period_secs(默认 3600 秒)之后才删除对象。
按以下顺序备份才能保持一致:
- 先做 PostgreSQL 备份。
- 紧接着复制 bucket,并在宽限时间内完成。
grace_period_secs,或启用 bucket 版本控制,并把对象恢复到数据库备份的时间点。
备份 PostgreSQL
使用 PostgreSQL 服务自带的备份功能,例如带时间点恢复的定时快照。自建数据库在小规模部署中可以使用逻辑转储:备份对象存储
使用云厂商的 bucket 复制或版本控制。定时复制到第二个 bucket 同样可行:--endpoint-url。备份所用的凭据不应具备删除备份 bucket 内容的权限。
恢复
1
停止所有节点
停止全部 MoleSignal 进程,确保替换数据期间没有写入。
2
恢复 PostgreSQL
把备份恢复到一个空数据库:
3
恢复对象
把备份复制到节点使用的 bucket。把 bucket 恢复到数据库备份的时间点或之后的状态。对账器会把恢复后的目录没有引用的对象排入孤儿队列,垃圾回收器会在
[storage.reconciler].orphan_grace_secs(默认 24 小时)之后删除它们。较新的对象如果可能还有用,请先复制到别处。4
恢复密钥与配置
提供配置,以及被备份的部署所使用的同一个
MS_CIPHER_KEY。使用不同密钥的节点无法解密已保存的密文,启动时会失败,并报类似 open Probe CA key 的错误。5
有条件时恢复 WAL 卷
把 WAL 卷挂载到
[wal].dir,intake 会在启动时重放。没有这块卷时,故障发生时尚未刷写的记录将丢失。6
启动并验证
启动节点,等待
GET /api/v1/healthz 返回 200。登录后打开一个数据流,对恢复的时间范围执行查询。检查 /metrics 中 reason="missing" 的 storage_reconciler_issues_total。出现这样的条目,说明目录引用了 bucket 中不存在的对象。