使用 rsync,可以直接在源和目标之间比较文件或数据增量(差异)。
是否有替代程序可以比较源、目标和共享本地“缓存”之间的增量?哪里source
是远的,慢的;哪里destination
是local-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
并且您想要复制new
到newstuff
:
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)