ZFS-inplace-rebalancing完整指南从安装到高级配置【免费下载链接】zfs-inplace-rebalancingSimple bash script to rebalance pool data between all mirrors when adding vdevs to a pool.项目地址: https://gitcode.com/gh_mirrors/zf/zfs-inplace-rebalancingZFS-inplace-rebalancing是一款简单实用的bash脚本工具专为ZFS存储池设计能够在添加vdevs后实现池数据在所有镜像之间的重新平衡。本文将为您提供从安装到高级配置的完整指南帮助您轻松掌握这一工具的使用方法。为什么需要ZFS-inplace-rebalancing当您向ZFS存储池添加新的vdevs时数据并不会自动重新平衡到新的设备上这可能导致存储性能下降和空间利用不均。ZFS-inplace-rebalancing通过巧妙的文件复制和重命名机制在不需要额外存储池的情况下实现数据的重新平衡是解决这一问题的理想选择。[!IMPORTANT] ZFS 2.3.3版本引入了zfs rewrite命令旨在解决相同的问题并且避免了本脚本的大多数限制。在尝试使用本脚本之前建议先查看这一官方解决方案。PR: https://github.com/openzfs/zfs/pull/17246 Docs: https://openzfs.github.io/openzfs-docs/man/master/8/zfs-rewrite.8.html工作原理揭秘ZFS-inplace-rebalancing的工作原理并不复杂但却非常巧妙脚本递归遍历指定目录中的所有文件为每个文件创建一个带有.balance后缀的副本同时保留所有文件属性删除原始文件然后将副本重命名回原始文件名当复制文件时ZFS会将数据块分散到所有vdevs上从而有效地将原始文件的数据或多或少均匀地重新分配。这种方式允许池数据在不需要单独备份池/驱动器的情况下进行重新平衡。对于硬链接文件的inode组脚本会复制组中的一个文件删除原始文件和所有硬链接将副本重命名回原始文件名然后从该副本生成新的硬链接来替换所有被删除的链接文件。注意此过程并非完全原地进行因为在删除原始文件之前必须完全复制文件。使用in-place一词是为了明确使用此脚本不需要额外的池因此也不需要额外的硬件。但这也意味着您必须有足够的空间来创建目标目录中最大文件的副本才能使其工作。准备工作检查与要求在使用ZFS-inplace-rebalancing之前您需要完成以下准备工作检查池平衡状态要检查池的当前平衡状态请使用以下命令zpool list -v查看vdevs之间CAP值SIZE/FREE与ALLOC比率的差异。如果差异较大则说明需要进行重新平衡。禁用重复数据删除由于本脚本的工作原理本质上是故意创建重复文件因此重复数据删除肯定会阻止其按预期工作。如果您使用重复数据删除可能需要采用更昂贵的重新平衡方法包括使用额外的驱动器。选择合适的数据冷数据由于脚本的工作原理仅在不被主动访问的数据上运行它至关重要因为原始文件将被删除。谨慎处理快照如果在开始重新平衡脚本之前对要平衡的数据进行快照请记住ZFS现在必须跟踪目标目录中的所有数据两次一次在您创建的快照中一次在新副本中。这意味着您实际上将使用目标目录中所有文件大小的两倍。因此最好分批处理池数据并沿途删除旧快照因为在重新平衡过程中的某个时刻您可能会达到池的容量限制。快速安装三步完成由于这是一个简单的bash脚本没有提供安装包。只需下载脚本并使其可执行git clone https://gitcode.com/gh_mirrors/zf/zfs-inplace-rebalancing cd zfs-inplace-rebalancing chmod x ./zfs-inplace-rebalancing.sh依赖项perl- 大多数系统默认应该已安装awk- 大多数系统默认应该已安装基本使用指南[!CAUTION]始终备份您的数据您可以通过不带任何参数运行脚本来打印帮助消息./zfs-inplace-rebalancing.sh主要参数说明参数名称描述默认值-c--checksum是否使用MD5校验和比较复制文件的属性和内容。从技术上讲这是一个冗余检查会消耗大量资源请慎重考虑。true-p--passes每个文件的最大重新平衡次数。使用 0的值将其设置为无限可能会在重新平衡大量小文件时提高性能。1--debug显示额外输出包括3次列出目标位置中的所有文件列表、inode排序列表、inode分组以及更详细的移动/复制/链接/计数事务信息。false简单示例确保以对目标目录中的所有文件具有读写权限的用户身份运行此脚本。最简单的方法是以root身份运行脚本。sudo su ./zfs-inplace-rebalancing.sh --checksum true --passes 1 /pool/path/to/rebalance要跟踪平衡进度您可以打开另一个终端并运行watch zpool list -v高级配置技巧日志记录到文件要将输出写入文件只需将stdout和stderr重定向到文件或单独的文件。由于这会重定向所有输出您必须跟踪日志文件的内容以获取实时信息# 一个终端窗口 tail -F ./stdout.log # 另一个终端窗口 ./zfs-inplace-rebalancing.sh /pool/path/to/rebalance ./stdout.log 2 ./stderr.log使用Docker运行为了提高可移植性此脚本也可以使用docker运行sudo docker run --rm -it -v /your/data:/data ghcr.io/markusressel/zfs-inplace-rebalancing:latest ./data注意事项虽然此脚本确实有进度输出文件以及百分比但最好先尝试一个小的子文件夹或者以手动选择的方式处理您的池文件夹布局。如果发生任何问题这也可以限制造成的损害。中途中止脚本时请务必检查其输出的最后几行。如果在重命名过程之前或期间取消可能会留下.balance文件您必须手动重命名或删除它。尽管--passes参数可用于限制每个文件的最大重新平衡次数但它仅用于加速中止的运行。不会自动多次处理单个文件。要达到多次传递您必须在同一目标目录上多次运行脚本。故障排除与常见问题权限问题如果您遇到权限错误请确保以root用户身份运行脚本或者确保当前用户对目标目录中的所有文件具有读写权限。空间不足如果在运行过程中收到空间不足的错误请尝试分批处理数据或者清理不必要的文件和快照以释放空间。脚本中断后的恢复如果脚本意外中断可能会留下.balance文件。您可以手动检查这些文件如果确认它们是有效的副本可以将它们重命名回原始文件名。总结ZFS-inplace-rebalancing是一个简单而强大的工具能够帮助您在添加新vdevs后重新平衡ZFS存储池数据。通过本指南您应该已经掌握了从安装到高级配置的所有知识。记住在进行任何数据操作之前始终确保您有完整的备份。希望本指南对您有所帮助如有任何问题或建议请随时在项目中提出。【免费下载链接】zfs-inplace-rebalancingSimple bash script to rebalance pool data between all mirrors when adding vdevs to a pool.项目地址: https://gitcode.com/gh_mirrors/zf/zfs-inplace-rebalancing创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考