我们有两个大型存储服务器(+100TB),一个运行在 ZFS 上,另一个运行在 XFS 上,我们打算使用 XFS 作为工作服务器,使用 ZFS 作为备份服务器(快照 <3)。现在的问题是让这些庞然大物保持同步...(同步为每日同步)
最简单的选择是使用 rsync,但遗憾的是目录结构很深,到处都是硬链接。所以这意味着我们需要进行“全局”扫描,这将花费很长时间……最重要的是,大多数数据都是创建的,从未修改过。所以 rsync 可能不是最佳选择。
我调查了通知,这似乎相对便宜,而且由于我们只想每天同步一次,因此能够将负载转移到一个好的时间...遗憾的是,如果我们只查看创建的文件,我们会将硬链接复制为数据,这将使我们备份中使用的存储量增加一倍...(基本上没有办法从 rsync 进行 -H 检查)
我能想到的唯一选择就是重新组织我们的存储以使用基于日期的目录,但遗憾的是移动那么多数据并不是我们想要的......
还有其他选择吗?
以供参考 :
- 带有 XFS 的服务器有一个 raid 控制器(无 JBOD 选项)和 SATA 磁盘(WD RE)。32Gb RAM
- 带有 ZFS 的服务器有 HBA 控制器和 SAS 磁盘。126Gb RAM
当我提到 ZFS 很慢时,我看到“ls”需要几秒钟……
答案1
“足够快” 有多快?
您每天都会这样做一次,因此我认为如果需要 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 内置的快照导出/导入系统。
答案2
你确实应该在两边都使用 ZFS,并结合块级快照/复制例程,例如萨诺伊德。
如果没有它,您将陷入基于文件的操作和 rsync 文件扫描的痛苦之中。
答案3
我将采用两部分策略...最后我会建议可选的第三部分。
第 1 部分:使用 inotify:编写一个程序,使用 inotify 记录创建、删除和修改的文件。编写另一个程序,读取日志、删除任何重复项并备份这些文件(并删除已删除的文件)。这并不容易。编写 inotify 很复杂。日志不能是简单的文本文件,因为文件名可以包含换行符。如果在写入日志时系统崩溃,您需要能够处理部分写入的文件名。
第 2 部分:每周 rsync 以防万一。每隔几天执行一次“rsync -a --delete”来捕获遗漏的任何文件。第 1 部分中的解决方案并不完善。如果您的程序跟不上 inotify,它可能会遗漏一些文件。如果机器重新启动,创建/删除/修改文件的日志可能会丢失最近的项目。错误和其他问题也可能导致某些文件丢失。
可选第 3 部分:运行几周后,您已经解决了所有错误,但您仍然会发现 rsync 偶尔会找到遗漏的文件。我向您保证这种情况会发生。inotify 是“尽力而为”。因此,此时您会意识到维护第 1 部分和第 2 部分中的代码的工作量是预期的两倍。要解决这个问题,请丢弃第 1 部分中编写的代码,因为 rsync 才是您真正需要的。