如何使用ResticBackupClient将数据备份到对象存储服务

来自菜鸟教程
跳转至:导航、​搜索

介绍

Restic 是一个用 Go 语言编写的安全高效的备份客户端。 它可以将本地文件备份到许多不同的后端存储库,例如本地目录、SFTP 服务器或与 S3 兼容的对象存储服务。

在本教程中,我们将安装 Restic 并在对象存储服务上初始化存储库。 然后我们将一些文件备份到存储库。 最后,我们将自动化我们的备份以拍摄每小时快照并在必要时自动修剪旧快照。

先决条件

对于本教程,您需要一台基于 UNIX 的计算机,其中包含一些您想要备份的文件。 尽管 Restic 适用于 Mac、Linux 和 Windows,但本教程中使用的命令和技术仅适用于 MacOS 和 Linux。

Restic 需要大量内存才能运行,因此您应该有 1GB 或更多的 RAM 以避免接收错误。

您还需要了解有关对象存储服务的以下详细信息:

  • 访问密钥
  • 密钥
  • 服务器网址
  • 存储桶名称

如果您正在使用 DigitalOcean Spaces 对象存储服务,您可以按照我们的教程 如何创建 DigitalOcean Spaces 和 API Key 设置空间并获取以上所有信息。

获得对象存储信息后,请继续下一部分安装 Restic 软件。

安装 Restic 备份客户端

Restic 可作为许多平台的预编译可执行文件使用。 这意味着我们可以下载单个文件并运行它,不需要包管理器或依赖项。

要找到要下载的正确文件,首先使用您的网络浏览器导航到 Restic 在 GitHub 上的发布页面。 您将在 Downloads 标题下找到文件列表。

对于 64 位 Linux 系统(最常见的服务器环境),您需要以 _linux_amd64.bz2 结尾的文件。

对于 MacOS,查找带有 _darwin_amd64.bz2 的文件。

右键单击您系统的正确文件,然后选择复制链接地址(您的浏览器中的措辞可能略有不同)。 这会将下载 URL 复制到剪贴板。

接下来,在您正在备份的计算机上的终端会话中(如果它是远程计算机,您可能需要先通过 SSH 登录),确保您位于主目录中,然后使用 [ 下载文件X200X]:

cd ~
curl -LO https://github.com/restic/restic/releases/download/v0.7.3/restic_0.7.3_linux_amd64.bz

解压我们下载的文件:

bunzip2 restic*

然后将文件复制到 /usr/local/bin 并更新其权限以使其可执行。 对于这两个操作,我们需要使用 sudo,因为普通用户没有写入 /usr/local/bin 的权限:

sudo cp restic* /usr/local/bin/restic
sudo chmod a+x /usr/local/bin/restic

通过调用不带参数的 restic 命令测试安装是否成功:

restic

一些帮助文本应打印到您的屏幕上。 如果是这样,则 restic 二进制文件已正确安装。 接下来,我们将为 Restic 创建一个配置文件,然后初始化我们的对象存储库。

创建配置文件

Restic 需要知道我们的访问密钥、密钥、对象存储连接详细信息和存储库密码,以便初始化我们可以备份的存储库。 我们将使用 环境变量 将这些信息提供给 Restic。

环境变量是您可以在 shell 中定义的一些信息,这些信息会传递给您运行的程序。 例如,您在命令行上运行的每个程序都可以看到您的 $PWD 环境变量,其中包含当前目录的路径。

将敏感令牌和密码放在环境变量中是一种常见的做法,因为在命令行中指定它们并不安全。 由于稍后我们将自动执行备份,因此我们会将这些信息保存在脚本可以访问的文件中。

首先,在您的主目录中打开一个文件:

nano ~/.restic-env

这将使用 nano 文本编辑器打开一个空文件。 完成后,该文件将包含四个 export 命令。 这些 export 语句定义环境变量并使它们可用于您将来运行的任何程序:

.restic-env

export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export RESTIC_REPOSITORY="s3:server-url/bucket-name"
export RESTIC_PASSWORD="a-strong-password"

访问密钥和密钥将由您的对象存储服务提供。 您可能只想为 Restic 生成一组唯一的密钥,以便在密钥丢失或泄露的情况下可以轻松撤销访问权限。

RESTIC_REPOSITORY 值的示例为:s3:nyc3.digitaloceanspaces.com/example-bucket。 如果您需要通过非标准端口或仅通过不安全的 HTTP 连接到服务器,请将该信息包含在 URL 中,如 s3:http://example-server:3000/example-bucket

RESTIC_PASSWORD 定义了 Restic 用于加密备份的密码。 此加密在本地进行,因此您可以备份到不受信任的异地服务器,而不必担心文件内容被泄露。

您应该在此处选择一个强密码,并将其复制到安全的地方以进行备份。 生成强随机密码的一种方法是使用 openssl 命令:

openssl rand -base64 24
Outputj8CGOSdz8ibUYK137wtdiD0SJiNroGUp

这会输出一个 24 字符的随机字符串,您可以将其复制并粘贴到配置文件中。

正确填写所有变量后,保存并关闭文件。

初始化存储库

要将配置加载到我们的 shell 环境中,我们 source 我们刚刚创建的文件:

source ~/.restic-env

您可以通过打印出其中一个变量来检查以确保它有效:

echo $RESTIC_REPOSITORY

您的存储库 URL 应该会打印出来。 现在我们可以使用 Restic 命令初始化我们的存储库:

restic init
Outputcreated restic backend 57f73c1afc at s3:nyc3.digitaloceanspaces.com/example-bucket

Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.

存储库现在已准备好接收备份数据。 接下来我们将发送该数据。

备份目录

现在我们的远程对象存储库已初始化,我们可以将备份数据推送到它。 除了加密之外,Restic 在备份时还会进行差异化和重复数据删除。 这意味着我们的第一次备份将是所有文件的完整备份,后续备份只需传输新文件和更改。 此外,将检测到重复数据并且不会写入后端,从而节省空间。

在我们备份之前,如果您在裸系统上进行测试并且需要一些示例文件来备份,请在您的主目录中创建一个简单的文本文件:

echo "sharks have no organs for producing sound" >> ~/facts.txt

这将创建一个 facts.txt 文件。 现在备份它,连同你的主目录的其余部分:

restic backup ~
Outputscan [/home/sammy]
scanned 4 directories, 14 files in 0:00
[0:04] 100.00%  2.558 MiB/s  10.230 MiB / 10.230 MiB  18 / 18 items  0 errors  ETA 0:00
duration: 0:04, 2.16MiB/s
snapshot 427696a3 saved

Restic 将工作一段时间,向您显示沿途的实时状态更新,然后输出新快照的 ID(在上面突出显示)。

注意:如果要备份不同的目录,请将上面的~替换为目录的路径。 如果目标目录不属于您的用户,您可能需要在 restic backup 前面使用 sudo。 如果您需要sudo进行备份,请记得在恢复快照时再次使用它,否则可能会出现无法正确设置权限的错误。


接下来,我们将学习如何找到有关存储在存储库中的快照的更多信息。

列出快照

要列出存储在存储库中的备份,请使用 snapshots 子命令:

restic snapshots
OutputID        Date                 Host         Tags        Directory
----------------------------------------------------------------------
427696a3  2017-10-23 16:37:17  restic-test              /home/sammy

您可以看到我们在第一次备份期间收到的快照 ID、拍摄快照时的时间戳、主机名、标签和备份的目录。

我们的 Tags 列是空白的,因为我们在这个例子中没有使用任何。 您可以通过在标签名称后添加 --tag 标志来将标签添加到快照中。 您可以通过重复 --tag 选项来指定多个标签。

稍后在您设置保留策略或手动搜索要还原的特定快照时,标记可用于过滤快照。

Host 包含在列表中,因为您可以将快照从多个主机发送到单个存储库。 您需要将存储库密码复制到每台计算机。 您还可以为存储库设置多个密码,以获得更细粒度的访问控制。 您可以在 官方 Restic 文档 中找到有关管理存储库密码的更多信息。

现在我们已经上传了一个快照,并且知道如何列出我们的存储库内容,我们将使用我们的快照 ID 来测试恢复备份。

恢复快照

我们将把整个快照恢复到一个临时目录中,以验证一切是否正常。 使用上一步列表中的快照 ID。 我们将恢复的文件发送到 /tmp/restore 中的新目录:

restic restore 427696a3 --target /tmp/restore
Outputrestoring <Snapshot 427696a3 of [/home/sammy] at 2017-10-23 16:37:17.573706791 +0000 UTC by sammy@restic-test> to /tmp/restore

切换到目录并列出其内容:

cd /tmp/restore
ls

您应该看到我们备份的目录。 在此示例中,它将是用户 sammy 的主目录。 进入恢复的目录,列出里面的文件:

cd sammy
ls
Outputfacts.txt  restic_0.7.3_linux_amd64

我们的 facts.txt 文件以及我们在教程开始时提取的静态二进制文件都在那里。 将 facts.txt 打印到屏幕上,以确保它符合我们的预期:

cat facts.txt

您应该会看到我们之前放入文件中的鲨鱼事实。 有效!

注意: 如果您不想恢复快照中的所有文件,您可以使用 --include--exclude 选项来微调您的选择。 阅读 Restic 文档 的恢复部分以了解更多信息。


现在我们知道备份和恢复工作正常,让我们自动创建新快照。

自动备份

Restic 包含一个 forget 命令,以帮助维护正在运行的快照存档。 您可以使用 restic forget --prune 设置每天、每小时、每周等保留多少备份的策略。 不符合策略的备份将从存储库中清除。

我们将使用 cron 系统服务每小时运行一次备份任务。 首先,打开用户的 crontab:

crontab -e

系统可能会提示您选择文本编辑器。 选择您最喜欢的 - 如果您没有意见,请选择 nano - 然后按 ENTER。 您的用户的默认 crontab 将在您的文本编辑器中打开。 它可能有一些解释 crontab 语法的注释。 在文件末尾,将以下内容添加到新行:

crontab

. . .
42 * * * * . /home/sammy/.restic-env; /usr/local/bin/restic backup -q /home/sammy; /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7

让我们逐步执行此命令。 42 * * * * 定义 cron 应该何时运行任务。 在这种情况下,它将在每周 小时天的第 42 分钟 运行。 有关此语法的更多信息,请阅读我们的教程 如何使用 Cron 自动执行任务

接下来,. /home/sammy/.restic-env; 等价于我们之前运行的 source ~/.restic-env 以将我们的密钥和密码加载到我们的 shell 环境中。 这在我们的 crontab 中具有相同的效果:此行上的后续命令将可以访问此信息。

/usr/local/bin/restic backup -q /home/sammy; 是我们的 Restic 备份命令。 我们使用 restic 二进制文件的完整路径,因为 cron 服务不会自动在 /usr/local/bin 中查找命令。 同样,我们使用 /home/sammy 明确拼写主文件夹路径,而不是使用 ~ 快捷方式。 在为 cron 编写命令时,最好尽可能明确。 我们使用 -q 标志来抑制来自 Restic 的状态输出,因为我们不会在附近阅读它。

最后,/usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7 将根据指定的保留标志修剪不再需要的旧快照。 在此示例中,我们保留 24 小时快照和 7 个每日快照。 还有每周、每月、每年和基于标签的策略的选项。

当您更新命令以满足您的需要时,保存文件并退出文本编辑器。 将安装并激活 crontab。 几个小时后,再次运行 restic snapshots 以验证是否正在上传新快照。

结论

在本教程中,我们使用对象存储身份验证详细信息为 Restic 创建了一个配置文件,使用 Restic 初始化存储库,备份了一些文件,并测试了备份。 最后,我们使用 cron 自动化了这个过程。

Restic 具有比这里讨论的更多的灵活性和更多的功能。 要了解有关 Restic 的更多信息,请查看他们的 官方文档主网站