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

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

有没有办法可以提示 ZFS 将给定的文件系统重新分配到其 zpool 中的所有磁盘上?

我正在考虑这样一种情况:我有一个固定大小的 ZFS 卷,该卷通过 FC 导出为 LUN。当前的 zpool 很小,只有两个 1TB 镜像磁盘,而 zvol 总共 750GB。如果我突然将 zpool 的大小扩展到 12 个 1TB 磁盘,我相信 zvol 仍然会有效地“安置”在前两个主轴上。

鉴于更多主轴 = 更多 IOPS,我可以使用什么方法将 zvol 在所有 12 个主轴上“重新分配”以利用它们?

答案1

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

答案2

没有理由只将 zvol 存储在初始设备上。如果扩大池,ZFS 将跨越所有可用底层设备上的更新数据。ZFS 没有固定的分区。

答案3

这是 ewwhite 回答的“延续”:

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

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

只需安装 PHP CLI 工具sudo apt-get install php5-cli并运行脚本,将池数据的路径作为第一个参数传递即可。例如

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

理想情况下,您应该对池中的所有数据运行两次脚本。第一次运行将平衡驱动器利用率,但单个文件将被过度分配给最后添加的驱动器。第二次运行将确保每个文件在驱动器之间“公平”分布。我说公平而不是均匀,因为只有当您不混合驱动器容量时才会均匀分布,就像我使用不同大小对(4TB 镜像 + 3TB 镜像 + 3TB 镜像)的 raid 10 一样。

使用脚本的原因

  • 我必须“就地”解决问题。例如,我无法将数据写入另一个系统,在此处将其删除,然后再将其全部写回。
  • 我的池已填充超过 50%,因此在删除原始文件系统之前,我无法一次复制整个文件系统。
  • 如果只有某些文件需要良好运行,那么可以对这些文件运行两次脚本。然而,第二次运行只是有效的如果第一次运行成功平衡了驱动器的利用率。
  • 我有很多数据,希望能够看到正在取得进展的迹象。

如何判断驱动器利用率是否已达到均衡水平?

在一段时间内(例如iostat -m 5)使用 iostat 工具并检查写入。如果它们相同,则说明您已实现均匀分布。下面的屏幕截图中它们并不完全均匀,因为我在 RAID 10 中运行一对 4TB 和两对 3TB 驱动器,因此两个 4 的写入量会略多一些。 在此处输入图片描述

如果您的驱动器利用率“不平衡”,则 iostat 将显示更像以下屏幕截图的内容,其中新驱动器的写入不成比例。您还可以判断它们是新驱动器,因为读取为 0,因为它们上没有数据。 在此处输入图片描述

该脚本并不完美,只是一种变通方法,但它对我来说暂时是有效的,直到 ZFS 有一天实现像 BTRFS 那样的重新平衡功能(祈祷)。

答案4

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

相关内容