我有一个文件存储服务器,它使用文件sha256散列作为文件名,连同文件扩展名,以及三级目录,例如带有sha256散列的PDF文件,将文件存储在AABB1F1C6FC86DB2DCA6FB0167DE8CF7288798271EA24B68D857CBC5CF8DC66A将存储在如下所示的子目录中:
<root>/AA/BB/AABB1F1C6FC86DB2DCA6FB0167DE8CF7288798271EA24B68D857CBC5CF8DC66A.pdf
文件将被添加到目录结构中,但不会被删除或修改。
我使用每10分钟运行一次的使用rsync将文件推送到远程服务器的cron作业来保存此文件结构的实时副本。 由于文件一旦添加就不会被删除或更改,实际上只会发送新文件。
我发现rsync用于比较两个目录(即没有变化)的带宽大约是11 MB,随着文件总数的增加(此时为148 207)。 这是有道理的 – rsync实际上必须发送一个所有的文件名列表到远程服务器,以找出远程服务器上缺less的。
所以我的问题是: 有没有办法减less使用的带宽? 它不一定是一个基于rsync的解决scheme,但它会更好。 我正在考虑将rsync查看的文件限制为最近修改的文件,即在上次同步之后进行了修改,但似乎并不推荐: rsync只是在date和时间之后创build或修改的文件
还有其他build议吗?
在大多数情况下,这是不推荐的,但考虑到您的目标是减less差异计算带宽,这是适当的。 考虑以下脚本stream程:
-newer <lowbarfile> ! -newer <highbarfile>查找-newer <lowbarfile> ! -newer <highbarfile> -newer <lowbarfile> ! -newer <highbarfile>select传输文件,pipe道到你的参考问题的rsync。 这不是一个像inotifywatch一样的解决scheme,但是它也不会在8000个目录之后中断,并且您的层次结构似乎使用多达256 + 65536个目录。
对于每次运行, rsync需要build立本地和远程目录结构的完整列表,并在确定哪些文件是新创build的并将这些新文件发送过来之前计算差异。 那是什么“贵”的。
您没有提到文件服务器的操作系统,但是在Linux上,您可以使用类似inotofywatch东西,在每个创build或修改文件的文件系统事件上生成警报,并将该事件用作input来复制新的文件。 虽然你的分层目录结构使inotifywatch有点贵。
在Windows上,你有DFSR ,它的名称大致相当,它也插入到文件系统层中,在这方面更加智能,只有文件的修改部分被复制,而不是整个文件。
你可以使用-e“ssh -C”来运行rsync,从而压缩ssh隧道,而不是像使用-z运行时那样只是数据。 或者连接思想压缩stream量的VPN(openvpn可以做到这一点)。