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 只将更改传输到每个文件,并且 --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 我将留下确切的行为供您在手册页中查找。
要同步具有低到中等差异的大文件或块设备,您可以执行普通副本或使用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的自述文件有更多信息)。
我最终编写了软件来做到这一点:
这是商业软件,每台物理服务器的成本为 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)
| 归档时间: |
|
| 查看次数: |
40739 次 |
| 最近记录: |