AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 66338
Accepted
fadedbee
fadedbee
Asked: 2009-09-18 08:59:56 +0800 CST2009-09-18 08:59:56 +0800 CST 2009-09-18 08:59:56 +0800 CST

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

  • 772

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

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

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

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

谢谢,

克里斯。

linux
  • 9 9 个回答
  • 43694 Views

9 个回答

  • Voted
  1. Steve P
    2012-10-07T07:13:01+08:002012-10-07T07:13:01+08:00
    rsync --ignore-existing --sparse ...
    

    以稀疏模式创建新文件

    其次是

    rsync --inplace ...
    

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

    • 23
  2. reconbot
    2009-09-18T09:40:03+08:002009-09-18T09:40:03+08:00

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

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

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

    rsync -v -z -r --inplace --progress -e ssh /path/to/local/storage/ \
    [email protected]:/path/to/remote/storage/ 
    

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

    • 5
  3. ndemou
    2018-08-25T05:15:12+08:002018-08-25T05:15:12+08:00

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

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

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

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

    这是我通常使用 bdsync 的方式。运行这些命令$LOCAL_HOST以“复制”$LOCAL_FILE到$REMOTE_FILEon $REMOTE_HOST。我使用pigz(a faster 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
    

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

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

    • 5
  4. rkthkr
    2009-10-03T01:21:31+08:002009-10-03T01:21:31+08:00

    看看Zumastor Linux Storage Projectddsnap ,它通过该工具使用二进制“rsync”实现“快照”备份。

    从手册页:

    ddsnap 提供块设备复制,因为它具有能够有效地保存多个同时快照的块级快照工具。ddsnap 可以生成两个快照之间不同的快照块列表,然后通过线路发送该差异。在下游服务器上,将更新的数据写入快照块设备。

    • 4
  5. Best Answer
    fadedbee
    2013-05-03T23:35:48+08:002013-05-03T23:35:48+08:00

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

    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 
    
    • 4
  6. Tobu
    2012-11-04T16:28:48+08:002012-11-04T16:28:48+08:00

    lvmsync执行此操作。

    这是使用记录。它在源上创建 LVM 快照,传输逻辑分区。您可以随心所欲地传输自快照创建以来更改的增量更新。

    • 2
  7. James C
    2009-10-03T01:39:28+08:002009-10-03T01:39:28+08:00

    复制整个文件系统可以解决问题吗?DRBD?http://www.drbd.org/

    • 1
  8. cstamas
    2012-10-07T09:37:55+08:002012-10-07T09:37:55+08:00

    这里可能有点奇怪,但我最近发现 NFS 可以很好地处理这个问题。

    因此,您在一台机器上导出一个目录,然后将其挂载到另一台机器上,然后您只需使用基本的 utils 复制文件,例如cp. (一些旧的/古老的实用程序可能会遇到稀疏文件的问题。)

    我发现rsync传输稀疏文件的效率特别低。

    • 1
  9. dyasny
    2009-09-18T09:07:09+08:002009-09-18T09:07:09+08:00

    我不知道这样的实用程序,只有可以处理它的系统调用,所以如果你编写这样的实用程序,它可能会很有帮助。

    您实际上可以做的是使用 qemu-img convert 来复制文件,但它仅在目标 FS 支持稀疏文件时才有效

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve