是否有一个命令,例如 rsync,可以将巨大的、稀疏的文件从一台 linux 服务器同步到另一台?
目标文件保持稀疏非常重要。它可能比包含它的驱动器更长(但不会更大)。只有更改的块才能通过网络发送。
我已经尝试过 rsync,但没有得到任何乐趣。https://groups.google.com/forum/#!topic/mailing.unix.rsync/lPOScZgFE9M
如果我编写一个程序来做到这一点,我只是在重新发明轮子吗? http://www.finalcog.com/synchronise-block-devices
谢谢,
克里斯。
以稀疏模式创建新文件
其次是
就地更新所有现有文件(包括先前创建的稀疏文件)。
Rsync 仅将更改传输到每个文件,并且 --inplace 应该只重写更改的块而不重新创建文件。从他们的功能页面。
使用 --inplace 应该适合你。这将向您显示进度,压缩传输(在默认压缩级别),递归传输本地存储目录的内容(第一个尾随斜杠很重要),对文件进行更改并使用 ssh 进行传输。
我也经常使用 -a 标志,它可以做更多的事情。它等效于 -rlptgoD 我将留下确切的行为供您在手册页中查找。
要同步具有低到中等差异的大文件或块设备,您可以进行普通复制或使用bdsync, rsync 绝对不适合这种特殊情况*。
bdsync
为我工作,似乎足够成熟,它的错误历史令人鼓舞(小问题,迅速解决)。在我的测试中,它的速度接近您可以获得的理论最大值**(也就是说,您可以在大约需要读取文件的时间同步)。最后,它是开源的,而且不花钱。bdsync
从两个主机读取文件并交换校验和以比较它们并检测差异。所有这些同时发生。它最终在源主机上创建一个压缩补丁文件。然后将该文件移动到目标主机并再次运行 bdsync 以修补目标文件。当在相当快的链接(例如 100Mbit 以太网)上使用它时,对于差异很小的文件(在 VM 磁盘上最常见的情况),它会将同步时间缩短到您需要读取文件的时间。通过慢速链接,您需要更多时间,因为您必须将压缩的更改从一台主机复制到另一台主机(似乎您可以使用一个不错的技巧来节省时间,但尚未测试)。对于有很多更改的文件,还应考虑将补丁文件写入磁盘的时间(并且您需要在两个主机中都有足够的可用空间来保存它)。
这是我通常使用 bdsync 的方式。运行这些命令
$LOCAL_HOST
以“复制”$LOCAL_FILE
到$REMOTE_FILE
on$REMOTE_HOST
。我使用pigz
(a fastergzip
) 来压缩更改,ssh
在远程主机上运行 bdsync 和rsync
/ssh
来复制更改。请注意,我正在检查补丁是否已成功应用,但我只在应用成功时打印“更新成功”。如果失败,您可能希望做更多的事情。*: rsync 在处理大文件时效率非常低。即使使用 --inplace ,它也会首先读取目标主机上的整个文件,之后开始读取源主机上的文件并最终传输差异(只需在运行 rsync 并观察时运行 dstat 或类似文件)。结果是,即使对于差异很小的文件,为了同步它,读取文件所需的时间也会增加一倍。
**:假设您没有其他方法可以判断文件的哪些部分已更改。LVM 快照使用位图记录更改的块,因此它们可以非常快(lvmsync的自述文件有更多信息)。
看看Zumastor Linux Storage Project
ddsnap
,它通过该工具使用二进制“rsync”实现“快照”备份。从手册页:
ddsnap 提供块设备复制,因为它具有能够有效地保存多个同时快照的块级快照工具。ddsnap 可以生成两个快照之间不同的快照块列表,然后通过线路发送该差异。在下游服务器上,将更新的数据写入快照块设备。
我最终编写了软件来做到这一点:
http://www.virtsync.com
这是一个商业软件,每台物理服务器售价 49 美元。
我现在可以在不到 3 分钟的时间内通过住宅宽带复制一个 50GB 的稀疏文件(包含 3GB 的内容)。
lvmsync执行此操作。
这是使用记录。它在源上创建 LVM 快照,传输逻辑分区。您可以随心所欲地传输自快照创建以来更改的增量更新。
复制整个文件系统可以解决问题吗?DRBD?http://www.drbd.org/
这里可能有点奇怪,但我最近发现 NFS 可以很好地处理这个问题。
因此,您在一台机器上导出一个目录,然后将其挂载到另一台机器上,然后您只需使用基本的 utils 复制文件,例如
cp
. (一些旧的/古老的实用程序可能会遇到稀疏文件的问题。)我发现
rsync
传输稀疏文件的效率特别低。我不知道这样的实用程序,只有可以处理它的系统调用,所以如果你编写这样的实用程序,它可能会很有帮助。
您实际上可以做的是使用 qemu-img convert 来复制文件,但它仅在目标 FS 支持稀疏文件时才有效