与 rsync 类似的程序,但使用共享缓存目录或源?

与 rsync 类似的程序,但使用共享缓存目录或源?

使用 rsync,可以直接在源和目标之间比较文件或数据增量(差异)。

是否有替代程序可以比较源、目标和共享本地“缓存”之间的增量?哪里source 是远的,慢的;哪里destinationlocal-shared-cache本地的,快的。

例如,如果我们有这样的状态:

source:
largeFile.txt
largeFile2.txt
largeFile3.txt

destination:
largeFile.txt

local-shared-cache:
largeFile3.txt

忽略路径并只关注文件,在source和之间进行“同步”时destination,增量是 2 个文件:largeFile2.txt largeFile3.txt

然而,largeFile3.txt实际上已经存在于,local-shared-cache因此“增量”从source变为仅largeFile2.txt。使用此缓存的实现仅需要从可能较慢的source.


我认为一种方法可能是使用 torrent 协议(每个文件都成为 torrent),如果它已经“存在”在本地商店中,那么就不必下载它。但我必须实现并测试这个解决方案(我希望也许已经存在这样的软件)。

另一种选择也可能是 ZFS 快照同步。


我实际上想要实现什么目标?

基本上,我们有很多包含大量大数据的软件项目,开发人员通常需要克隆一个项目及其所有数据以进行本地开发。假设一个项目有 10GB,下载需要 20 分钟。现在,如果开发人员需要克隆一个类似的项目,他们必须再次花费 10GB/20 分钟的成本,即使两个项目之间的增量/差异可能只是其中的一小部分。

我不能只进行初始 rsync,然后 rsync 在此之上的任何差异吗?

当然,您可以首先 rsync/clone 项目 1,然后基于此 rsync/clone 项目 2,但是如果您需要找出哪个是“基础”克隆,这会很快变得混乱。它也不会考虑是否存在分布在多个项目(而不是两个项目)中的共同资产。例如,如果我有 10 个项目,其中每个项目都可能包含一些常见文件,该怎么办?我是否按顺序一一排列所有 10 个元素,“构建”所有共同元素?看起来确实很复杂。

继续我之前的例子......假设我有第二个项目largeFile.txt largeFile3.txt largeFile4.txt. largeFile5.txt

我基本上已经拥有了除largeFile4.txt. largeFile5.txt.

因此,使用这种方法,我可以执行初始 rsync,获取 largeFile2.txt、largeFile3.txt,然后在第二个项目上执行另一个 rsync,获取 largeFile4.txt 和 largeFile5.txt。但随后我需要弄清楚如何使用 rsync 顺序“构建”所有必需的文件,然后删除所有不需要的文件。听起来像很多处理和磁盘处理。

答案1

使用 rsync,可以直接在源和目标之间比较文件或数据增量(差异)。

不必要。仅当rsync通过网络连接使用时才使用增量。如果您rsync在两个看似属于本地文件系统一部分的目录/文件之间使用,那么它将不会使用增量,而只会完整复制过时的文件。

# Will use deltas
rsync -a /path/to/source/  remoteHost:/path/to/destination

# Will copy changed files in their entirety
rsync -a /path/to/source/  /network/path/for/remoteHost/destination

因此,假设正在使用增量,通常不需要使用缓存,因为仅传输文件的更改部分。

但是,如果您是第一次传输文件,并且您知道其中很大一部分与另一个文件相似,则可以使用--fuzzy--link-dest/--copy-dest来提供rsync帮助

考虑一个new基于old.还允许它old位于名为的目标目录中oldstuff并且您想要复制newnewstuff

rsync -av --copy-dest /full/path/to/oldstuff/ --fuzzy --fuzzy /path/to/file/new remoteHost:/path/to/newstuff/

请记住,如果--copy-dest路径是相对路径,则它是相对于 上的目标目录的remoteHost。一般来说,最好将路径设为--copy-dest绝对路径,即以 开头/,或者"$PWD"相对于远程系统上的登录目录。

在命令中添加两个-v标志rsync会给出此调试输出,确认它将用作old复制的基础new

rsync --dry-run -aivvv --copy-dest "$PWD"/t/dst/oldstuff/ --fuzzy --fuzzy t/src/new remoteHost:t/dst/newstuff/

opening connection using: ssh remotehost rsync --server -vvvnlyyogDtpre.iLsfxC "--log-format=%i" --copy-dest /home/roaima/t/dst/oldstuff/ . t/dst/newstuff/  (10 args)
sending incremental file list
[sender] make_file(new,*,0)
send_file_list done
send_files starting
server_recv(2) starting pid=11407
recv_file_name(new)
received 1 names
recv_file_list done
get_local_name count=1 t/dst/newstuff/
generator starting pid=11407
delta-transmission enabled
recv_generator(new,1)
[generator] make_file(/home/roaima/t/dst/oldstuff/old,*,1)
fuzzy basis selected for new: /home/roaima/t/dst/oldstuff/old
send_files(1, t/src/new)
<f+++++++++ new
generate_files phase=1
send_files phase=1
recv_files(1) starting
recv_files(new)
recv_files phase=1
generate_files phase=2
send_files phase=2
send files finished
total: matches=0  hash_hits=0  false_alarms=0 data=0
recv_files phase=2
recv_files finished
generate_files phase=3
generate_files finished

sent 65 bytes  received 515 bytes  386.67 bytes/sec
total size is 2,147,483,648  speedup is 3,702,558.01 (DRY RUN)
[sender] _exit_cleanup(code=0, file=main.c, line=1207): about to call exit(0) (DRY RUN)

相关内容