我们使用rsync将我们的主文件服务器的一个镜像更新到一个离站的同位备份服务器。 我们目前遇到的一个问题是,我们的文件服务器有大于1TB的大多数较小的文件(在10-100kb的范围内),当我们传输这么多的数据时,我们通常最终将连接丢弃数小时转移。 Rsync没有恢复/重试function,只需重新连接到服务器,以取代它停止的地方 – 您需要通过文件比较过程,这将导致文件数量非常长。
推荐解决scheme是将大型rsync传输分割为一系列较小的传输。 我认为最好的办法是通过顶级目录名的第一个字母,这并不能给我们一个完美的分布,但是足够好。
我想确认一下我的方法是否理智,或者有更简单的方法来完成目标。
要做到这一点,我通过AZ,az,0-9来select一个字符$prefix 。 起初我只是想跑步
rsync -av --delete --delete-excluded --exclude "*.mp3" "src/$prefix*" dest/
(–exclude“* .mp3”只是一个例子,因为我们有一个比较冗长的排除列表来删除像临时文件这样的东西)
这样做的问题是,dest中/ / src中不存在的任何顶级目录都不会被–delete获取。 为了解决这个问题,我正在尝试以下方法:
rsync \ --filter 'S /$prefix*' \ --filter 'R /$prefix*' \ --filter 'H /*' \ --filter 'P /*' \ -av --delete --delete-excluded --exclude "*.mp3" src/ dest/
我正在使用show和hide include和exclude ,否则 – 删除 – 删除将删除任何不匹配的$前缀。
这是把rsync分成更小块的最有效的方法吗? 有没有一个更有效的工具,或者我错过了一个国旗,这可能会使这个更简单?
我对此的解决scheme是一个不同的两通道方法,我交换了一些磁盘空间。 我在服务器上执行rsync –only-write-batch,然后rsyncbatch file本身到目的地,循环直到rsync成功。 一旦批处理完全结束rsync – 在目标上的读批重新创build所有更改。
这对我来说也有一些意想不到的好处:
因为我更担心备份“存在”而不是“可用”,所以我实际上并没有每天在接收端执行读取批处理 – 大多数情况下批次相对较小
我一直在试验–checksum-seed = 1 …我可能会误读文档,但是我认为它使得batch file更加可以同步(即,当我不执行–read-batch任何操作给定的一天,第二天的批次同步更快,因为前一天的批次是一个很好的基础)
如果批量太大,无法通过互联网“及时”发送,我可以在外部驱动器上运行。 我的意思是说,如果在第二天的备份开始之前,我不能把这批文件翻过来阅读。
虽然我个人不这样做,但我可以在不同的地点备份两个备份,并将这批备份发送给他们。
不是完全回答你的问题,但我经常使用的另一个选项是以两遍的方式做到这一点:首先build立一个文件列表,然后拆分要传输的文件列表,并将文件列表送入rsync / cpio / cp等。
rsync --itemize-changes <rest of options>将会打印出一大串有用的元数据传输的文件列表,从这个输出中提取文件名非常容易,然后用rsync --files-from或另一个工具。
可能对你的情况有用 – 从一个中断的转移恢复会更快。
我build议你看看连接问题,而不是试图通过创build另一个“问题”来解决这个问题。
这不是一个普通的行为。 您是通过SSH还是rsyncd使用rsync?
据我所知,当端点之间没有数据传输时,大多数“closures”连接发生。