ZFS:在zpool中的所有磁盘上重新分配zvol?

有没有一种方法可以提示ZFS将zpool中的所有磁盘重新分配给定的文件系统?

我在考虑一个场景,我有一个固定大小的ZFS卷,通过FC导出为一个LUN。 当前zpool很小,只有两个1TB的镜像磁盘,zvol总共是750GB。 如果我突然将zpool的大小扩大到12个1TB的磁盘,我相信zvol仍然只能安装在前两个主轴上。

考虑到更多的主轴=更多的IOPS,我可以使用什么方法来重新分配所有12个主轴上的zvol来利用它们?

    您需要将数据重写到扩展zpool以重新平衡它。 否则,随着时间的stream逝,您的写入将分布在整个池中。

    没有理由只将zvol存储在初始设备上。 如果放大池,则ZFS将覆盖所有可用基础设备上的更新数据。 ZFS没有固定的分区。

    这是ewwhite的答案的“延续”

    您需要将数据重写到扩展zpool以重新平衡它

    我写了一个PHP脚本( 可在github上使用 )在我的Ubuntu 14.04主机上自动执行此操作。

    你只需要用sudo apt-get install php5-cli来安装PHP CLI工具,然后运行脚本,将path传递到池数据作为第一个参数。 例如

    php main.php /path/to/my/files

    理想情况下,您应该在池中的所有数据上运行两次脚本。 第一次运行将平衡驱动器利用率,但是单个文件将被过度分配给最后添加的驱动器。 第二次运行将确保每个文件在驱动器上“相当”分布。 我公平地说,而不是平均,因为它只会是平均分配,如果你没有混合驱动能力,因为我与我的RAID 10不同大小(4TB镜+ 3TB镜+ 3TB镜)。

    使用脚本的原因

    • 我必须“就地”解决这个问题。 例如,我不能将数据写入另一个系统,在这里删除它,然后再写回来。
    • 我把池填满了50%,所以在删除原始文件之前,我不能一次复制整个文件系统。
    • 如果只有某些文件需要运行良好,那么可以在这些文件上运行两次脚本。 但是,第二次运行只有在第一次运行才能成功平衡驱动器利用率时才有效
    • 我有很多数据,希望能够看到正在取得进展的迹象。

    我如何判断是否实现了驱动器的利用率?

    在一段时间内使用iostat工具(例如iostat -m 5 )并检查写入。 如果他们是相同的,那么你已经达到了平均分布。 在下面的截图中,它们并不是完美的,因为我在RAID 10中运行了一对4TB和2对3TB驱动器,所以这两个4将会被写入更多。 在这里输入图像描述

    如果您的驱动器利用率是“不平衡的”,那么iostat将显示更多的东西,如下面的截图所示,新的驱动器写入不成比例。 您也可以知道它们是新驱动器,因为读取数据为0,因为它们没有数据。 在这里输入图像描述

    这个脚本并不完美,只是一个解决方法,但同时也适用于我,直到ZFS有一天实现像BTRFS(重叠手指)那样的重新平衡function。

    这是一个黑客,但鉴于你已经停止使用zvol的机器,你可以zfs发送文件系统本地文件本地主机名为bar.zvol,然后你收到文件回来系统了。 这应该为您重新平衡数据。

     zfs send tank/bar > bar.zvol zfs receive tank/bar < bar.zvol 

    我发现的最佳解决scheme是复制扩展池中的一半数据,然后删除原始的重复数据。