mdadm 복구 단일 청크/섹터

mdadm 복구 단일 청크/섹터

RAID에는 mdadm을 사용하고 비트로트 감지에는 btrfs를 사용하여 NAS를 구축하고 싶습니다. 나는 3개의 1TB 디스크를 mdadm과 RAID5로 결합하고 그 위에 btrfs를 추가하는 상당히 기본적인 설정을 가지고 있습니다.

나는 mdadm이 bitrot을 복구할 수 없다는 것을 알고 있습니다. 불일치가 있는 경우에만 알려주지만 어떤 데이터가 정확하고 어떤 데이터가 잘못된지는 알 수 없습니다. bitrot을 시뮬레이션한 후 mdadm에 md0을 복구하라고 지시하면 항상 패리티가 다시 작성됩니다. Btrfs는 체크섬을 사용하여 어떤 데이터에 결함이 있는지 알지만 패리티를 볼 수 없기 때문에 데이터를 복구할 수 없습니다.

그러나 btrfs 스크럽을 실행하고 syslog를 읽어 체크섬과 일치하지 않는 데이터의 오프셋을 얻을 수 있습니다. 그런 다음 md0의 데이터 시작 오프셋(2048 * 512), 청크 크기(512K) 및 레이아웃(왼쪽 대칭)을 알고 있으므로 이 오프셋을 디스크와 해당 디스크의 오프셋으로 변환할 수 있습니다. 레이아웃은 첫 번째 레이어의 패리티가 세 번째 디스크에 있고, 두 번째 레이어에 두 번째 디스크가 있고, 세 번째 레이어에 첫 번째 디스크가 있음을 의미합니다.

이 모든 데이터와 디스크 형식 지식에 대한 추가 btrfs를 결합하면 어떤 디스크의 어느 덩어리가 결함이 있는지 정확하게 계산할 수 있습니다. 그러나 mdadm에게 이 특정 청크를 복구하도록 지시하는 방법을 찾을 수 없습니다.

나는 이미 dd 명령을 사용하여 패리티와 결함이 있는 청크를 교환한 다음 mdadm으로 복구를 시작한 다음 다시 교환하는 스크립트를 작성했습니다. 그러나 이것은 좋은 해결책이 아니며 mdadm이 이 섹터를 불량으로 표시하고 다시는 사용하지 마세요. 부패하기 시작했기 때문에 다시 부패할 확률이 높습니다.

내 질문은 다음과 같습니다mdadm에게 단일 청크(패리티가 아님)를 복구하고 디스크 섹터를 불량으로 표시하도록 지시할 수 있는 방법이 있습니까? 읽기 IO 오류가 발생했을 수도 있나요?

(그리고 나는 ZFS가 이 모든 것을 스스로 할 수 있다는 것을 알고 있지만 ECC 메모리를 사용하고 싶지 않습니다.)

편집하다:이것질문/답변은 btrfs RAID6이 어떻게 불안정하고 ZFS가 어떻게 훨씬 더 안정적이고 사용 가능한지에 관한 것입니다. 그것은 mdadm을 사용하여 알려진 단일 결함 청크를 복구하는 방법에 대한 내 질문을 해결하지 않습니다.

답변1

mdadm에게 이 특정 청크를 복구하라고 지시하는 방법을 찾을 수 없습니다.

그 이유는 자동 데이터 손상이 있을 때 md에는 어떤 블록이 자동으로 손상되었는지 알 수 있는 정보가 충분하지 않기 때문입니다.

나는 당신이 내 글을 읽도록 초대합니다질문 #4(" md잘못된 데이터가 있는 장치를 계속 사용하는 이유는 무엇입니까?")에 대한 답변은 여기에서 확인하세요., 이에 대해 더 자세히 설명합니다.

제안된 레이아웃의 상황을 더욱 악화시키려면,패리티 블록이 자동 데이터 손상으로 고통받는 경우 위의 Btrfs 레이어는 이를 볼 수 없습니다! 해당 데이터 블록이 있는 디스크에 오류가 발생하고 이를 교체하려고 하면 md는 손상된 패리티를 사용하여 데이터를 되돌릴 수 없게 손상시킵니다. 해당 디스크에 오류가 발생한 경우에만 Btrfs가 손상을 인식하지만 이미 데이터가 손실되었습니다.

이는 어레이의 성능이 저하되지 않는 한 md가 패리티 블록에서 읽지 않기 때문입니다.


그렇다면 mdadm에게 단일 청크(패리티가 아님)를 복구하고 디스크 섹터를 불량으로 표시하도록 지시할 수 있는 방법이 있습니까? 읽기 IO 오류가 발생했을 수도 있나요?

하드디스크가 스스로 파악한 배드섹터에 대해서는 md가 배드섹터를 식별해 주기 때문에 md가 쉽게 대처할 수 있다.

를 사용하여 기술적으로 불량 섹터를 만들 수 있지만 hdparm --make-bad-sector, 자동 데이터 손상의 영향을 받은 블록이 있는 디스크를 어떻게 알 수 있습니까?

다음의 간단한 예를 고려해 보세요.

패리티 공식:PARITY = DATA_1 + DATA_2

+--------+--------+--------+
| DATA_1 | DATA_2 | PARITY |
+--------+--------+--------+
|      1 |      1 |      2 | # OK
+--------+--------+--------+

이제 다음 값으로 각 블록을 자동으로 손상시켜 보겠습니다 3.

+--------+--------+--------+
| DATA_1 | DATA_2 | PARITY |
+--------+--------+--------+
|      3 |      1 |      2 | # Integrity failed – Expected: PARITY = 4
|      1 |      3 |      2 | # Integrity failed – Expected: PARITY = 4
|      1 |      1 |      3 | # Integrity failed – Expected: PARITY = 2
+--------+--------+--------+

살펴볼 첫 번째 테이블이 없다면 어떤 블록이 손상되었는지 어떻게 알 수 있습니까?
당신은 확실히 알 수 없습니다.

이것이 Btrfs와 ZFS가 모두 체크섬을 차단하는 이유입니다. 조금 더 많은 디스크 공간이 필요하지만 이 추가 정보를 통해 스토리지 시스템은 어떤 블록이 놓여 있는지 파악할 수 있습니다.

에서Jeff Bonwick의 블로그 기사 "RAID-Z":

RAID-Z 블록을 읽을 때마다 ZFS는 이를 체크섬과 비교합니다. 데이터 디스크가 정답을 반환하지 않은 경우 ZFS는 패리티를 읽은 다음 조합 재구성을 수행하여 잘못된 데이터를 반환한 디스크를 파악합니다.

md에서 Btrfs를 사용하여 이 작업을 수행하려면 Btrfs에서 체크섬이 일치할 때까지 각 블록을 다시 계산해야 합니다. 이는 사용자/스크립트에 노출되는 쉬운 인터페이스가 없는 시간 소모적인 프로세스입니다.


ZFS가 이 모든 것을 자체적으로 수행할 수 있다는 것을 알고 있지만 ECC 메모리를 사용하고 싶지 않습니다.

ZFS나 md를 통한 Btrfs는 모두 ECC 메모리에 의존하거나 이를 인식하지 못합니다. ECC 메모리는 메모리의 자동 데이터 손상만 포착하므로 스토리지 시스템에 구애받지 않습니다.

이전에 RAID-5 및 RAID-6(각각 ZFS RAID-Z 및 RAID-Z2와 유사)에 대해 Btrfs보다 ZFS를 권장했습니다.mdadm raid6에 대한 Btrfs?그리고ATA가 응답을 중지하면 md RAID의 장치에 오류가 발생합니다.하지만 이 기회를 통해 ZFS의 몇 가지 장점을 더 간략하게 설명하고 싶습니다.

  • ZFS가 자동 데이터 손상을 감지하면 사람의 개입 없이 그 자리에서 자동으로 즉시 수정됩니다.
  • 전체 디스크를 재구축해야 하는 경우 ZFS는 전체 블록 장치에서 불필요하게 실행하는 대신 실제 데이터만 "리실버"합니다.
  • ZFS는 논리 볼륨과 파일 시스템에 대한 올인원 솔루션이므로 md 기반의 Btrfs보다 관리가 덜 복잡합니다.
  • RAID-Z 및 RAID-Z2는 달리 안정적이고 안정적입니다.
    • md RAID-5/RAID-6의 Btrfs는 조용히 손상된 데이터 블록에 대해서만 오류 감지 기능을 제공하며(또한 조용히 손상된 패리티 블록은 너무 늦을 때까지 감지되지 않을 수 있음) 오류 수정을 수행할 수 있는 쉬운 방법이 없습니다.
    • Btrfs RAID-5/RAID-6, "심각한 데이터 손실 버그가 여러 개 있습니다.".
  • ZFS RAID-Z2를 사용하여 전체 디스크를 자동으로 손상시킨 경우 md RAID-6에서는 데이터가 전혀 손실되지 않습니다.실제로 455,681개의 inode를 잃었습니다..

답변2

mdadm에 대한 읽기 오류를 생성하는 방법을 찾았습니다.

dmsetup을 사용하면 테이블에서 논리 장치를 생성할 수 있습니다.

각 섹터(512바이트)에 대한 대상을 지정하는 테이블을 로드하여 장치를 생성합니다.

에서:맨페이지

이 테이블에서는 IO 오류를 반환해야 하는 오프셋을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

0 4096 linear /dev/sdb 0
4096 1 error
4097 2093055 linear /dev/sdb 4097

오프셋 4096*512에 오류가 있는 장치(1GB)가 생성됩니다.

관련 정보