比 rsync 更智能的文件传输?

比 rsync 更智能的文件传输?

我有一个大文件(2-3 GB,二进制,未记录格式),在两台不同的计算机上使用(通常我在台式机系统上使用它,但当我旅行时,我将它放在笔记本电脑上)。我使用 rsync 来回传输该文件。

我时常对此文件进行小幅更新,更改量不到 100 kB。这在两个系统上都会发生。

据我了解,rsync 的问题是,如果它认为文件在源和目标之间发生了更改,它会传输完整的文件。在我的情况下,当文件的一小部分发生变化时,感觉就像是浪费时间。我设想了一种协议,其中源和目标上的传输代理首先对整个文件进行校验和,然后比较结果。当他们意识到整个文件的校验和不同时,他们将文件分成两部分,A 和 B,并分别对它们进行校验和。

啊哈,B 在两台机器上是相同的,让我们忽略那一半。现在它将 A 分成 A1 和 A2。好吧,只有 A2 改变了。将 A2 拆分为 A2I 和 A2II 并进行比较等。递归地执行此操作,直到找到例如源和目标之间各不相同的三个部分(每个部分为 1 MB),然后仅传输这些部分并将它们插入到目标文件的正确位置。如今,有了快速 SSD 和多核 CPU,这种并行化应该非常高效。

所以我的问题是,今天是否有任何工具可以像这样工作(或以我无法想象的另一种方式但具有类似的结果)可用?

已发布澄清请求。我主要使用 Mac,所以文件系统是 HFS+。通常我像这样启动 rsync

rsync -av --delete --progress --stats- 在这种情况下,我有时使用 SSH,有时使用 rsyncd。当我使用 rsyncd 时,我像这样启动它rsync --daemon --verbose --no-detach

第二个澄清:我要求一个工具,只传输存在于两个位置的文件的增量,并进行小的更改和/或 rsync 是否确实提供了此功能。我对 rsync 的经验是,它会完整传输文件(但现在有一个答案可以解释这一点:rsync 需要一个 rsync 服务器才能仅传输增量,否则(例如,使用 ssh-shell)它会传输整个文件文件,但发生了很大变化)。

答案1

Rsync 不会使用增量,但如果它(作为单个进程)负责源文件和目标文件,则会传输整个文件。当源计算机和目标计算机上运行单独的客户端和服务器进程时,它可以传输增量。

rsync 当它是唯一进程时不会发送增量的原因是,为了确定是否需要发送增量,它需要读取源文件和目标文件。完成后,它可能只是直接复制了文件。

如果您使用这种形式的命令,则只有一个 rsync 进程:

rsync /path/to/local/file /network/path/to/remote/file

如果您使用这种形式的命令,则您有两个 rsync 进程(一个在本地主机上,一个在远程主机上)并且可以使用增量:

rsync /path/to/local/file remote_host:/path/to/remote/file

答案2

从描述部分man rsync

Rsync 是一种快速且用途广泛的文件复制工具。它可以通过任何远程 shell 在本地复制到/从另一台主机复制,或者复制到/从远程 rsync 守护进程复制。它提供了大量的选项来控制其行为的各个方面,并允许非常灵活地指定要复制的文件集。 它以其增量传输算法而闻名,该算法通过仅发送源文件与目标中现有文件之间的差异来减少通过网络发送的数据量。

所以这就是“不”。

答案3

您可以使用 RAID-1(镜像)来对此进行优化。双方都进行了更改,这变得很奇怪,但这rsync也使得使用变得奇怪。您应该解释如何处理此问题。

  1. 您可以创建一个dd if=/dev/zero of=/path/to/syncfile.img bs=1M count=3500比您的同步文件在不久的将来将增长到的文件稍大的文件 ( )。
  2. 然后在该文件的顶部放置一个循环设备 ( losetup /dev/loop5 /path/to/syncfile.img)。
  3. 您在两个系统上都执行此操作。
  4. 在应将更改同步到另一个系统的系统上,您可以通过网络块设备 ( nbd) 使另一个系统的块设备可用。
  5. 在两个块设备上创建 RAID-1 阵列:mdadm create /dev/md5 --raid-devices=2 --level=raid1 --bitmap=/path/to/ext3volume/sync-bitmap --assume-clean /dev/loop5 --write-mostly /dev/path/to/nbd.--bitmap=/path/to/ext3volume/sync-bitmap稍后组装阵列时必须提供。
  6. 在 RAID 上创建一个文件系统mke2fs -j /dev/md5并将其挂载到某个位置。
  7. 将文件复制到卷。这应该在良好的网络连接下完成。也许有一种更聪明的方法可以将文件内容直接写入块设备,这可以在本地完成,但由于文件内容与文件系统元数据混合,我不知道该怎么做。

现在您可以断开网络块设备。这会导致双方的 RAID-1 性能下降。如果要同步,您必须: 1. 在同步的系统上卸载并置顶 RAID 2. 再次设置 nbd 3. 将 nbd 热添加到同步源系统上的 RAID。

然后两个块设备将被同步。但由于位图,源系统无需在另一端读取哪些数据就知道必须传输哪些数据。

问题

操。现在我已经写下了所有内容,我意识到这对于双方(不同领域)的更改都不起作用(很好)。如果您使用--build而不是--create(这允许您假装在两台主机上本地块设备是主设备),它可能会起作用。

根据您希望如何处理两个方向上的更改,您可以尝试备份位图文件(当两个 RAID 都停止时!)并仅在两个方向上运行同步。或者(如果您只想向一个方向写入更改),更糟糕的是,您运行同步,停止 RAID,用远程位图替换本地位图,然后再次同步(然后同步位图文件)。这肯定会很有趣。

LVM 快照

LVM 快照也可以完成类似的操作。

相关内容