我们有两个大型存储服务器(+ 100TB),一个运行在ZFS上,另一个运行XFS,我们打算使用XFS作为我们的工作服务器,并使用ZFS作为备份服务器(快照<3)。 现在问题是保持这些野兽同步…(同步在每日同步)
最简单的select是使用rsync,但不幸的是目录结构很深,并且到处都是硬链接。 所以这意味着我们需要做一个“全局”的扫描,这将需要很长时间…最重要的是,大部分的数据是创build的,永远不会被修改。 所以rsync可能不会是要走的路。
我研究了inotify ,看起来相对便宜,因为我们只是在日常的基础上同步,可以卸载到一个很好的时间…可悲的是,如果我们只看创build的文件,我们会复制硬链接作为数据会使我们备份中使用的存储量增加一倍…(基本上,没有办法从rsync执行-H检查)
剩下的唯一select是我可以考虑将重新组织我们的存储使用基于date的目录,悲伤地移动那么多的数据是不是我们想要的…
还有其他的select吗?
以供参考 :
当我参考ZFS缓慢的时候,我看到'ls'需要几秒钟的时间。
“速度够快”有多快?
你每天都这样做一次,所以我会怀疑,如果需要2-3个小时,那就足够了。
在这种情况下,“rsync -avP”应该是你所需要的。 最新版本处理大型目录,深层次结构,不需要像旧版本那样多的RAM。
如果没有文件改变,“rsync -a”将会像“ls -lR”一样快。 你不能比“ls -lR”更快,因为它执行系统上每个文件的lstat()。
基准“ls -lR”和“rsync -a”。 如果它们比你认为的要慢,请查看https://serverfault.com/a/746868/6472获得build议。
如果您需要比“ls -lR”基准testing更快的速度,则必须写入使用“inotify”的内容,或者使用某种基于块的系统。 特别是,在两个系统上使用ZFS都可以使您使用ZFS内置的快照导出/导入系统。
你真的应该在两边都使用ZFS,再加上像Sanoid这样的块级快照/复制例程。
没有这一点,你坚持基于文件的操作和rsync文件扫描的痛苦。
我会采取两部分的策略…最后,我会build议第三部分是可选的。
第1部分:使用inotify:编写一个使用inotifylogging哪些文件被创build,删除和修改的程序。 写另一个程序,读取日志,删除任何重复,并备份这些文件(并删除删除的文件)。 这并不容易。 编程inotify是复杂的。 日志不能是一个简单的文本文件,因为文件名可以包含换行符。 如果系统在写入日志时崩溃,则需要能够处理部分编写的文件名。
第2部分:每周rsync的以防万一。 每隔几天做一个“rsync -a – 删除”来捕获任何错过的文件。 第一部分的解决scheme不完善。 如果你的程序跟不上inotify,它可能会丢失一些文件。 如果机器重新启动,创build/删除/修改文件的日志可能会丢失最近的项目。 错误和其他问题也可能导致丢失一些文件。
可选的第3部分:在你运行了几周之后,你已经得到了所有的错误,你仍然会发现rsync偶尔会发现错过的文件。 我向你保证会发生。 inotify是“尽力而为”。 因此,在这一点上,您将意识到维护第1部分和第2部分中的代码是您预期的两倍。 要解决这个问题,扔掉你在第1部分中写的代码,因为rsync是你真正需要的。