使用 hashget 将备份减少 99.5%

哈希获取 - 它是免费的、开源的 重复数据删除器 是一个类似于存档器的实用程序,可让您显着减小备份的大小,以及组织增量和差异备份方案等。

这是一篇描述功能的概述文章。 hashget的实际使用(非常简单)在中描述 读我 项目和 维基文档.

对照

根据类型法则,我将立即开始阴谋——比较结果:

数据样本
拆封尺寸
名为.tar.gz
hashget.tar.gz

WordPress-5.1.1
43 MB
11 MB (26%)
155 KB( 0.3% )

Linux内核5.0.4
934 MB
161 MB (20%)
4.7 MB( 0.5% )

Debian 9 (LAMP) LXC 虚拟机
724 MB
165 MB (23%)
4.1 MB( 0.5% )

理想且有效的备份应该是什么样的背景

每次我对新创建的虚拟机进行备份时,我都会感到自己做错了什么。为什么我会从系统中获得大量备份,而我无价的、不朽的创造力是一行index.html,其中包含文本“Hello world”?

为什么我的备份中有 16 MB 的 /usr/sbin/mysqld?难道真的有可能我在这个世界上有幸保存了这份重要的档案,而如果我失败了,它就会为人类而丢失?很可能不会。它存储在高度可靠的 debian 服务器上(其可靠性和正常运行时间无法与我提供的相比),以及其他管理员的备份(数百万个)。我们真的需要为这个重要文件创建 10+000 个副本来提高可靠性吗?

一般来说 哈希获取 并解决了这个问题。打包后,它会创建一个非常小的备份。拆包时 - 一个完全拆包的系统,类似于如果 tar -c / tar -x。 (也就是说,这是无损包装)

hashget 的工作原理

hashget 具有 Package 和 HashPackage 的概念,在它们的帮助下执行重复数据删除。

小包装 (塑料袋)。一种可以从 Internet 安全下载并从中获取一个或多个文件的文件(通常为 .deb 或 .tar.gz 存档)。

哈希包 — 表示包的小 JSON 文件,包括包 URL 和其中文件的哈希和 (sha256)。例如,对于 5 MB 的 mariadb-server-core 包,hashpackage 大小仅为 6 KB。大约少一千倍。

重复数据删除 — 创建一个没有重复文件的存档(如果重复数据删除器知道可以在哪里下载原始包,它会减少存档中的重复项)。

包装

打包时,会扫描正在打包的目录中的所有文件,计算它们的哈希总和,如果在已知的 HashPackages 之一中找到总和,则保存有关该文件的元数据(名称、哈希、访问权限等)在一个特殊文件 .hashget-restore.json 中,该文件也将包含在存档中。

在最简单的情况下,包装本身看起来并不比 tar 复杂:

hashget -zf /tmp/mybackup.tar.gz --pack /path/to/data

开箱

拆包分两个阶段完成。首先是通常的 tar 解包:

tar -xf mybackup.tar.gz -C /path/to/data

然后从网络恢复:

hashget -u /path/to/data

恢复时,hashget 读取 .hashget-restore.json 文件,下载必要的包,解压它们,并提取必要的文件,将它们安装在所需的路径中,并具有所需的所有者/组/权限。

比较困难的事情

对于那些“想要像 tar 一样,但要将我的 Debian 打包成 4 MB”的人来说,上面描述的已经足够了。稍后我们再看看更复杂的事情。

索引

如果 hashget 根本没有单个 HashPackage,那么它根本无法删除任何内容。

您还可以手动创建 HashPackage(简单地说: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my),但是还有一种更方便的方法。

为了获得必要的hash包,有一个阶段 索引 (它是通过命令自动执行的 --pack)和 启发式。建立索引时,hashget 将找到的每个文件“馈送到”对其感兴趣的所有可用启发式方法。 Heuristics 然后可以索引任何 Package 以创建 HashPackage。

例如,Debian 启发式喜欢文件 /var/lib/dpkg/status 并检测已安装的 debian 软件包,如果它们没有索引(没有为它们创建 HashPackage),则下载它们并索引它们。结果是一个非常好的效果 - hashget 将始终有效地删除 Debian 操作系统的重复数据,即使它们具有最新的软件包。

提示文件

如果您的网络使用一些专有包或未包含在 hashget 启发式中的公共包,您可以向其中添加一个简单的 hashget-hint.json 提示文件,如下所示:

{
    "project": "wordpress.org",
    "url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip"
}

接下来,每次创建存档时,都会对该包建立索引(如果之前没有索引),并且将从存档中删除包文件的重复数据。无需编程,一切都可以通过 vim 完成并保存在每个备份中。请注意,由于采用哈希和方法,如果包中的某些文件在本地发生更改(例如,配置文件发生更改),则更改的文件将“按原样”保存在存档中,并且不会被截断。

如果你自己的一些包定期更新,但变化不是很大,你可以只提示主要版本。例如,在1.0版本中,他们做了一个指向mypackage-1.0.tar.gz的提示,它将被完全去重,然后他们发布了1.1版本,略有不同,但提示没有更新。没关系。仅匹配(可恢复至)版本 1.0 的文件会进行重复数据删除。

处理提示文件的启发式方法是理解启发式工作原理的内部机制的一个很好的例子。它仅处理 hashget-hint.json 文件(或带点的 .hashget-hint.json)并忽略所有其他文件。从这个文件中,它确定应该对哪个包 URL 建立索引,并且 hashget 对其进行索引(如果尚未这样做)

哈希服务器

创建备份时执行完整索引将是相当耗费人力的。为此,您需要下载每个包,解压它并为其建立索引。因此 hashget 使用一种方案 哈希服务器。当检测到已安装的 Debian 软件包时,如果在本地 HashPackage 中找不到该软件包,则首先尝试从哈希服务器下载 HashPackage。只有当这不起作用时,hashget 本身才会下载并哈希该包(并将其上传到 hashserver,以便 hashserver 将来提供它)。

HashServer 是该方案的一个可选元素,并不重要,它仅用于加速和减少存储库的负载。轻松禁用(可选 --hashserver 不带参数)。此外,您还可以轻松地 制作你自己的哈希服务器.

增量和差异备份、计划报废

哈希获取 使制作图表变得非常容易 增量备份和差异备份。为什么我们不为备份本身(以及所有独特的文件)建立索引?一个团体 --submit 你就完成了! hashget 创建的下一个备份将不包含此存档中的文件。

但这不是一种很好的方法,因为在恢复时我们可能必须提取整个历史记录中的所有 hashget 备份(如果每个备份至少包含一个唯一文件)。有一个机制可以做到这一点 有计划地废弃备份。建立索引时,可以指定HashPackage的过期日期 --expires 2019-06-01,并且在此日期之后(从 00:00 开始),将不再使用。在此日期之后,无法删除存档本身(尽管 hashget 可以方便地显示当前或任何日期的所有备份的 URL)。

例如,如果我们在 1 日进行完整备份,并用生命周期对其进行索引,直到月底,我们将得到差异备份方案。

如果我们用同样的方式索引新的备份,就会有增量备份的方案。

与传统方案不同,hashget 允许您使用多个底层源。备份将通过减少以前备份的文件(如果有)和公共文件(可以下载的文件)来减少。

如果由于某种原因我们不信任 Debian 资源的可靠性(https://snapshot.debian.org/)或者使用其他发行版,我们可以简单地对所有包进行一次完整备份,然后依赖它(通过禁用启发式)。现在,如果我们发行版的所有服务器都无法使用(在纪念互联网上或在僵尸大灾难期间),但我们的备份正常,我们可以从任何仅依赖于我们早期备份的简短差异备份中恢复。

Hashget 仅依赖于您自行决定的可信恢复源。您认为可靠的将被使用。

文件池和冰川

Механизм 文件池 允许您不必不断地联系外部服务器来下载软件包,而是使用本地目录或公司服务器中的软件包,例如:

$ hashget -u . --pool /tmp/pool

или

$ hashget -u . --pool http://myhashdb.example.com/

要在本地目录中创建池,您只需创建一个目录并将文件放入其中,hashget 本身将使用哈希值找到它需要的内容。为了使池可以通过 HTTP 访问,您需要以一种特殊的方式创建符号链接;这是通过一个命令完成的(hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool)。 HTTP FilePool本身是静态文件,因此任何简单的Web服务器都可以为其提供服务,服务器的负载几乎为零。

感谢 FilePool,您不仅可以使用 http(s) 资源作为基础资源,还可以 例如:,亚马逊冰川。

将备份上传到冰川后,我们获取其上传 ID 并将其用作 URL。例如:

hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01

现在,新的(差异)备份将基于此备份,并且会更短。 tar解压diffbackup后,我们可以看到它依赖了哪些资源:

hashget --info /tmp/unpacked/ list

只需使用 shell 脚本将所有这些文件从 Glacier 下载到池中并运行常规恢复: hashget -u /tmp/unpacked —pool /tmp/pool

这款游戏值得吗?

在最简单的情况下,您只需支付更少的备份费用(如果您将它们存储在云中的某个位置以获取金钱)。也许很多很多。

但这并不是唯一的事情。数量变成质量。您可以使用它来获得备份方案的高质量升级。例如,由于我们的备份现在更短,我们可以不再每月进行备份,而是每天进行备份。储存期限不再像以前那样储存六个月,而是储存五年。以前,您将其存储在缓慢但廉价的“冷”存储(Glacier)中,现在您可以将其存储在热存储中,从那里您可以随时快速下载备份并在几分钟内恢复,而不是一天之内。

您可以提高备份存储的可靠性。如果我们目前将它们存储在一个存储设施中,那么通过减少备份量,我们将能够将它们存储在 2-3 个存储设施中,并且即使其中一个存储设施损坏也可以轻松生存。

如何尝试并开始使用?

进入gitlab页面 https://gitlab.com/yaroslaff/hashget,使用一个命令安装(pip3 install hashget[plugins])然后只需阅读并执行快速启动即可。我认为做完所有简单的事情需要10-15分钟。然后你可以尝试压缩你的虚拟机,如果有必要的话制作提示文件以使压缩更强,如果你感兴趣的话可以使用池、本地哈希数据库和哈希服务器,第二天看看增量备份的大小是多少将在昨天的之上。

来源: habr.com

添加评论