我使用 SSD 和 NVME RAID1 阵列来存储大部分虚拟机磁盘。超过 75% 的数据为零(预先分配的图像、可用空间)。
如果磁盘出现故障并被替换,重建会将所有数据复制并写入替换磁盘,这会导致 NVME 中的热节流,并且我认为 SSD/NVME 上的磨损会更多。有没有办法将重建配置为首先比较两个磁盘中的数据,然后仅在需要时才写入新磁盘?
或者 SSD/NVME 芯片是否应该检查数据是否只是零,如果目标块尚未写入(读取时给出零),它只会丢弃数据而不浪费写入周期?或者,如果有任何目标数据,是否应该修剪块以产生零?
我发现了一个旧线程https://www.spinics.net/lists/raid/msg57529.html 但它没有提供答案。
我尝试了一种解决方法,但我认为它很难看,而且 RAID 必须离线。
mdadm --fail /dev/md0 /dev/sde
mdadm -r /dev/md0 /dev/sde
(替换/dev/sde)
mdadm -S /dev/md0
ddpt if=/dev/sdd of=/dev/sde verbose=1 oflag=sparing
mdadm -C -v /dev/md0 --assume-clean -l 1 -n 2 /dev/sdd /dev/sde
对于比较写入 RAID1 重建有什么想法吗?谢谢。
答案1
最简洁的答案是不。
md 驱动程序针对性能进行了调整。它有一个简单的脏地图来保持 raid 1 成员同步。
所以如果一个成员失败了,整个地图就会变脏。由于 md 只是基于块的,因此它不关心块的内容,它只是复制块并清除这些块的脏位。
KISS原则_保持简单愚蠢。其他任何事情都会处于更高的水平。
如果您愿意,可以将 drbd 与两个本地成员一起使用,而不是 md raid1。 DRBD 提供了在同步之前进行验证的方法。
答案2
因此,在 MDRAID1 中进行比较写入重建的唯一方法(除了通过例如 ddpt 离线同步之外)似乎是修复(更换磁盘时必须停止并重新配置阵列,好磁盘必须首先进入新阵列)成为ID 0和数据源)
mdadm -C -v /dev/md0 -l 1 -n 2 /dev/sdd /dev/sde
mdadm /dev/md0 -f /dev/sdd -r /dev/sdd
mdadm -S /dev/md0
mdadm -C -v /dev/md0 -l 1 -n 2 --assume-clean /dev/sde /dev/sdd
echo repair > /sys/block/md0/md/sync_action
它似乎也适用于多个镜子:
mdadm -C -v /dev/md0 -l 1 -n 3 /dev/sdd /dev/sde /dev/sdf
mdadm /dev/md0 -f /dev/sde -f /dev/sdf -r /dev/sde -r /dev/sdf
mdadm -S /dev/md0
mdadm -C -v /dev/md0 -l 1 -n 3 --assume-clean /dev/sdd /dev/sde /dev/sdf
echo repair > /sys/block/md0/md/sync_action
我还尝试了在不停止的情况下重塑阵列的想法(RAID0 -> RAID1_or_RAID10 -> RAID0),但我没有在 RAID10 中看到比较写入(显然用于每个原始 linux-raid 线程的 RAID10),并且事情不起作用我期望在 RAID0 -> RAID1 转换中。
完整副本,但有效:
mdadm -C -v /dev/md0 -l 0 -n 2 /dev/sdd /dev/sde
mdadm -G /dev/md0 -n 4 -l 10 -a /dev/sdf -a /dev/sdg
mdadm /dev/md0 -f /dev/sdf -f /dev/sdg -r /dev/sdf -r /dev/sdg
mdadm -G /dev/md0 -n 2 -l 0
完整副本,也有效:
mdadm -C -v /dev/md0 -l 0 -n 3 /dev/sdd /dev/sde /dev/sdf
mdadm -G /dev/md0 -n 6 -l 10 -a /dev/sdg -a /dev/sdh -a /dev/sdi
mdadm /dev/md0 -f /dev/sdg -f /dev/sdh -f /dev/sdi -r /dev/sdg -r /dev/sdh -r /dev/sdi
mdadm -G /dev/md0 -n 3 -l 0
但这里存在问题:
mdadm -C -v /dev/md0 -l 1 -n 2 /dev/sdd /dev/sde
mdadm /dev/md0 -f /dev/sde -r /dev/sde
mdadm -G /dev/md0 -n 1 -l 0
无法更改 RAID1->RAID0 转换中的磁盘数量
mdadm -G /dev/md0 -l 0
但没有 -n 1 它可以工作
mdadm -G /dev/md0 -l 1 -n 2 --force -a /dev/sde
请求了不可能的级别更改
mdadm -C -v --force /dev/md0 -l 0 -n 1 /dev/sdd
mdadm -G /dev/md0 -l 1 -n 2 --force -a /dev/sde
请求了不可能的级别更改