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

介绍

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

在本教程中,我们将安装Restic并在对象存储服务上初始化存储库。然后我们会将一些文件备份到存储库。最后,我们将配置一些文件,另其可以自动执行备份以获取每小时快照,并在必要时自动精简旧快照。

准备

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

Restic的运行需要大量内存,因此请保留1GB或更多的RAM。

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

  • 访问密钥
  • 密钥
  • 服务器URL
  • Bucket名称

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

安装Restic Backup Client

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

首先我们使用Web浏览器导航到GitHub上的Restic发布页面。您将在“下载”标签下找到一个文件列表。

64位Linux系统(最常见的服务器环境)请查找以_linux_amd64.bz2结尾的文件。

MacOS系统请查找以_darwin_amd64.bz2结尾的文件。

右键单击正确的文件,然后选择“ 复制链接地址”

接下来,在您要备份的计算机上的终端会话的主目录中(如果它是远程计算机,您可能需要先通过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 TencentCloud_ACCESS_KEY_ID="your-access-key"
export TencentCloud_SECRET_ACCESS_KEY="your-secret-key"
export RESTIC_REPOSITORY="s3:server-url/bucket-name"
export RESTIC_PASSWORD="a-strong-password"

访问密钥和密钥将由对象存储服务提供。

上文中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
j8CGOSdz8ibUYK137wtdiD0SJiNroGUp

这将输出一个24个字符的随机字符串,您可以将其复制并粘贴到配置文件中。正确填写所有变量后,保存并关闭文件。

初始化存储库

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

$ source ~/.restic-env

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

$ echo $RESTIC_REPOSITORY

使用Restic命令初始化我们的存储库:

$ restic init
created 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 ~
scan [/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
ID        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
restoring <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
$ facts.txt restic_0.7.3_linux_amd64

我们的facts.txt文件与我们在本教程开头提取的restic二进制文件将出现在一起。打印facts.txt:

$ cat facts.txt

您应该看到我们先前放入的文件。

注意:如果您不想还原快照中的所有文件,可以使用--include和--exclude选项进行微调。

接下来,让我们自动创建新快照。

自动备份

Restic中的forget命令可以帮助维护快照的运行存档。您可以使用restic forget --prune设置每小时,每日,每周等保留的备份数量。任何不符合策略的备份都将从存储库中清除。

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

$ crontab -e

系统可能会提示您选择文本编辑器。我们选择nano 然后按ENTER。用户的默认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分钟运行。

. /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自动化了这个过程。腾讯云也提供云关系型数据云数据库Redis云数据库MongoDB 等等数据库服务,欢迎大家试用。


参考文献:《How To Back Up Data to an Object Storage Service with the Restic Backup Client》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

【译】Linux概念架构的理解摘要一、Linux内核在整个计算机系统中的位置二、内核的作用三、Linux内核的整体架构四、高度模块化设计的系统,利于分工合作。五、系统中的数据结构六、子系统架构七、结论

声明:本文翻译自Conceptual Architecture of the Linux Kernel

1164
来自专栏魏艾斯博客www.vpsss.net

非正常关闭 vi 编辑器产生 swp 文件怎么删除

1186
来自专栏Spark学习技巧

聊聊spark-submit的几个有用选项

1243
来自专栏IT技术精选文摘

架构师详解:Nginx 架构

1574
来自专栏FreeBuf

OFFICE OLE2LINK(CVE-2017-0199)漏洞利用详解

漏洞概述 FireEye最近公布了一个OFFICE 0day,在无需用户交互的情况下,打开word文档就可以通过hta脚本执行任意代码。经过研究发现,此漏洞的...

2479
来自专栏技术点滴

最简git Server配置

最简git Server配置 如何保持多台计算机的项目代码的同步更新呢?通过在一个公用计算机上开启git服务,任何能与该计算机互联的终端都可以同步最新的项目代码...

28510
来自专栏WindCoder

ubuntu14.04下java安装及环境配置

这可以说是一篇迟到的文章,几个月前就说要写,结果拖到了现在。中间由于系统打不开等一系列原因,不得不重装了一遍,这次环境配置是出了点小问题,最后奉上。

2852
来自专栏魏艾斯博客www.vpsss.net

修改本地网站文件和服务器自动同步的简单办法

群友问如何能实现修改本地网站文件后,能自动同步服务器呢?除了 ftp 软件上传覆盖这种手动的办法之外,还可以使用 dreamweaver 软件的管理站点功能来实...

1.4K2
来自专栏java一日一条

Java EE7和Maven工程入门(2)

我们已经建立了父pom文件。这种特殊类型的文件用来定义我们项目即将使用的类库,它也配置了所有为了打包项目的每个模块而使用的maven工具。你可以检出第一部分代码...

872
来自专栏Python中文社区

Nginx+uwsgi部署Django应用

本文目的:在centos7.x服务器上利用nginx和uwsgi部署Django应用

2964

扫码关注云+社区

领取腾讯云代金券