同步两个基本相同的大文件

同步两个基本相同的大文件

我有两个 300 GB 的文件位于不同的卷上:

  • 加密本地备份
  • 即在 NAS 上加密的“远程”备份)。

根据设计,这两个文件的大小相同,并且大多(>90%) 内容相同...

是否有一种有效的工具来“rsync”这些文件,并且只复制不同的部分,以便目标文件与源文件相同?

也许是某些东西构建了块的校验和来解决这个问题,我不知道......(任何比cp -f......更有效的东西,据我所知 rsync 也会抓取整个源文件来覆盖)

答案1

rsync可以用来做到这一点。

--no-whole-file--no-W参数使用块级同步而不是文件级同步。


测试用例

/dev/random使用来自以下网站的大量文本文件生成随机文本文件。这 4 个文件在所有内容上都不同。tf_2.dat是我们的目标文件。

~/logs/rs$ ls -tlh    
-rw-rw-r-- 1 vayu vayu 2.1G  二  25 23:11 tf_2.dat
-rw-rw-r-- 1 vayu vayu 978M  二  25 23:11 a.txt
-rw-rw-r-- 1 vayu vayu 556K  二  25 23:10 file2.txt
-rw-rw-r-- 1 vayu vayu 561K  二  25 23:09 nt.txt

rsync然后使用(目标是空)将它们复制到不同的硬盘。

rsync -r --stats rs/ /mnt/raid0/scratch/t2

收到以下统计数据。

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 3,260,939,140 bytes
Total transferred file size: 3,260,939,140 bytes
Literal data: 3,260,939,140 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 3,261,735,553
Total bytes received: 92

sent 3,261,735,553 bytes  received 92 bytes  501,805,483.85 bytes/sec
total size is 3,260,939,140  speedup is 1.00

现在我合并这些文件以生成一个包含大约 60% 旧数据的新文件。

cat file2.txt a.txt >> tf_2.dat

现在,我同步这两个文件夹,这次使用--no-W选项。

rsync -r --no-W --stats rs/ /mnt/raid0/scratch/t2

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 4,289,593,685 bytes
Total transferred file size: 4,289,593,685 bytes
Literal data: 1,025,553,047 bytes
Matched data: 3,264,040,638 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 1,026,127,265
Total bytes received: 611,604

sent 1,026,127,265 bytes  received 611,604 bytes  21,169,873.59 bytes/sec
total size is 4,289,593,685  speedup is 4.18

您可以看到大量数据被匹配并且加速。

接下来,我再试一次,这次我将几个 shell 文件合并到目标 ( tf_2.dat),使得变化量约为 2%,

cat *.sh >> rs/tf_2.dat

并且再次使用同步rsync

rsync -r --no-whole-file --stats rs/ /mnt/raid0/scratch/t2


Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 4,289,727,173 bytes
Total transferred file size: 4,289,727,173 bytes
Literal data: 178,839 bytes
Matched data: 4,289,548,334 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 541,845
Total bytes received: 690,392

sent 541,845 bytes  received 690,392 bytes  43,236.39 bytes/sec
total size is 4,289,727,173  speedup is 3,481.25

我们看到了大规模的匹配和加速,从而实现了快速同步。

答案2

您也可以尝试使用https://bitbucket.org/ppershing/blocksync(免责声明:我是此特定分支的作者)。与 rsync 相比,它的优势在于它只读取文件一次(据我所知,如果不在开始增量传输之前计算校验和,rsync 就无法假设两个文件不同。不用说,两次读取 160GB 硬盘并不是一个好策略)。需要注意的是——当前版本的 blocksync 在短 RTT 连接(例如,本地主机、LAN 和本地 WiFi)上运行良好,但对于长距离同步不是特别有用。

相关内容