ZFS系列(十五)数据集最佳实践和注意事项


本文介绍如何ZFS数据集的最佳实践和注意事项,注意和存储池的区分开。

最佳实践

和所有的建议一样,这些建议中有一些很重要,而另一些可能没有。你甚至可能无法像你想的那样严格地遵循它们。无论如何,你应该意识到它们。我将尝试为每一项提供一个理由。它们没有特定的顺序。“最佳实践”的理念是优化空间效率、性能并确保最大程度的数据完整性。

  • 总是启用压缩。几乎可以肯定,没有理由让它保持禁用状态。它占用CPU很少和也几乎不影响硬盘的吞吐量,但它的好处是惊人的。
  • 除非您有足够的RAM,否则避免使用数据去重功能。与压缩不同,数据去重在系统上的成本非常高。数据去重表占用大量内存。
  • 经常、定期地进行快照。快照很便宜,而且可以在一段时间内保存大量的文件版本。考虑使用类似zfs-auto-snapshot的脚本。
  • 快照不是备份。使用“zfs send”和“zfs receive”将您的zfs快照发送到外部存储。
  • 如果使用NFS,请使用ZFS NFS而不是您的本机导出。这可以确保在NFS客户端开始向挂载点发送数据之前,数据集已挂载并处于在线状态。
  • 不要混合NFS内核导出和ZFS NFS导出,这很难管理和维护。
  • 在/home/下 安装ZFS,可以为每个用户设置嵌套数据集。例如,pool/home/atoponce和pool/home/dobbs,并对数据集使用配额。
  • 当使用”zfs send”和”zfs receive”时,使用”zfs send -i”开关发送增量流。这是一个非常节省时间的方法。
  • 考虑使用“zfs send”而不是“rsync”,因为“zfs send”命令可以保留数据集属性。

注意事项

注意事项列表的重点绝不是阻止您使用ZFS。相反,作为规划ZFS存储服务器的存储管理员,您应该注意这些事情,以免出现数据损坏丢失之类的严重的问题。如果您不关心这些注意事项,您有可能会得到损坏的数据。上述的“最佳实践”列表可能会模糊这一界限。我已经试着列出了所有的如果不注意可能会导致数据损坏的事项。阅读并理解这些说明,你应该会很大程度上避免出问题。

  • “zfs destroy”可能导致其他数据集停机。“zfs destroy”将接触存储池中数据集中的每个文件。数据集越大,执行此操作所花费的时间就越长,并且它将使用驱动器中所有可能的IOPS来实现此操作。因此,如果销毁数据集需要2小时,则池中的其他数据集可能需要2小时的停机时间。
  • 如果在/etc/exports文件中没有有效的导出,Debian和Ubuntu将不会启动NFS守护进程。您必须修改/etc/init.d/nfs 初始化脚本在不导出的情况下启动,或者在本地创建虚拟导出。
  • Debian和Ubuntu,可能还有其他系统都使用并行启动。因此,初始化脚本的执行顺序不再是按优先级的。这为在启动时挂载ZFS数据集带来了问题。对于Debian和Ubuntu,点击“/etc/init.d/.legacy-bootordering文件,并确保/etc/init.d/zfs 初始化脚本是在该运行级别的所有其他服务之前先启动的。
  • 不要从其他ZFS数据集中的文件创建ZFS存储池。这将导致各种问题并且令人头痛。
  • 在创建ZVOL时,请确保将块大小设置为与格式化ZVOL所用的块大小相同或者上其倍数。如果块大小没有对齐,可能会出现性能问题。
  • 当加载“zfs”内核模块时,确保为ARC设置一个最大数量。执行大量的“zfs发送”或快照操作将缓存数据。如果不设置,RAM将被慢慢填满,直到内核调用OOM 杀掉进程。我已经在/etc/modprobe.d/zfs.conf文件中设置了”options zfs zfs_arc_max=2147483648”,这是一个2 GB的ARC限制。

参考资料

https://pthree.org/2013/01/03/zfs-administration-part-xvii-best-practices-and-caveats/

如果你觉得本文对你有帮助,欢迎打赏