Greg Asked: 2017-07-04 22:21:25 +0800 CST2017-07-04 22:21:25 +0800 CST 2017-07-04 22:21:25 +0800 CST 如何在 zfs 中“重新平衡”数据?(确保数据分布在所有条带镜像中) 772 以条带镜像(Raid 10)为例,如果将两个磁盘扩展为四个,如何将两个磁盘的数据在两个镜像之间“重新平衡”(分散)? 也就是说,如何将写入一个镜像的文件写入两个镜像以利用条带磁盘? linux 2 个回答 Voted Best Answer user121391 2017-07-04T23:21:44+08:002017-07-04T23:21:44+08:00 只有新写入(附加)的数据会在所有当前活动的 vdev 之间拆分,ZFS 中没有显式的重新平衡操作。 两种可能的解决方案: 等到所有旧数据被再次写入(因为 CoW,这可能需要很长时间,在最坏的情况下,是完全写入磁盘所需时间的两倍)。 删除所有数据并重新写入(zfs send/recv 有助于将所有数据从池中取出并返回而不会丢失任何内容)。这不必一次性完成,可以在同一个池中完成。 更准确地说,我会选择第二种解决方案,并在系统负载较低的时候(例如晚上)分别传输每个文件系统: 拍摄一个zfs snapshot -r大小合适的文件系统(以及递归文件系统)的快照 ( ) 使用zfs send | zfs recv适当的选项将快照发送到新创建的临时文件系统(如果空间允许,可以在同一个池中);此文件系统应与旧文件系统位于层次结构中的同一位置 复制完成后(可能需要一些时间,因为磁盘要读写),zfs destroy旧快照和旧文件系统 zfs rename旧名称的临时系统 检查和更改挂载点zfs mount,重新安排替换文件系统的先前情况 重复直到所有文件系统都被移动 jason_uruguru 2019-10-30T14:04:40+08:002019-10-30T14:04:40+08:00 可能的第三种解决方案(如 SirMaster 在此 FreeNAS 论坛帖子中提到的): 将新磁盘添加到 zpool 将许多文件复制到另一个新的 /mnt/pool/temp/ 目录 删除原始文件:rm -rf original/ 重命名目录:mv temp/ original/ 这是有效的,因为 ZFS 将按比例将写入写入具有最多可用空间的 vdev,在这种情况下是空的全新驱动器。(从 0.7 开始,zfs 将倾向于使用更快的驱动器进行写入,但假设您的 2 个新驱动器与原始驱动器具有相同或更高的性能) 它可能比 慢zfs send | zfs recv,但更简单,因为您不必创建/销毁快照。 您可以在zpool list -v前后运行以查看每个 vdev 利用率。 此外,找到了一个 php脚本,它可以逐个文件地执行复制/删除/重命名过程。这与几年前类似(但 zvol)问题的答案相关联。(没有亲自测试这个脚本)
只有新写入(附加)的数据会在所有当前活动的 vdev 之间拆分,ZFS 中没有显式的重新平衡操作。
两种可能的解决方案:
更准确地说,我会选择第二种解决方案,并在系统负载较低的时候(例如晚上)分别传输每个文件系统:
zfs snapshot -r
大小合适的文件系统(以及递归文件系统)的快照 ( )zfs send | zfs recv
适当的选项将快照发送到新创建的临时文件系统(如果空间允许,可以在同一个池中);此文件系统应与旧文件系统位于层次结构中的同一位置zfs destroy
旧快照和旧文件系统zfs rename
旧名称的临时系统zfs mount
,重新安排替换文件系统的先前情况可能的第三种解决方案(如 SirMaster 在此 FreeNAS 论坛帖子中提到的):
rm -rf original/
mv temp/ original/
这是有效的,因为 ZFS 将按比例将写入写入具有最多可用空间的 vdev,在这种情况下是空的全新驱动器。(从 0.7 开始,zfs 将倾向于使用更快的驱动器进行写入,但假设您的 2 个新驱动器与原始驱动器具有相同或更高的性能)
它可能比 慢
zfs send | zfs recv
,但更简单,因为您不必创建/销毁快照。您可以在
zpool list -v
前后运行以查看每个 vdev 利用率。此外,找到了一个 php脚本,它可以逐个文件地执行复制/删除/重命名过程。这与几年前类似(但 zvol)问题的答案相关联。(没有亲自测试这个脚本)