(几乎)原子方式合并 2 个文件夹

(几乎)原子方式合并 2 个文件夹

我正在探索为文件部署操作添加一致性的不同方法。目前的情况是:

current包含大约 100K 个不同文件的版本文件夹

  • /当前的
    • /路径1
      • 文件1
      • 文件2
      • ...
    • /path2 - 文件X
    • ...

update包含大约 100 个文件的文件夹

  • /更新
    • /路径1
      • 文件1
    • /path2 - 文件X
    • ...

最终目标是将所有文件从 发送update到文件夹current,我坚持“全部”。如果操作期间出现错误,则不应复制任何文件,或者应部署所有文件以便将操作标记为成功。

用理想的话来说,我正在寻找的场景是一个“原子”rsync,它将根据操作期间发生的情况返回失败错误代码或成功错误代码,并确保原始目录current将被看到系统立即(rsync操作后)作为较新版本(= 由于潜在的断电或其他原因,复制期间没有中间状态..)。

根据我的理解,原子操作在大多数 UNIX 系统上都不可用,因此我可以认为显然无法达到理想情况。我正在尝试尽可能地近似这种行为。

我为此探索了不同的解决方案:

  • cp -alcurrent目录镜像到一个tmp目录,然后复制该目录中的所有文件update,然后删除current并重命名tmpcurrent

  • rsync(到目前为止最相关)使用该--link-dest选项来创建一个带有current目录文件硬链接的中间文件夹。与之前的情况基本相同,但可能更干净,因为它不需要任何cp.

  • atomic-rsync我遇到了现有的 perl 脚本Perl 原子 rsync据推测,它会执行此类操作,但结果只会考虑目录中存在的文件update并删除“增量文件”current文件夹。

两种解决方案似乎都有效,但我对在实际生产用例中使用它们中的任何一个都没有信心,问题是创建 100K 硬链接可能会非常慢或者在某种程度上成本高昂/无用。

我还知道,一个非常一致的解决方案是使用快照,并且有很多选项,但由于磁盘大小(〜70GB,文件夹current已经占用〜60GB),在我的情况下这是不可接受的。

据我所知,我已经没有选择了,是否有任何(更好)的方法来实现预期目标?

答案1

考虑使用 BTRFS 和快照。

相关内容