我正在 cron 中运行一些命令,该命令在两个数据中心之间执行 rsync。数据中心之间的连接速率约为 1Mbps。我注意到 rsync 在传输大约 2.7GB 到 2.9GB 的数据时不断失败,这可能相当于上述连接上大约一个小时或更长时间。我知道过去我们的防火墙配置为关闭已打开一个多小时的空闲连接。
但是 rsync 传输真的会空闲吗?我该怎么做才能解决这个问题?
错误:
rsync:连接意外关闭(迄今已接收 2987596424 字节)[接收方]
rsync 错误:io.c(605) 处的 rsync 协议数据流 (代码 12) 出现错误 [接收器 = 3.0.9]
rsync:连接意外关闭(迄今已接收 523 字节)[生成器]
rsync 错误:io.c(605) 处的 rsync 协议数据流 (代码 12) 出现错误 [generator=3.0.9]
我的 ~/.ssh/config 中已经有这个了(但也许这些值需要增加?):
Host *
ServerAliveInterval 60
ServerAliveCountMax 15
答案1
rsync 传输期间网络连接空闲:
是的,rsync
可以留下安静的在磁盘读取期间并且没有数据包要发送......
你说。我们的防火墙配置为关闭已打开一个多小时的空闲连接但没有关于连续闲置时长。
rsync
在两端进行处理,根据之前计算的校验和,读取整个文件来搜索数据包之间的差异。
当两端的文件没有差异时,如果不找到差异,两端就可能无法进行交换。
这里有一张小图表示我的桌面和他的备份之间的一次 rsync 运行:
我们可以看到几秒过去了没有数据:
TIME BLOCKS BYTES
IN OUT IN OUT
...
Jul 28 15:00:07 2013 449 41 23443 1526403
Jul 28 15:00:08 2013 0 0 0 0
Jul 28 15:00:09 2013 0 0 0 0
Jul 28 15:00:10 2013 143 182 21348 1123986
Jul 28 15:00:11 2013 112 142 6966 523326
Jul 28 15:00:12 2013 31 30 1942 1890
Jul 28 15:00:13 2013 30 28 1853 88038
Jul 28 15:00:14 2013 0 0 0 0
Jul 28 15:00:15 2013 57 66 3954 38301
...
解决方法:
作为一种解决方法,您可以使用基于套接字的 ssh 共享:
首先运行一个简单的 ssh 来挂起套接字和连接
ssh -M -o ControlPath=$HOME/.ssh/socket_test destHost ping -n localhost
在另一个窗口中:
rsync -e 'ssh -e none -S $HOME/.ssh/socket_test' /src/file destHost:/dst/file
这样,两个连接将仅使用一个连接ssh 会话。ping
将确保(大量)连续流量,然后rsync
可以使用相同的网络连接安静地工作。