如何在zfs中重新平衡数据? (确保数据在所有条纹镜子之间传播)

以一个条纹镜像(Raid 10)为例,如果两个磁盘扩展到四个,那么两个磁盘之间的数据如何在两个镜子之间“重新平衡”(展开)呢?

也就是说,如何将写入一个镜像的文件写入两个镜像以利用条带化磁盘?

只有新写入的(附加的)数据在所有当前活动的vdevs之间被拆分,ZFS中没有显式的重新平衡操作。

两种可能的解决方

  1. 等到所有的旧数据再次写入(因为CoW,这可能需要很长时间,最糟糕的情况是将磁盘完全写入的时间加倍)。
  2. 删除所有数据并重新写入(zfs send / recv有助于将所有数据从池中取出并返回,而不会丢失任何东西)。 这不必一次完成,而且可以在同一个池中完成。

更确切地说,我会select第二个解决scheme,并在系统负载较低的时间(例如晚上)分别传输每个文件系统:

  • 采取适当大小的文件系统(和decendant文件系统,recursion)的快照( zfs snapshot -r
  • 使用zfs send | zfs recv zfs send | zfs recv用适当的选项将快照发送到新创build的临时文件系统(如果空间允许,可以在同一个池中); 这个文件系统应该和旧的一样在层次结构的相同位置上
  • 复制完成后(可能需要一些时间,因为磁盘必须读写), zfs destroy旧快照和旧文件系统
  • zfs rename临时系统zfs rename为旧名称
  • 使用zfs mount检查和更改安装点,重新安排replace文件系统的先前情况
  • 重复,直到所有的文件系统被移动