博客

教程、指南和产品动态。

安全与备份

服务器备份:3-2-1 规则与恢复方法

3 11月 2026 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

暂无评论

成为第一个分享想法的人。

参与讨论

请登录或注册后发表评论。

不错过任何文章

通过电子邮件接收我们最新的教程、指南和产品资讯。

您已订阅我们的电子通讯。