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

介绍

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

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

先决条件

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

Restic需要大量的内存运行,所以你应该有1GB或更多的内存来避免接收错误。

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

  • 访问密钥
  • 密钥
  • 服务器网址
  • 分类名称

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

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

安装Restic Backup Client

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

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

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

对于MacOS,请使用_darwin_amd64.bz2查找该文件。

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

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

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 ~/.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,快照拍摄的时间戳,主机名,标签以及备份的目录。

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

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

主机包含在列表中,因为您可以将多个主机的快照发送到单个存储库。 您需要将存储库密码复制到每台机器上。 您还可以为您的存储库设置多个密​​码,以实现更细粒度的访问控制。 您可以在官方的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文件和我们在教程开始时提取的restic二进制文件一起。 facts.txt打印到屏幕上,确保它是我们所期望的:

cat facts.txt

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

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

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

自动备份

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

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

crontab -e

您可能会被提示选择一个文本编辑器。 选择你最喜欢的 - 或者如果你没有意见的话 - 然后按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

让我们一步一步通过这个命令。 cron运行任务时, 42 * * * *定义。 在这种情况下,它将在每小时每天每月每天的第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的更多信息,请查看他们的官方文档主要网站

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏