如何在机器之间同步巨大的稀疏文件(VM 磁盘映像)?

fad*_*bee 26 linux rsync kvm-virtualization

是否有一个命令,例如 rsync,可以将巨大的、稀疏的文件从一个 linux 服务器同步到另一个?

目标文件保持稀疏非常重要。它可能比包含它的驱动器更长(但不会更大)。只应通过线路发送更改的块。

我试过 rsync,但没有任何乐趣。https://groups.google.com/forum/#!topic/mailing.unix.rsync/lPOScZgFE9M

如果我编写一个程序来做到这一点,我只是在重新发明轮子吗? http://www.finalcog.com/synchronise-block-devices

谢谢,

克里斯。

小智 23

rsync --ignore-existing --sparse ...
Run Code Online (Sandbox Code Playgroud)

在稀疏模式下创建新文件

其次是

rsync --inplace ...
Run Code Online (Sandbox Code Playgroud)

就地更新所有现有文件(包括之前创建的稀疏文件)。

  • 反转它以获得`rsync --existing --inplace`然后`rsync --ignore-existing --sparse`以获得同步加速 (4认同)
  • 谁能解释迈克的评论以及这应该如何加快同步? (3认同)

rec*_*bot 5

Rsync 只将更改传输到每个文件,并且 --inplace 应该只重写更改的块而不重新创建文件。从他们的功能页面

rsync 是 Unix 系统的文件传输程序。rsync 使用“rsync 算法”,它提供了一种非常快速的方法来使远程文件同步。它通过仅通过链接发送文件中的差异来实现这一点,而无需事先将两组文件都存在于链接的一端。

使用 --inplace 应该对你有用。这将显示进度,压缩传输(在默认压缩级别),递归传输本地存储目录的内容(第一个尾部斜杠很重要),对文件进行适当的更改并使用 ssh 进行传输。

rsync -v -z -r --inplace --progress -e ssh /path/to/local/storage/ \
user@remote.machine:/path/to/remote/storage/ 
Run Code Online (Sandbox Code Playgroud)

我也经常使用 -a 标志,它可以做更多的事情。它等效于 -rlptgoD 我将留下确切的行为供您在手册页中查找。


nde*_*mou 5

要同步具有低到中等差异的大文件或块设备,您可以执行普通副本或使用bdsync,rsync 绝对不适合这种特殊情况*。

bdsync为我工作,似乎足够成熟,它的错误历史令人鼓舞(小问题,迅速解决)。在我的测试中,它的速度接近您可以获得的理论最大值**(也就是说,您可以同步读取文件所需的时间)。最后,它是开源的,无需任何费用。

bdsync从两个主机读取文件并交换校验和以比较它们并检测差异。所有这些同时进行。它最终在源主机上创建一个压缩补丁文件。然后将该文件移动到目标主机并再次运行 bdsync 以修补目标文件。

当在相当快的链接(例如 100Mbit 以太网)上使用它时以及对于差异很小的文件(最常见的是在 VM 磁盘上的情况)时,它会减少同步到您需要读取文件的时间。通过慢速链接,您需要更多时间,因为您必须将压缩的更改从一台主机复制到另一台主机(似乎您可以使用一个不错的技巧来节省时间,但尚未测试)。对于有许多更改的文件,还应该考虑将补丁文件写入磁盘的时间(并且您需要在两个主机中都有足够的可用空间来容纳它)。

这是我通常使用 bdsync 的方式。运行这些命令$LOCAL_HOST以“复制”$LOCAL_FILE$REMOTE_FILEon $REMOTE_HOST。我使用pigz(更快gzip)来压缩更改,ssh在远程主机上运行 bdsync 和rsync/ssh来复制更改。请注意,我正在检查补丁是否已成功应用,但我只打印“更新成功”。如果失败,您可能希望做一些更高级的事情。

REMOTE_HOST=1.2.3.4
LOCAL_FILE=/path/to/source/file
REMOTE_FILE=/path/to/destination/file
PATCH=a_file_name
LOC_TMPDIR=/tmp/
REM_TMPDIR=/tmp/
# if you do use /tmp/ make sure it fits large patch files

# find changes and create a compressed patch file
bdsync "ssh $REMOTE_HOST bdsync --server" "$LOCAL_FILE" "$REMOTE_FILE" --diffsize=resize | pigz > "$LOC_TMPDIR/$PATCH"

# move patch file to remote host
rsync "$LOC_TMPDIR/$PATCH" $REMOTE_HOST:$REM_TMPDIR/$PATCH

# apply patch to remote file
(
    ssh -T $REMOTE_HOST  <<ENDSSH
    pigz -d < $REM_TMPDIR/$PATCH | bdsync --patch="$REMOTE_FILE" --diffsize=resize && echo "ALL-DONE"
    rm $REM_TMPDIR/$PATCH
ENDSSH
) | grep -q "ALL-DONE" && echo "Update succesful"  && rm "$LOC_TMPDIR/$PATCH"

# (optional) update remote file timestamp to match local file
MTIME=`stat "$LOCAL_$FILE" -c %Y`
ssh $REMOTE_HOST touch -c -d @"$MTIME_0" "$REMOTE_FILE" </dev/null
Run Code Online (Sandbox Code Playgroud)

*:rsync 在处理大文件时效率极低。即使使用--inplace,它也会首先读取目标主机上的整个文件,之后开始读取源主机上的文件并最终传输差异(只需在运行 rsync 和观察时运行 dstat 或类似程序)。结果是,即使对于差异很小的文件,读取文件以同步它所需的时间也会增加一倍。

**:假设您没有其他方法可以判断文件的哪些部分发生了更改。LVM 快照使用位图来记录更改的块,因此它们可以非常快(lvmsync的自述文件有更多信息)。


fad*_*bee 4

我最终编写了软件来做到这一点:

http://www.virtsync.com

这是商业软件,每台物理服务器的成本为 49 美元。

现在,我可以在 3 分钟内通过住宅宽带复制 50GB 稀疏文件(其中包含 3GB 内容)。

chris@server:~$ time virtsync -v /var/lib/libvirt/images/vsws.img backup.barricane.com:/home/chris/
syncing /var/lib/libvirt/images/vsws.img to backup.barricane.com:/home/chris/vsws.img (dot = 1 GiB)
[........>.........................................]
done - 53687091200 bytes compared, 4096 bytes transferred.

real    2m47.201s
user    0m48.821s
sys     0m43.915s 
Run Code Online (Sandbox Code Playgroud)

  • 您应该透露这是一个商业软件,其网络功能的成本为 98 美元或更多。 (7认同)
  • TBH,您可以同步的声明时间非常没有意义,因为它显然取决于更改的数据量。更准确的说法是,您的软件需要 3 分钟才能找出哪些块已更改,甚至这个速度也可能取决于您的磁盘 I/O 以及可用的 CPU 周期。 (4认同)