简而言之:我可以在两个独立的 zpools 之间共享一个磁盘吗?
长:我想要一个 raidz2 阵列,但我一次买不起。我可能的解决方案是从两个驱动器开始。我将仅使用每个磁盘一半的容量创建一个镜像。当我可以负担得起更多驱动器时,我将使用新驱动器和初始磁盘上 50% 的未使用空间创建一个带有单个 raidz2 vdev 的新 zpool。然后我计划将数据从一个 zpool 复制到另一个 zpool,删除包含镜像的 zpool 并使用 raidz2 vdev 扩展 zpool。
这有用吗?
如能提供链接和参考资料将不胜感激
答案1
- 是的,您可以创建一个由两个分区之间的镜像 vdev 组成的池。
- 是的,您可以拥有两个池,每个池使用自己的分区共享一个磁盘。
- 是的,当增加 raid-z2 vdev 中所有磁盘的大小时,可用容量就会增加。
但你不应该这么做。ZFS 最好是将整个磁盘交给它,尽管分区“工作”,但使用整个磁盘会让你的生活更轻松/更好。如果你真的想在将来进行镜像 -> raid-z2 池转换,并准备在镜像使用率不超过 50% 的范围内生活,我有一个替代想法:
- 购买 2 个磁盘(例如 2x2TB)
- 创建镜像 zpool:
zpool create yourPool mirror cXt1d0 cXt2d0
- 购买 3 个以上相同大小的磁盘。(例如 4x2TB)
- 创建一个新的文件系统:
zfs create yourPool/fake
- 创建两个稀疏文件:
mkfile -n 1TB /yourpool/fake/fakehda
- 创建双奇偶校验 zpool:
zpool create yourNewPool raidz2 cXt3d0 cXt4d0 cXt5d0 cXt6d0 /yourpool/fake/fakehda /yourpool/fake/fakehdb
- zfs 将您的文件系统从一个池发送/接收到另一个池。
- 从镜像中分离一个磁盘
zpool detach yourPool cXt1d0
- 用真正的磁盘替换假磁盘
zpool replace yourNewPool /yourpool/fake/fakehda cXt1d0
- 等待重新同步完成。使用 监控进度
zpool status yourNewPool
。 - 当重新镀银完成后,关闭镜像
zpool destroy yourPool
- 重新使用第二个旧磁盘
zpool replace yourNewPool /yourpool/fake/fakehda cXt2d0
在整个过程中,即使任何一个磁盘发生故障,您也能够保证数据不丢失。
答案2
当然可以,软件 RAID 的优点之一就是灵活性。然而,普遍的看法是你不能这样做或不应该这样做,为什么?因为这是硬件 RAID 用户的思维模式,他们没有选择以那种方式工作,所以他们继续以他们一贯的方式工作。
我还应该澄清,不使用整个磁盘“不会”阻止写入缓存在设备上工作,我不仅从经验中知道这一点,而且它也在源代码中。
默认情况下,许多允许您在安装程序中使用 ZFS 的操作系统,我所知道的所有操作系统都“不”分配整个磁盘,而是对磁盘进行分区并将池放在分区上,Proxmox 甚至允许您指定分区的大小。
但也存在缺点,例如,如果运行的scrub -a
话,一个磁盘上会运行多个擦洗,这很糟糕,因此请错开擦洗,这也可能会导致管理多个池时出现混乱。
我将提供一个您可能想要执行此操作的示例。
假设您有两个 8TB 磁盘,并且还有两个 3TB 磁盘,您不需要花钱购买额外的两个 8TB 磁盘,并且您想要 raidz2 冗余,那么您该怎么做?
您可以在所有 4 个磁盘上创建一个 3TB 的分区,并将其设置为 4 设备 raid2 vdev,它将具有 6TB 的容量。
两个 8TB 磁盘大约有 5TB 可用空间,您可以暂时将其留空,也可以选择在其上添加 5TB 镜像。然后,以后您可以停用 5TB 镜像并替换两个 3TB 磁盘,以将 raidz2 扩展到 16TB。
我喜欢软件 raid 的这种灵活性,它有点突破常规,因此很具吸引力。
不过,您几乎肯定必须手动进行这样的配置,因此请熟悉分区编辑器和zpool
命令的使用。