我想创建一些目录的压缩镜像,以便可以从原始目标和远程目标再次同步。
我可以通过两步低效地完成:
rsync -a /source/ /compressed-mirror/
gzip --recursive --rsyncable --force /compressed-mirror/
# later: rsync -a /compressed-mirror/ remote:/another-compressed-mirror/
问题是,如果我重新运行第一个 rsync 来更新镜像,它需要重新复制和 gzip 所有源文件,即使只有其中几个发生了更改。
问题:是否有其他方法可以最大限度地减少每次更新所需的数据传输量和硬盘使用量?
笔记:
我并没有坚持使用 gzip 进行压缩 - 我选择它只是因为它允许重新同步压缩文件。
本地压缩镜像的目的是最大限度地减少与远程镜像进行 rsync 所需的“网络运行”时间,因为源计算机(笔记本电脑)的互联网连接和电源状态都不可靠。本地镜像的某些部分在 rsync 到远程镜像之前会被加密。然后,远程镜像会使用 rsnapshot 进行版本控制,并通过更稳定的互联网连接上传到另一台远程服务器。
更新/想法:
- 使用文件系统压缩(请参阅 cas 的评论) - 但这会强制 rsync 在将文件传输到远程服务器时重新压缩文件,这似乎是多余的。
- 保持 rsync 目录未压缩。每次 rsync 更新它时,记录更改的文件。对于每个更改的文件,在压缩镜像中单独创建一个压缩副本(或删除它)。但下一个想法可以更有效地完成同样的事情:
- 在源中保留文件路径和文件大小(或校验和)的列表。每次更新时,创建一个新列表并将其与旧列表进行比较。对于每个更改的文件,使用 . 在第一个压缩镜像中单独创建一个 gzip 压缩副本(或删除它)
gzip < source/path/file > mirror/path/file.gz
。这似乎是迄今为止最有效的解决方案。
答案1
处理您的要求的最有效方法可能不是压缩中间镜像目标。这将允许rsync
在本地和远程主机之间使用其增量算法来仅传输更改的数据。 (不过,当在同一主机上的两个目录之间进行复制时,增量算法不适用。)
# Any changed files will be copied completely, even if only one byte changed
rsync -a --delete /source/ /mirror/
# Only copy changed parts of changed files
rsync -az --delete /mirror/ remote:/mirror/
最有效的解决方案(就本地硬盘和中间网络的命中而言)是完全放弃本地镜像,而直接从源复制到远程目标:
# Only copy changed parts of changed files
rsync -az --delete /source/ remote:/mirror/