我有一个 3x1TB ZFS (ZoL) RAIDZ1。一个驱动器发生故障。我正在用 4TB 磁盘替换它。
$ sudo zpool replace pool <old guid> /dev/disk/by-id/<new id>
cannot replace <old guid> with /dev/disk/by-id/<new id>:
new device has a different optimal sector size;
use the option '-o ashift=N' to override the optimal size
$ zdb -C | grep ashift
ashift: 9
$ sudo zpool replace pool <old guid> /dev/disk/by-id/<new id> -o ashift=9
这行得通。阵列现在正在重新同步。但是,老实说,我不了解此设置的影响。我只是想尽快更换故障磁盘,并在不久的将来将其他1TB磁盘更换为4TB。但事后看来,对齐移位为 2^9 的性能被描述为可怕。
我了解此设置是不可变的。更换其他两个磁盘后,我无法将ashift
值更改为 2^12,如果我理解正确,建议用于 4TB 磁盘。
我刚刚是在脚上开枪吗?如何最好地进行?我可以禁用
autoexpand
并在新阵列上创建一个新卷,ashift=12
并将旧卷复制到同一驱动器上的新卷吗?这是可能的和值得推荐的吗?
选择一个太小的
ashift
值本质上会导致磁盘在您执行写入时在内部执行读取-修改-写入。您是否会注意到性能影响取决于您的使用模式——您是否进行了大量同步写入并且需要非常高的性能?如果答案是肯定的,您会注意到差异,但如果不是,您可能不会。异步写入不会受此影响,因为 ZFS 将这些写入批处理到大型多块更新中,这意味着不会有很多子块写入(因为只有大型连续写入中的第一个和最后一个块可以是子块-堵塞)。切换到 4KiB 块的主要缺点是压缩效果不佳,因为它只能将压缩块四舍五入到最接近的 4KiB 而不是最接近的 512B。如果这对您而言比高端写入性能更重要,则可以保持原样。
如果写入性能真的很重要,您应该重建池。我认为最简单的方法是对以您想要的方式配置的新池执行
zfs send
/ 。zfs receive
关于您关于如何避免一次为新池购买所有硬件并执行干净
send
/的具体建议receive
:由于您已经使用ashift
9 写入数据,因此无法将具有ashift
12 的磁盘添加到池中(ZFS 不会能够寻址4KiB对齐的磁盘上512B对齐的块;ashift
是顶级 vdev 上的设置,而不是磁盘)——因此您看到了警告。可以在新驱动器的后半部分创建一个新池,并将第一个池中的所有数据复制到其中,但其冗余与原始池不同,因为您不能从一个磁盘的一个分区中构建一个 RAIDZ1。也许您可以复制到没有冗余的第二个池,然后将原始池中的磁盘/分区重新配置为正确的ashift
/冗余,然后将所有数据复制回来。