我们有两台大型存储服务器(+100TB),一台运行在 ZFS 上,另一台运行 XFS,我们打算将 XFS 用作我们的工作服务器并使用 ZFS 作为备份服务器(快照 <3)。现在的问题是让这些野兽保持同步......(同步为每日同步)
最简单的选择是使用 rsync,但遗憾的是目录结构很深,而且到处都是硬链接。所以这意味着我们需要进行一次“全局”扫描,这需要很长时间......最重要的是,大部分数据都是创建的,从未修改过。所以 rsync 可能不是要走的路。
我研究了inotify,它看起来相对便宜,而且因为我们只希望每天同步,所以可以卸载到美好的时光......遗憾的是,如果我们只查看创建的文件,我们会将硬链接复制为数据将使我们备份中使用的存储量翻倍......(基本上没有办法从 rsync 进行 -H 检查)
我能想到的唯一选择是重新组织我们的存储以使用基于日期的目录,遗憾的是,移动这么多数据并不是我们更喜欢的......
还有其他选择吗?
以供参考 :
- 带有 XFS 的服务器有一个 RAID 控制器(无 JBOD 选项)和 SATA 磁盘 (WD RE)。32Gb 内存
- 具有 ZFS 的服务器具有 HBA 控制器和 SAS 磁盘。126Gb 内存
当我将 ZFS 称为缓慢时,我看到 'ls' 需要几秒钟......
你真的应该在两边都使用 ZFS,再加上像Sanoid这样的块级快照/复制例程。
没有它,您将陷入基于文件的操作和 rsync 文件扫描的痛苦。
“足够快”有多快?
你每天这样做一次,所以我怀疑如果需要 2-3 个小时,那就足够了。
在这种情况下,“rsync -avP”应该是你所需要的。最新版本可以处理大目录、深层次结构,并且不需要像旧版本那样多的 RAM。
如果没有文件更改,“rsync -a”将与“ls -lR”一样快。您无法获得比“ls -lR”更快的速度,因为它对系统上的每个文件执行 lstat()。
基准测试“ls -lR”和“rsync -a”。如果它们比您想象的要慢,请查看https://serverfault.com/a/746868/6472以获取建议。
如果您需要比“ls -lR”基准测试更快的东西,您将不得不编写使用“inotify”的东西,或者使用某种基于块的系统。特别是,在两个系统上使用 ZFS 将使您能够使用 ZFS 内置的快照导出/导入系统。
我会采用两部分策略......最后我会建议第三部分是可选的。
第 1 部分:使用 inotify:编写一个程序,使用 inotify 记录创建、删除和修改的文件。编写另一个程序来读取日志、删除所有重复项并备份这些文件(并删除已删除的文件)。这并不容易。编程 inotify 很复杂。日志不能是简单的文本文件,因为文件名可以包含换行符。如果在写入日志时系统崩溃,您需要能够处理部分写入的文件名。
第 2 部分:每周 rsync 以防万一。每隔几天执行一次“rsync -a --delete”以捕获任何丢失的文件。第 1 部分中的解决方案是不完美的。如果您的程序跟不上 inotify,它可能会丢失一些文件。如果机器重新启动,创建/删除/修改文件的日志可能会丢失最近的项目。错误和其他问题也可能导致丢失某些文件。
可选的第 3 部分:在你运行了几个星期并且你已经解决了所有的错误之后,你仍然会发现 rsync 偶尔会找到丢失的文件。我向你保证这会发生。inotify 是“尽力而为”。因此,此时您将意识到在第 1 部分和第 2 部分中维护代码的工作量是您预期的两倍。要解决这个问题,请丢弃您在第 1 部分中编写的代码,因为首先您真正需要的是 rsync。