解决方案:

解决方案:

我正在尝试通过在两台服务器上停止 Mongo 然后运行以下命令,将大型 Mongo 数据库从生产服务器镜像到开发环境:

rsync --archive --delete --recursive --verbose --compress --rsh "ssh -t -o StrictHostKeyChecking=no -i key.pem" remoteuser@remotehost:/var/lib/mongodb/ /var/lib/mongodb

它运行良好几分钟,但随后因错误而停止:

receiving incremental file list
./
collection-228--5129329295041693519.wt
inflate returned -3 (0 bytes)
rsync error: error in rsync protocol data stream (code 12) at token.c(557) [receiver=3.1.1]
rsync: [generator] write error: Broken pipe (32)
rsync error: error in socket IO (code 10) at io.c(820) [generator=3.1.1]

谷歌搜索该错误表明这是某种网络连接问题,但我能够正常连接到两个服务器。

如果我重新运行该命令,它会在完全相同的文件上失败并显示相同的错误消息。是什么导致了此错误?我该如何修复它?

答案1

事实证明,rsync 访问远程服务器上的 rsync,并且我的服务器之间的版本不同。我在目标服务器上运行 3.1.1,但在源服务器上运行 3.1.0,显然这足以中断某些文件的下载。我在源服务器上安装了 3.1.1,之后传输工作顺利进行。

答案2

解决方案:

作为Cerin 在这里解释,只需升级你的 rsync 版本,以确保它们是发送和接收 PC 上都完全相同!

我遇到了完全相同的问题:通过 rsync 的 ssh 传输非常大的文件时,出现管道写入错误,并设置了 rsync 的--compress-z)标志。

我的 rsync 错误是:

rsync: [sender] write error: Broken pipe (32)
rsync error: error in rsync protocol data stream (code 12) at io.c(837) [sender=3.1.0]

rsync --version从我的发送 PC 显示rsync version 3.1.0 protocol version 31,而从我的接收 PC 显示rsync version 3.1.2 protocol version 31因此,我决定将我的发送端 PC 也升级到 3.1.2 版本。我这样做之后,它就成功了!

如何升级您的rsync版本:

rsync只需按照以下说明从源代码安装即可:http://www.beginninglinux.com/home/backup/compile-rsync-from-source-on-ubuntu

简而言之:

  1. 检查你的 rsync 版本,以便了解当前拥有的内容:

     rsync --version
    
  2. 在这里下载您想要的版本的源文件:https://download.samba.org/pub/rsync/src/

  3. 在您的 GUI 文件管理器中,右键单击并提取它。

  4. 从源代码构建并安装:

     ./configure
     make
     sudo checkinstall
    
  5. 检查你的 rsync 版本以确保它已更新:

     rsync --version
    
  6. 完毕!

  7. (我还没有测试过,但显然):要将其从系统中删除,请使用:

     dpkg -r rsync
    

一旦我进行升级以使两个系统的 rsync 版本相同,它就可以完美运行!

有关的:

  1. https://bugs.launchpad.net/ubuntu/+source/rsync/+bug/1300367
  2. https://unix.stackexchange.com/questions/242898/rsync-keeps-disconnecting-broken-pipe/547861#547861
  3. 谷歌搜索“rsync 写入错误损坏的管道” -https://www.google.com/search?q=rsync+write+error+broken+pipe&oq=rsync+write+error+&aqs=chrome.0.0j69i57j0l4.2263j0j7&sourceid=chrome&ie=UTF-8&sec_act=d
  4. [我的答案]https://askubuntu.com/questions/791002/how-to-prevent-sshfs-mount-freeze-after-changing-connection-after-suspend/942820#942820

答案3

您是否尝试在本地和远程服务器之间同步数据,远程服务器看起来像 aws ec2,您可以使用以下命令来同步数据

rsync -ravhz “ssh -i /path/to/EC2_KEY.pem” /path/to/local/files/* EC2_USER@EC2_INSTANCE:/path/to/remote/files

请在同步前检查服务器,因为您可能会以错误的方向同步

如果你尝试从 ec2 同步到本地服务器,请检查服务器之间是否打开了正确的端口

首先尝试 telnet 并检查服务器之间的连通性,您必须将 IP 和端口列入白名单,因为某些防火墙可能会阻止数据传输

答案4

我之所以问这个问题,是因为我遇到了这个问题。花了 5 个小时试图解决这个问题,我终于找到了解决方案。对我来说,唯一有效的方法是更改​​ MTU 大小。我运行了以下命令:

sudo ifconfig enp42s0 mtu 1024

默认大小为 1500,我将其更改为 1024。运行 ifconfig 以确定网络接口的名称。在我的例子中,名称是 enp42s0,这很奇怪。您可能会得到类似 eth0 的名称。

这个解决方案很糟糕,因为现在使用 Google Meet 时我无法共享我的屏幕。如果我将 MTU 大小改回默认值 1500,那么我就可以在使用 Google Meet 时共享我的屏幕。我想知道将值更改为 1024 后还有什么会停止工作。

我正在使用基于 ubuntu 的 Linux 发行版 pop-os。我相信这是一个网络驱动程序问题。

相关内容