注意:我在这里宽松地使用 tar 一词。我的意思是压缩是否为tar.gz,tar.bz2,zip等。
rsync
是否有标记来在源/目标之间协商已更改的文件,将已更改的源文件焦油,将单个tar文件发送到目标计算机并在更改后的文件解压缩?
我有数百万个文件,并且通过互联网远程rsync
到AWS似乎很慢。
我知道rsync
有一个压缩选项(z
),但据我了解,它可以按文件压缩更改的文件。如果有很多小文件,则发送1KB而不是50KB文件的开销仍然是瓶颈。
此外,仅对整个目录进行压缩也不有效,因为存档需要一个小时的时间
答案 0 :(得分:1)
您可以使用gzip或pigz的rsyncable选项将tar文件压缩为.gz格式。 (您可能必须找到gzip的补丁才能添加它。它已经是pigz的一部分。)
该选项对生成的gzip文件进行分区,该方式允许rsync仅在.tar.gz文件中的某些文件已更改时才找到修改过的部分,以实现更有效的传输。
答案 1 :(得分:1)
我正在寻找与你完全相同的东西,我最终使用了 borg。
tar cf - -C $DIR . | borg create $REPO::$NAME
tar 仍会读取整个文件夹,因此与仅 rsync 两个目录相比,您不会避免读取损失(因为我相信 rsync 使用技巧来避免读取每个文件以进行更改),但是您将避免写入损失,因为 borg 只会写入它以前没有遇到过的块。此外,borg 会自动压缩,因此不需要 xz/gzip。此外,如果在两端都安装了 borg,它也不会发送多余的数据,因为两个 borg 可以让对方知道他们有什么,没有什么。
如果避免读取惩罚对您来说至关重要,那么您可以使用 rsync 来使用它的技巧来告诉您哪些文件发生了更改,创建了一个 difftar 并将其发送到 borg,但是让 borg 合并档案是第二个麻烦事.您可能最终会创建一个过滤器来删除从原始存档中删除的路径,然后创建一个仅包含文件添加/更改的新存档。然后您必须递归地为每个存档执行此操作。最后它会通过按顺序提取每个版本来创建原始档案,但就像我说的那样令人头疼。