Blog

BorgBackup 增量备份与还原演练

备份工具里我更熟 restic,六月专门把 Borg 按「真要恢复」走了一遍,因为家里有一台机器历史上就在用 Borg 仓库,策略不能和 restic 打架。工具可以有两个,权威数据集与 runbook 不能互相打架。下面是事后复盘:演练目标、时间线、哪里翻车、改了什么文档。能还原才叫备份——这句话写过无数次,直到自己卡在口令环境变量上,才又活了一次。

演练目标(事先写在纸上)

  • 从远程 SSH 仓库列出最近七天归档
  • 只恢复 /etc/stack 与一份应用数据目录到临时路径
  • 用 checksum 或实际打开配置做校验
  • 记录墙钟时间与阻塞点
  • 不破坏现网挂载与生产目录

刻意不做「整库灾难恢复」第一次就上全盘:先证明单目录路径通,再谈裸机。目标写下来的好处是:演练中途不会变成「顺便整理仓库」或「顺便升级客户端」,范围一扩就永远做不完。

事前状态

仓库初始化(历史命令,演练日未重做):

borg init --encryption=repokey user@backuphost:~/borg-lab

日常创建:

borg create --stats \
  user@backuphost:~/borg-lab::'{hostname}-{now}' \
  /data /etc/stack /opt/stack

密码在密码管理器;repokey 模式意味着密钥材料在仓库侧加密保存,口令丢了等于归档作废。演练前我确认了第二处有口令副本,这本身就该算检查项第零步。若用 keyfile 模式,还要确认密钥文件不在「只存在于被备份主机」的死循环里。

过程时间线

零时刻列出归档。 borg list 一次成功,最近归档命名规范,心情良好。

五分钟提取。 原计划:

mkdir -p /tmp/borg-drill && cd /tmp/borg-drill
borg extract user@backuphost:~/borg-lab::ARCHIVE-ID etc/stack

实际卡在:SSH 复用与 agent 在非交互 cron 环境没问题,但我在 tmux 里换了用户,权限与 BORG_PASSPHRASE 没导出,失败两次后才用 BORG_PASSCOMMAND 指向可读脚本。文档里只写了 create,没写 extract 的环境变量——这是第一处文档债,也是真实事故里最可能卡死的点。

二十分钟校验。 恢复出的 docker-compose.yml 与线上 hash 一致;但有一份证书路径是符号链接,extract 后断链,服务若直接指过去会挂。补了「恢复后检查符号链接目标是否在备份集内」的条目。有些路径其实依赖本机其它目录,单目录恢复本来就不完整,要在 runbook 里写清楚依赖边界。

三十五分钟 FUSE 挂载对比。 borg mount 浏览比 extract 省事,适合「只找一个文件」。卸载时忘了 fusermount -u,临时挂载点残留到第二天——第二处粗心,说明演练也要包含清理步骤,而不是找到文件就算赢。

五十分钟清理。 删除临时目录,确认无密钥明文落盘,确认挂载点消失。

整次有效操作约一小时,含翻车。若在真实事故压力下,光找口令与权限就会再加半小时——所以口令与恢复步骤必须在事故外练熟,写进别人也能照着做的清单。

暴露的问题与整改

  1. runbook 只有备份没有恢复。 已补:list → extract 或 mount → 校验 → 清理,并附环境变量与常见失败。
  2. 符号链接与稀疏文件。 关键路径改为备份实际内容,或在文档标明依赖外部路径。
  3. 仓库主机安全。 备份服务器账号最小权限、禁密码登录、限制来源;仓库被打穿等于历史数据被偷或被删。
  4. 与 restic 分工写进清单。 照片与通用目录走 restic;该 Borg 仓库继续 Borg;禁止同一数据集双工具无说明地互写,免得 prune 策略互相误伤理解。

压缩、加密与保留策略

默认压缩通常够用,先保证能恢复再微调压缩级别。加密选你能走通恢复路径的模式,而不是听起来最新的名词。prune 策略与 restic 的 keep 规则对齐到「日历语言」:例如每日保留七、每周四、每月六,避免一边狂删一边以为异地很满。演练日顺便 borg check 一次仓库完整性,发现问题比在灾难夜发现好。

复盘收尾

borg create 的绿色统计什么都不能证明;五十分钟后能在临时目录打开关键文件并说出耗时与坑点,才叫这周的备份仍然有效。下次演练会换另一台仓库、只恢复单个数据库 dump,继续找文档漏洞。备份系统的成熟度,不看你写过多少 create 成功的日志,而看你敢不敢在日历上写下下一次演练日期。

若你也维护多套备份工具:先写清「哪类数据、哪套工具、哪个仓库、谁有密钥」,再谈谁更先进。策略打架造成的误删与误 prune,比工具本身的性能差异可怕得多。这次 Borg 演练最大的收获不是学会了某条子命令,而是把恢复步骤从「我会」变成了「写下来了」。

← Back to Blog