我知道在 ZFS 上,扩展 RAID-Z(或 RAID-Z2 或 RAID-Z3)vdev 的唯一方法是用更大的磁盘替换磁盘;无法更改几何结构。但是,是否有可能在不降低阵列性能的情况下做到这一点?
例如,假设我有一个包含 4 个磁盘的 RAID-Z 阵列:1 个 2TB 和 3 个 1TB 组成了 3 TB 可用空间。在所有驱动器正常工作的情况下,我又购买了 3 个 2TB 以扩大阵列(可用空间达到 6 TB)。如果我一次移除一个 1 TB 并将其替换为 2 TB,以强制重新镀银,那么我就会不必要地反复降低阵列的性能,并增加在此过程中发生故障的风险。
我希望可以在更换每个磁盘之前对其进行镜像。即,将第一个 2 TB 添加到备用托架,将第一个 1 TB 磁盘镜像到其中,然后移除 1 TB,并将 2 TB 放入移除的驱动器插槽中;然后对第二个和第三个 1 TB 磁盘重复此操作。这甚至可能消除重新镀银的需要 - 或者无论如何重新计算奇偶校验。
这种事可能吗?
答案1
您提出的解决方案是可行的,但存在一些实质性的缺点:
zpool import -o readonly=on ${YOUR_ZFS_POOL}
在磁盘克隆过程中,您无法向池中写入任何内容 ( )。- 您必须
zpool export ${YOUR_ZFS_POOL}
为切换出的每个磁盘导出池()。
克隆 vdev 磁盘后,您必须:
- 导出池(
zpool export ${YOUR_ZFS_POOL}
)。 - 销毁(
zpool labelclear ${OLD_DISK_DEVICE}
)或物理移除旧磁盘。
警告:如果您删除磁盘,则无法撤消。 - 如果有必要,在新磁盘上扩大 vdev 分区。
- 导入池(
zpool import ${YOUR_ZFS_POOL}
)。
警告:此后无法撤消。旧磁盘无法再在同一池中联机。 - 扩展磁盘(
zpool online -e ${NEW_DISK_VDEV}
)。
对每个要更换的磁盘重复这些步骤后,新的容量就会生效。
ZFS 的内置替换功能旨在避免上一节中描述的所有额外复杂性。如果您担心在重新同步期间损坏 RAID-Z zpool,也许您应该:
- 已创建具有更多冗余的池(RAID-Z2、RAID-Z3),或者
- 在扩大阵列的同时,将池备份到其他地方。
此外,如果磁盘确实出现故障,您还会对 RAID-Z 感到满意吗?
如果您的预算紧张,并且真的买不起备份数据集的地方,那么执行您的计划确实更安全,因为克隆将是事务性的全有或全无操作,但请记住您的池将在一段时间内处于只读或离线状态,并且您还面临在克隆后步骤中犯错误的风险。
使用zpool replace
会:
- 速度更快*,因为只有使用的存储会被复制,而不是整个块设备
*如果你有顺序清理/重新镀银功能 - 没有停机时间,因为在重新同步过程中池将完全正常运行
- 消除人为错误,因为你将使用 ZFS 预期的更换磁盘工作流程