我正在探索为文件部署操作添加一致性的不同方法。目前的情况是:
current
包含大约 100K 个不同文件的版本文件夹
- /当前的
- /路径1
- 文件1
- 文件2
- ...
- /path2 - 文件X
- ...
- /路径1
update
包含大约 100 个文件的文件夹
- /更新
- /路径1
- 文件1
- /path2 - 文件X
- ...
- /路径1
最终目标是将所有文件从 发送update
到文件夹current
,我坚持“全部”。如果操作期间出现错误,则不应复制任何文件,或者应部署所有文件以便将操作标记为成功。
用理想的话来说,我正在寻找的场景是一个“原子”rsync,它将根据操作期间发生的情况返回失败错误代码或成功错误代码,并确保原始目录current
将被看到系统立即(rsync
操作后)作为较新版本(= 由于潜在的断电或其他原因,复制期间没有中间状态..)。
根据我的理解,原子操作在大多数 UNIX 系统上都不可用,因此我可以认为显然无法达到理想情况。我正在尝试尽可能地近似这种行为。
我为此探索了不同的解决方案:
cp -al
将current
目录镜像到一个tmp
目录,然后复制该目录中的所有文件update
,然后删除current
并重命名tmp
为current
rsync
(到目前为止最相关)使用该--link-dest
选项来创建一个带有current
目录文件硬链接的中间文件夹。与之前的情况基本相同,但可能更干净,因为它不需要任何cp
.atomic-rsync
我遇到了现有的 perl 脚本Perl 原子 rsync据推测,它会执行此类操作,但结果只会考虑目录中存在的文件update
并删除“增量文件”current
文件夹。
两种解决方案似乎都有效,但我对在实际生产用例中使用它们中的任何一个都没有信心,问题是创建 100K 硬链接可能会非常慢或者在某种程度上成本高昂/无用。
我还知道,一个非常一致的解决方案是使用快照,并且有很多选项,但由于磁盘大小(〜70GB,文件夹current
已经占用〜60GB),在我的情况下这是不可接受的。
据我所知,我已经没有选择了,是否有任何(更好)的方法来实现预期目标?
答案1
考虑使用 BTRFS 和快照。