服务器备份:3-2-1 规则与恢复方法
3-2-1 规则是这样的:重要数据保留三份(原始数据加两份备份),存放在两种不同的存储介质上,并且至少有一份保存在别处。对 VPS 来说,这意味着除了服务器上的数据之外,至少还要有一份在服务器之外。
为 US-CERT 编写并发布在 CISA 网站上的Data Backup Options 文件也推荐同样的规则。它的目的是确保一次故障、失误或攻击不会同时毁掉所有副本。
备份、快照和磁盘冗余不是一回事
- 备份:数据的独立副本,通常带有早期版本。它可以找回被误删或损坏的文件。
- 快照:记录服务器在那一刻的状态。适合在大的更新之前提供一条快速的退路。但它依赖原来的磁盘,所以不能代替备份。
- 磁盘冗余:同样的数据同时写入两块磁盘。当其中一块磁盘损坏时,它能保护您。您删除的文件会在两块磁盘上同时被删除,被勒索软件加密的数据也会在两块磁盘上同时被加密。所以它不是备份。
如何在 VPS 上应用 3-2-1
| 副本 | 位置 | 方式 |
|---|---|---|
| 原始数据 | 服务器的磁盘 | 您正在运行的系统 |
| 面板备份 | 管理标签页,备份 | 每晚自动进行,保留最近 7 天。已包含在价格中。 |
| 服务器之外的副本 | 您自己的电脑、另一台服务器或对象存储 | 由您自己设置。restic 示例见下文。 |
您可以把面板的每日备份算作其中一份副本。但满足“保存在别处”这一条件的副本,是您自己设置并掌控的那一份。Seturack 的服务条款也要求您另外保存一份重要数据的副本。
备份什么
直接复制正在运行的数据库的文件,可能得到不一致的备份。请先做一次转储。这些命令以 root 身份运行,就像在 cron 脚本中一样:
mysqldump --single-transaction --all-databases | gzip > /var/backups/mysql-$(date +%F).sql.gz
sudo -u postgres pg_dumpall | gzip > /var/backups/pg-$(date +%F).sql.gz
文件方面,备份这些就够了:/etc、您的网站文件、应用的数据文件夹、使用 Docker 时的 Docker 卷,以及 .env 文件。可以重新下载的内容不必备份,比如软件包和 Docker 镜像。如果您的应用有加密密钥,也请单独保存。对某些应用来说,没有密钥的备份毫无用处。
备份的频率取决于您能承受丢失多少数据。每天备份一次,意味着最坏情况下会丢失最多一天的数据。对于记录订单或付款的应用,更稳妥的做法是每小时转储一次数据库,并发送到服务器之外。
用 restic 做服务器之外的备份
restic 是一款开源备份工具,会加密您的备份,并且重复的数据只存一份。下面的示例把备份写入通过 SFTP 访问的另一台服务器。目标服务器需要支持免密(基于密钥)的 SSH 登录,因为自动备份无法回答密码提示。请在文本编辑器中创建密码文件(/root/.restic-password),并对它运行 chmod 600。
sudo apt install -y restic
export RESTIC_REPOSITORY=sftp:[email protected]:/backups/vps
export RESTIC_PASSWORD_FILE=/root/.restic-password
restic init
restic backup /etc /var/www /var/backups
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic 文档警告说,如果丢失密码,您的数据就永远找不回来了。请把这个密码也保存在密码管理器中。把两行 export、数据库转储、restic backup 和 restic forget 按这个顺序放进一个脚本,例如 /usr/local/bin/backup.sh,并用 chmod +x 使它可执行。别忘了在末尾加一行删除旧转储文件的命令 find /var/backups -name '*.sql.gz' -mtime +2 -delete,否则转储文件会把磁盘占满。然后让脚本每晚运行,例如在 /etc/cron.d/backup 中加入下面这一行:
30 3 * * * root /usr/local/bin/backup.sh
borg 是类似的工具。单纯复制文件可以用 rsync,把数据发送到对象存储可以用 rclone。
真正的检验:恢复
无法恢复的备份毫无价值。设置完成后立刻试一次,之后定期再试:
- 使用 restic 时,把最新的备份解压到一个空文件夹,并检查文件:
restic restore latest --target /tmp/restore-test - 把数据库转储载入一个临时数据库,查看里面的表。
- 在面板中,点击备份旁边的从中恢复文件图标,浏览其中的内容并下载一个文件。完整恢复会替换当前的整个磁盘,所以恢复单个文件是更安全的测试方式。
备份保留多久,要看您可能多晚才发现问题。面板备份保留最近 7 天,无法回溯到更早的时间。如果可能需要更早的版本,请在自己的副本中保留每周和每月的版本。面板备份的详细情况,请参阅每日备份文章。
常见错误
- 把备份写到同一台服务器的磁盘上。磁盘写满或服务器丢失时,备份也会一起没有。
- 把备份的密码或密钥和备份放在同一个地方。
- 没有发现脚本一直在失败。请在脚本中加入通知,或者时不时用
restic snapshots查看最新备份的日期。 - 没有留意备份目标快要写满。目标写满后,备份会悄无声息地失败。
评论0
暂无评论
成为第一个分享想法的人。
请登录或注册后发表评论。