我很好奇 RAID5 和 RAID5 重建是否存在隐藏的复杂性。
我的理解是(在 3 磁盘阵列中)重建将直接计算磁盘 1 和 2 的奇偶校验并将该奇偶校验写入磁盘 3(或替换的任何磁盘)。如果真的这么简单,如果没有实际更换磁盘,重建是否会导致数据丢失?
例如...“假设”,如果我配置了我的 raid 阵列,所有磁盘和原始数据仍然存在,但设置了错误的对称性、错误的条带大小、错误的磁盘顺序等,然后由于某种原因我重新同步或重建数组,数据会丢失(甚至根本改变)吗?
答案1
如果您从 RAID 中删除一个磁盘,但 RAID 仍然可以工作,因为丢失的磁盘已被冗余覆盖,然后您添加了替换磁盘,则添加的磁盘将被覆盖。不存在数据丢失,因为您在设备上看到的数据/dev/mdX
不会改变。但是,如果您在添加的磁盘上有重要数据,则会因覆盖而丢失。
所以这完全取决于剩余磁盘上的数据是否完好。
设置错误的对称性、错误的条带大小、错误的磁盘顺序等
尽量避免mdadm --create
恢复 RAID。这是最糟糕的选择,因为它很容易出错(如此多的变量,如磁盘顺序、块大小、raid 级别、raid 布局、元数据版本、数据偏移量等,并且mdadm
这些变量的默认值会随着时间的推移而变化,因此您必须正确指定所有这些)。
如果必须使用它,则应该以只读模式进行:元数据区域的备份、快照层、丢失磁盘、--assume-clean
以防止其同步,...
不良同步是否会破坏或更改您的数据取决于您设置错误的严重程度。基本上在 RAID5 中,只要所有磁盘完好无损且所有奇偶校验数据正确,您就可以与任何磁盘顺序和任何块大小同步。同步本身不会造成任何损害。异或就是异或,无论顺序或大小,结果都是一样的。
# truncate -s 128M a b c
# losetup -f --show a b c
/dev/loop0
/dev/loop1
/dev/loop2
# mdadm --create /dev/md42 --level=5 --chunk=512 --raid-devices=3 /dev/loop0 /dev/loop1 /dev/loop2
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md42 started.
# shred -n 1 /dev/md42
# mdadm --stop /dev/md42
mdadm: stopped /dev/md42
# dd if=/dev/loop0 bs=1M skip=8 | md5sum
98f23e09198f7943e27030e8e0f9bc30 -
# dd if=/dev/loop1 bs=1M skip=8 | md5sum
90ef43c60e540b930c6db8dae831f8ab -
# dd if=/dev/loop2 bs=1M skip=8 | md5sum
d010c8ae141fadc3347e8ed319b76db9 -
# mdadm --create /dev/md42 --level=5 --chunk=64 --raid-devices=3 /dev/loop2 /dev/loop0 /dev/loop1
mdadm: /dev/loop2 appears to be part of a raid array:
level=raid5 devices=3 ctime=Fri Sep 5 11:35:51 2014
mdadm: /dev/loop0 appears to be part of a raid array:
level=raid5 devices=3 ctime=Fri Sep 5 11:35:51 2014
mdadm: /dev/loop1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Fri Sep 5 11:35:51 2014
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md42 started.
# mdadm --wait /dev/md42
# mdadm --stop /dev/md42
mdadm: stopped /dev/md42
# echo 3 > /proc/sys/vm/drop_caches
# dd if=/dev/loop0 bs=1M skip=8 | md5sum
98f23e09198f7943e27030e8e0f9bc30 -
# dd if=/dev/loop1 bs=1M skip=8 | md5sum
90ef43c60e540b930c6db8dae831f8ab -
# dd if=/dev/loop2 bs=1M skip=8 | md5sum
d010c8ae141fadc3347e8ed319b76db9 -
但是,如果集合中缺少一个磁盘,或者集合中有多余的磁盘;或者如果您更改其他内容,例如其中一个磁盘上的分区偏移量;或者您使用不同的 RAID 级别,它不再以这种方式工作,并且您会丢失同步写入的任何内容。能否从那里恢复取决于其他磁盘上的数据是否仍有冗余来覆盖被覆盖的数据。没有简单的解决方案可以从这种情况中恢复。