我不小心将不匹配的 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 相关吗?
填充在这里发挥作用,这将如何影响存储容量?IE。是否会导致分配更多空间,就像我每写入 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
这看起来很奇怪,因为我实际上只是添加了它并且没有向池中写入任何内容。
我可以接受它,因为它似乎给了我我所期望的空间,但我只是想更好地理解我将与之共处的魔鬼。
简短的回答:虽然有点次优,但您的泳池布局在很大程度上并不缺乏 - 这是一个合法的配置。
长答案:与传统 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 如何管理它。