rsync如何为并发文件访问行为?

时间:2009-03-18 09:24:42

标签: concurrency locking rsync

我正在使用rsync每天两次运行我的计算机的备份,在搜索我的文件进行修改时使用十到十五分钟,大大减慢了所有内容,开始让我紧张。

现在我想使用我内核的inotify接口(我正在运行Linux)来编写一个小型后台应用程序来收集有关已修改文件的通知,并将其路径名添加到列表中,然后通过调用定期处理到rsync。

现在,因为根据定义这个过程总是适用于我刚刚 - 可能仍然 - 正在工作的文件,我想知道我是否会在备份中获得大量损坏/部分更新的文件作为rsync副本我正在写信给他们的文件。

我无法在联机帮助页中找到任何内容,但在谷歌上搜索答案却没有成功。我可以去阅读源代码,但这可能需要一段时间。有人知道如何在rsync中处理并发文件访问吗?

2 个答案:

答案 0 :(得分:2)

不以任何方式处理。如果这是一个问题,你可以使用例如LVM快照,并从快照中获取备份。这本身并不能保证文件处于可用状态,但它确实保证,顾名思义,它是特定时间的快照。

请注意,这与您是否允许rsync自行处理更改检测或使用您自己的应用程序无关。您的应用程序或rsync本身只生成已更改的文件列表,然后对每个文件运行rsync二进制diff算法。问题是如果在rsync算法运行时更改文件,而不是在生成文件列表时。

答案 1 :(得分:2)

根本没有处理:rsync打开文件,尽可能多地读取并复制它。

所以这取决于你的应用程序如何处理这个问题:他们是否重写了文件(没有创建新的文件),或者他们创建了一个临时文件,并在所有数据都被写入时重命名(正如他们应该的那样)。

在第一种情况下,你几乎无能为力:如果两个进程在没有任何同步的情况下访问相同的数据,结果将是一团糟。您可以做的是将rsync推迟N分钟,假设写入过程最终将在此之前完成。如果文件在此时间限制内再次更改,请重新安排该文件。

在第二种情况下,您必须告诉rsync忽略临时文件(* .tmp,*〜等)。