为啥 gsutil rsync 会重新下载我们所有的文件?

Posted

技术标签:

【中文标题】为啥 gsutil rsync 会重新下载我们所有的文件?【英文标题】:Why is gsutil rsync re-downloading all our files?为什么 gsutil rsync 会重新下载我们所有的文件? 【发布时间】:2016-12-25 06:59:35 【问题描述】:

近 2 年来,我们一直使用 gsutil -m rsync -r 使开发和部署盒与 GCS 存储桶保持同步,没有任何问题。桶中大约有 85k 个对象。

直到最近,这才完美运行:我们每 15 分钟左右运行一次 deploy-box -> GCS rsync,以备份所有新上传的资源,然后在需要时运行 GCS -> dev box rsync刷新本地开发数据(在 OSX El Capitan 上运行)。

不过,在过去的几个月里,GCS->dev rsync 开始膨胀,下载的图像越来越多。

一开始我只是觉得“太好了,我们正在上传更多资源”,但它的增长速度比数据快得多,直到今天它似乎正在下载整个 85k 图像。

我已经仔细检查了我在正确的位置,命令是否正确,路径是否正确,等等。对于所有这些,gsutil 输出正在滚动着大量的“正在复制... " 和 "Downloading..." 消息,充分利用我们的 100mbps 连接,当我转到另一个终端并每 10 秒在目标目录上运行 find . -type f | wc -l 时,它表明几乎没有添加 2 或 3 个新文件一分钟。我查看了 gsutil 说它现在正在下载的文件的修改时间,并且在大多数情况下它们都是旧的,一年或更长时间没有改变。含义:它正在下载所有数据,使用大量时间和带宽,所有这些都是为了几百个文件。

最近的 OSX gsutil 版本有什么变化吗?可能有错误吗?我什至如何开始追踪这个?还是举报?新闻组gsutil-discussgs-discussion 已经存档,gce-discussion 中的讨论都是关于在 GCE 实例中使用gsutil

谢谢!

【问题讨论】:

在 gsutil 4.20(2016-07-20 发布)中,用于同步的更改检测算法从仅使用文件大小更改为比较本地文件的大小和文件修改时间。开发箱上的文件修改时间与部署箱上的不同吗?如果是这样,那可以解释这个问题。 嘿,谢谢你的帮助,特拉维斯!我认为这几乎可以肯定是答案。我们在 227 天前创建了一个新的部署框实例并将所有文件同步到它上面,从find . -type f -mtime +227 看来,初始同步将所有修改时间写为它们被同步的时刻,而不是它们的原始时间戳来自 GCS。除了从开发人员中删除全部内容并重新同步它们之外,我们能做些什么吗?这是gsutil 应该做的吗? (另外,如果你想把这个放在一个答案中,那么我可以接受它并在那里询问我作为 cmets 的后续行动:-)) 问题是内容不变的文件正在同步到开发盒,是吗?当您从部署 - > GCS 进行 rsync 时,您是否以任何方式更改部署框上文件的 mtime?如果文件的 mtime 不同,我希望来自 GCS -> dev 的同步将复制一次文件,但后续同步将是增量的。但是,如果您创建了一个具有不同文件 mtime 的新部署框,然后上传了这些文件,则会显示为所有文件都已被修改,并且会导致另一个“完全同步”到开发框。 【参考方案1】:

gsutil 4.20(2016-07-20 发布)为 rsync 修改了 change detection algorithm。现在,它不再只比较本地文件与其云对应文件的大小,而是比较本地文件的大小和文件修改时间。使用 rsync 上传文件时,文件修改时间存储在文件的自定义用户元数据中。如果不存在,则使用对象创建时间。

【讨论】:

我想提出一个更正(来自文档):对于云到本地 rsync,如果文件 mtime 元数据不存在,则使用对象创建时间而不是校验和。【参考方案2】:

我遇到了类似的问题,即反复同步相同的文件。我没有那么多文件,因此您可能需要检查性能,但我决定使用-c 选项来强制使用校验和,而不是在我的构建过程中本地修改的 mtime。 我认为(并希望)文档说明这一点略有错误

比较文件的校验和,如果源和目标的大小为 以及mtime匹配

因为它似乎使用校验和,即使 mtime 不匹配

【讨论】:

我的本地文件不断更新,但没有改变。 -c 选项对我有用......恢复原始同步行为。快多了。谢谢! 谢谢,-c 帮助很大。另外一定要安装编译好的crcmod:cloud.google.com/storage/docs/gsutil/addlhelp/…

以上是关于为啥 gsutil rsync 会重新下载我们所有的文件?的主要内容,如果未能解决你的问题,请参考以下文章

gsutil rsync 与 gzip 压缩

在大文件上使用 rsync 的 gsutil int 错误

如何跳过 gsutil rsync 中的现有文件

继续中断 rsync 后 .gstmp 文件上的 gsutil rsync 错误

无论如何要在某个时间戳之后 rsync gsutil 文件?

当 Python 3.5.2 调用 gsutil rsync 时返回错误,但从命令行可以