Answers:
您需要将数据重写到扩展的zpool以便重新平衡。否则,随着时间的流逝,您的写操作将分布在整个池中。
zfs send | zfs recv
没有理由将zvol仅存储在初始设备上。如果扩大池,ZFS将在所有可用的基础设备上扩展更新的数据。ZFS没有固定的分区。
这是ewwhite的回答的“延续”:
您需要将数据重写到扩展的zpool以便重新平衡
我编写了一个PHP脚本(可在github上找到),以在Ubuntu 14.04主机上实现此操作的自动化。
只需安装PHP CLI工具sudo apt-get install php5-cli
并运行脚本,然后将路径传递到池数据作为第一个参数即可。例如
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拥有的重新平衡功能(手指交叉)。
我发现的最佳解决方案是在扩展池中复制一半数据,然后删除原始重复数据。