保持两个离线数据集同步

保持两个离线数据集同步

假设我们有一个大型数据集的两个副本 A 和 B,它们位于互联网连接不佳的位置。根据经验,假设可以传输元数据,但不能传输实际文件数据,但完整的离线解决方案会更好。其中一个副本是主副本,另一个是需要半定期更新的备份。

两个数据集保持同步的方式是……老派。有人将需要更新的文件复制到外部驱动器,从 A 物理地到达 B,在另一个副本中更新文件。然而,跟踪哪些文件需要传输变得越来越困难,尤其是在文件损坏等错误情况下。

在外部驱动器上拥有数据集的完整副本是不切实际的,因为它至少比其容量大一个数量级。典型的文件大小为几 GB,在可预见的未来,整个数据集不应增长到低于数十 TB。典型的更新是文件添加,对现有文件的更新和删除相当罕见。

最重要的是保留的字节,我不介意不一致的时间戳或文件权限。

人们可以手动将副本 B 中的文件校验和存储在便携式驱动器上,并检查副本 A 上的不匹配情况。但是,嘿,是否有一种成熟的工具可以支持与我的用例足够接近的用例?

谢谢!

答案1

看一下 rsync(1),它是为此类工作而设计的。

您可能会使用 diff(1)/patch(1) (或差异工具)如果您知道更改是本地化的。

如果您了解数据的结构及其变化,您可能会找到一些专门的工具。但这是更多的工作,很脆弱,并且不会随着变化而增长。

如果目录中主要是文本文件,甚至将其设置为 git(1) 存储库并从那里提取可能是一个实用的解决方案(它经过优化以有效地获取和集成更改)。

答案2

你看过 git 补丁文件吗?如果位置 A 和位置 B 都是 git 存储库,您只需将生成的 git 补丁文件复制到外部驱动器,然后将其应用到备份位置。

回购协议A:

commit 090d683743b24d4fd93cdf2c1fc3fe3613443be0 (HEAD -> master)
Author: somebody <[email protected]>
Date:   Thu Jun 20 19:01:14 2019 -0400

    added my love for bananas

commit b58c37b8479ce188c896719336a456d168c56ea9
Author: somebody <[email protected]>
Date:   Thu Jun 20 18:57:57 2019 -0400

    initial commit

回购协议B:

commit b58c37b8479ce188c896719336a456d168c56ea9 (HEAD -> master, origin/master, origin/HEAD)
Author: somebody <[email protected]>
Date:   Thu Jun 20 18:57:57 2019 -0400

    initial commit

现在我们可以使用git生成补丁文件。

git diff -p commit_old commit_new > /external_drive/patch.diff

在回购协议 B 中:

要查看更改:

git apply --stat patch.diff

要应用更改:

git apply patch.diff

添加并提交更改:

git add -A
git commit -m "added my love for bananas to this directory"

查看新的提交:

git log
commit 4122e3deca160a9167fb54456bb688394aa5dcff (HEAD -> master)
Author: somebody <[email protected]>
Date:   Thu Jun 20 19:10:19 2019 -0400

    added my love for bananas to this directory

commit b58c37b8479ce188c896719336a456d168c56ea9 (origin/master, origin/HEAD)
Author: somebody <[email protected]>
Date:   Thu Jun 20 18:57:57 2019 -0400

    initial commit

相关内容