我意外地将不匹配的 raidz1 添加到现有池中。是的,我指定了“-f”来执行此操作,但我原本以为会出于其他原因使用“-f”,因此没有注意。
不管怎样... 有多糟糕?我真的只是需要池中的额外空间,并希望这些空间是多余的。池子看起来像这样:
NAME STATE READ WRITE CKSUM
pool_02c ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
c0t5000C500B4AA5681d0 ONLINE 0 0 0
c0t5000C500B4AA6A51d0 ONLINE 0 0 0
c0t5000C500B4AABF20d0 ONLINE 0 0 0
c0t5000C500B4AAA933d0 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
c0t5000C500B0889E5Bd0 ONLINE 0 0 0
c0t5000C500B0BCFB13d0 ONLINE 0 0 0
c0t5000C500B09F0C54d0 ONLINE 0 0 0
我读过关于这种情况的另一个问题,它指出“性能和空间效率(即通过非最优填充)都会受到影响”,但这有点模糊,我希望有人可以提供更详细的细节。
从池使用角度来看,放在 vdev raidz1-0 磁盘上的数据在该 vdev 中不是冗余的吗?放在 raidz1-1 中的数据在该 vdev 中不是冗余的吗?如果是这样,性能不是与特定 vdev 有关吗?
填充在这里起什么作用?它将如何影响存储容量?即它是否会导致分配更多空间,例如,我每写入 1M,就会用掉 1.2M?
我并不太关心这个池的性能,但这种配置如何影响读/写速度?我希望每个 vdev 都按照其各自设备的速度运行,那么 vdev 复制差异会对此产生什么影响?
仅供参考,这是在 Solaris 11.4 系统上。我尝试使用以下命令删除 vdev:
zpool remove pool_02c raidz1-1
但我收到了错误:
cannot remove device(s): not enough space to migrate data
这看起来很奇怪,因为我只是添加了它并且还没有向池中写入任何内容。
我可以接受它,因为它似乎给了我所期望的空间,但我只是想更好地了解我将要与之共存的魔鬼。
答案1
简短回答:虽然稍微不太理想,但您的池布局并没有缺少什么重大的东西——这是一个合法的配置。
长答案:与传统 RAID 阵列相比,RAIDZ vdev 的数据存储方式不同。在 RAIDZ vdev 中,由于 a) 填充和 b) 动态条带宽度,可能会丢失一些空间。我建议您阅读(如果需要,请多次阅读)这篇非常有用的文章无论如何,有两点值得注意:
分配发生在
ashift * (redundancy+1)
粒度上(即:对于ashift=12
RAIDZ vdev,分配粒度将是 4K*(1+1) 块。分配 1、3 或 5 个块是不可能的;而是分配 2、4 或 6 个。这是一个有趣的交互recordsize
:例如,对于所有 4K 块写入的极端情况,RAIDZ1 具有与镜像 vdev 相同的空间效率(即:1 个数据 + 1 个奇偶校验块)条带大小是动态的,这意味着单个
recordsize
数据块至少会包含多个奇偶校验块(可能包含多个奇偶校验块,具体取决于 vdev)。这意味着最大动态条带大小 (recordsize / ashift
)、文件大小和 vdev 宽度之间的交集将导致写入不同数量的不同奇偶校验块
由于上述第 2 点,不平等的 vdev 宽度会导致两个 vdev 的空间效率不同。
然而,你应该避免在这种计算上投入过多的精力:启用压缩将要以几乎总是克服上述规则所描述的最佳空间效率点的方式改变有效的物理分配大小。
因此,如果您有 3 个(且只有 3 个)磁盘要添加到 RAIDZ vdev,那么您做了正确的事。也就是说,当心使用时-f
关于 vdev 删除,我无法评论,因为我不知道 Solaris 是如何管理的。