有没有一种方法可以提示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镜)。
在一段时间内使用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是复制扩展池中的一半数据,然后删除原始的重复数据。