스트라이프 크기가 ​​잘못되고 디스크 장애가 없는 Raid 5 재구축 - 데이터가 손실됩니까?

스트라이프 크기가 ​​잘못되고 디스크 장애가 없는 Raid 5 재구축 - 데이터가 손실됩니까?

RAID5 및 RAID5 재구축에 숨겨진 복잡성이 있는지 궁금합니다.

제가 이해한 바에 따르면(3개의 디스크 어레이에서) 재구축은 디스크 1과 2의 패리티를 직접 계산하고 해당 패리티를 디스크 3(또는 교체된 모든 디스크)에 기록합니다. 정말 그렇게 간단한 경우 실제로 디스크를 교체하지 않고도 재구축을 하면 데이터가 손실되나요?

예를 들어... 모든 디스크와 원시 데이터가 그대로 있는 RAID 어레이를 구성했지만 잘못된 대칭, 잘못된 스트라이프 크기, 잘못된 디스크 순서 등을 설정한 경우 "가정"합니다. 그러면 어떤 이유로 어레이를 다시 동기화하거나 재구축하는 경우 , 데이터가 손실되나요(또는 아예 변경되나요?)

답변1

RAID에서 디스크를 제거했지만 누락된 디스크를 중복으로 덮어쓰기 때문에 RAID가 계속 작동하는 경우, 교체 디스크를 추가하면 추가된 디스크가 덮어쓰여집니다. 장치에 표시되는 데이터는 /dev/mdX변경되지 않으므로 데이터 손실이 없습니다 . 그러나 추가된 디스크에 중요한 데이터가 있는 경우 덮어쓰기로 인해 해당 데이터가 손실됩니다.

따라서 모든 것은 나머지 디스크의 데이터가 손상되지 않았는지 여부에 따라 달라집니다.

잘못된 대칭 설정, 잘못된 스트라이프 크기, 잘못된 디스크 순서 등

mdadm --createRAID 복원을 피하십시오 . 이것은 오류가 발생하기 쉬우므로 최악의 옵션입니다(디스크 순서, 블록 크기, RAID 수준, RAID 레이아웃, 메타데이터 버전, 데이터 오프셋 등과 같은 변수가 너무 많고 mdadm이러한 변수의 기본값은 시간이 지남에 따라 변경됨 ). 이므로 모두 올바르게 지정해야 합니다.)

꼭 사용해야 한다면 읽기 전용 모드로 사용해야 합니다. 메타데이터 영역 백업, 스냅샷 레이어, --assume-clean동기화를 방지하기 위한 누락된 디스크 등...

잘못된 동기화로 인해 데이터가 손상되거나 변경되는지 여부는 설정 오류의 심각도에 따라 다릅니다. 기본적으로 RAID5에서는 모든 디스크가 손상되지 않고 모든 패리티 데이터가 올바른 한 모든 디스크 순서 및 블록 크기와 동기화할 수 있습니다. 동기화 자체는 해를 끼치 지 않습니다. XOR은 XOR이므로 순서나 크기에 관계없이 결과는 동일합니다.

# 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 레벨을 사용하는 경우에는 더 이상 해당 디스크가 작동하지 않습니다. 이런 식으로 작동하면 동기적으로 작성된 모든 내용이 손실됩니다. 그곳에서 복구할 수 있는지 여부는 덮어쓴 데이터를 덮어쓸 수 있는 다른 디스크에 여전히 중복이 있는지 여부에 따라 달라집니다. 이 상황에서 쉽게 복구할 수 있는 방법은 없습니다.

관련 정보