ZFS : 드라이브를 잃은 후 올바른 사본 수를 어떻게 복원합니까?


12

zfs를 사용하면 copies=2일부 사본이 포함 된 드라이브가 있고 손실 된 경우 시스템에 영향을받는 파일에 대한 새 데이터 블록 사본을 작성해야한다고 시스템에 알리는 방법은 무엇입니까? 아니면 잘못된 데이터 블록을 발견하자마자 zfs가 여분의 복사본에 대한 데이터 블록을 추가하기 시작합니까?

스크럽이이 작업을 수행합니까?

(v0.6.0.56-rc8, ZFS 풀 버전 28, ZFS 파일 시스템 버전 5, 우분투 11.10)

답변:


10

"복사본 = 2"(또는 3)는 중복성이없는 풀 (단일 디스크 또는 스트라이프)과 함께 사용하도록 설계되었습니다. 전체 장치 오류가 아닌 사소한 디스크 손상을 복구 할 수 있도록하는 것이 목표입니다. 후자의 경우, 풀을 마운트 해제 할 수 있으므로 분리 블록 복원이 발생하지 않습니다.

이중화 (mirroring / raidz / raidz2 / raidz3)가있는 경우, ditto 블록은 다른 블록과 다르지 않으며 문지르 기 / 리 실버 링은 다시 만듭니다.


이것은 @Redmumba의 말과 직접 충돌하며 Redmumba는 코드에 대한 링크를 제공합니다. 당신이 말하는 것에 대한 몇 가지 출처를 인용 할 수 있습니까? 특히, copy = N이 전체 장치 오류에 대처하지 않을 것이라고 생각하는 이유에 대한 좋은 인용을보고 싶습니다. 이것은 내가 읽은 것과 일치하지 않습니다.
James Moore

1
@James Moore 전체 장치 오류가 발생하면 해당 디스크에 디 토트 블록이 기록되지 않습니다. 풀 수준에는 중복성이 없으므로 결함이있는 디스크를 새 것으로 교체 할 방법이 없습니다. 이러한 상황을 올바르게 복구하는 유일한 방법은 풀의 전체 백업을 수행하고 정상적인 장치로 다시 생성 한 다음 첫 번째 백업이 완료되기 전에 의도하지 않은 재부팅이 발생하지 않도록 백업에서 복원하는 것입니다. 그렇지 않으면 풀을 가져올 수없고 데이터가 손실 될 수 있습니다. 이는 불량 디스크 복구가 온라인으로 수행되고 재부팅 후에도 유지되는 중복 풀에 비해 상당히 부담이됩니다.
jlliagre

1
다음은 참조입니다. docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). 복사본 = 2 또는 3이 중복 구성으로 간주되지 않는다고 가정합니다.
jlliagre

1
하지만 한 가지 명심해야 할 점은 원래 가지고 copies=1있고이를 copies=2업로딩 한 경우 나중에 리 실버 / 리 크루 브를 원할 경우 이러한 인스턴스가 생성된다는 것입니다. 그러나 @jilliagre는 정확합니다. ditto 블록은 중복 구성을 구성하지 않습니다. 풀에 여러 장치가 있어도 다른 장치에 블록이 설정되어 있다고 보장 할 수 없습니다.
Andrew M.

1
"copies = N 여기서 N> 1"기능은 중복성을 추가하지 않습니다. 데이터 손상을 해결하기위한 것입니다. zfs에 기록 된 모든 것은 체크섬되거나 해시됩니다. 다시 읽으면 체크섬 / 해시가 확인됩니다. N = 1 인 경우 체크섬 / 해시 확인 실패로 인해 앱에 오류가 발생합니다. N> 1이면 다른 사본 중 하나를 참조하여 다른 모든 사본을 복구 할 수 있습니다.
longneck

9

나는이 질문이 정말로 흥미 롭다는 것을 알았고 문서를 쏟아 부는 데 1 시간을 보낸 후에 코드에 빠져 들었습니다. 여기 내가 찾은 것이 있습니다.

첫째, 몇 가지 용어. Ditto 블록 (미러와는 달리 이러한 복사본)은 쓰기시 자동으로 생성되지만 원본 복사본과 동일한 가상 장치 (vdev)에 있거나 없을 수 있습니다. 반면에 미러링 된 블록은 항상 다른 가상 장치에 반영됩니다.

그러나이 코드는 두 가지 유형의 블록을 모두 자식으로 나타냅니다. 당신은 볼 수 여기 저두 블록은 그냥 아이들이 것을 io_vd == NULL(이 쓰기 기능이다). 미러링 된 블록의 io_vd경우 해당 가상 장치 (예 : 두 번째 디스크)로 설정됩니다.

가에 도달 할 때 염두에두고, 읽기 부분 , 모든 아이들을 취급이 예상되는 포함하지 않는 경우 잠재적으로 안전하지 않은으로 (그들은 거울 또는 저두 블록 수) good_copies, 및 필요에 따라 다시 작성합니다 . 따라서 귀하의 질문에 대한 답변은 그렇습니다. 적어도 사본이 하나 이상 있고 다음 중 하나가 있으면 다시 작성합니다.

  • 데이터를 읽으려고 할 때 예기치 않은 오류가 발생했습니다.
  • 리 실버 링 중이거나
  • 당신은 문지르고 있습니다.

휴! 누군가가 결함을 지적 할 수도 있지만,이 작은 연습을 통해 ZFS에 대해 배우는 것이 즐거웠습니다. 이것이 도움이되기를 바랍니다.


1
문제는 @jlliagre의 답변에 있습니다. 장치가 손실되면 풀이 죽었습니다. 수영장에 여전히 충분한 블록이 있다는 사실은 중요하지 않습니다. 그 주위에 어떤 방법이 있습니까?
James Moore

4
@JamesMoore 실패한 장치의 첫 1MB가있는 경우 어레이를 온라인으로 성능이 저하 된 상태로 만들 수 있습니다. 아마도 실패한 장치의 메타 데이터 만 있으면됩니다. jbod 스타일 zpool로 이것을 테스트했으며 작동합니다. raidz broken labels 복구 . zpool을 중단하기 전후에 md5sum을 수행했으며 가져 오기 후에는 사본 = 1 파일 시스템 만 손상되었습니다. 사본 = 2 및 사본 = 3 파일 시스템이 완벽하게 일치했습니다.
Jodie C

2

@jlliagre와 디스크 (vdevs) 중 하나가 죽었지 만 풀이 중복되지 않으면 (전체 미러 / 미러) zpool 전체가 죽는다고 생각하는 사람들. 이것은 사실이 아닙니다. 다중 디스크 풀은 것입니다 항상 이 거울 또는 raidz없는 경우에도 하나의 완전한 디스크 오류를 살아남.

ZFS 메타 데이터는 항상 최소 2 번 복사되므로 전체 디스크 (또는 그 일부)의 전체 장애로 인해 파일 시스템이 중단되지 않습니다. 또한, 많은 파일, 특히 작은 것들, 모든 디스크에 분산되지 않고, 따라서되지 않습니다 반드시 디스크 오류로 오류 발생 될 수있다. OP는 ditto 블록 (사용자 데이터 사본> 1)을 사용 하는 다중 디스크 풀 의 경우를 묻습니다 . 여기서 완전한 단일 디스크 장애로 인해 데이터가 손실 되지 않아야합니다 .ZFS는 항상 원래 블록에서 멀리 떨어진 블록을 두려고 시도하며 여러 vdev가있는 풀의 경우 항상 다른 vdev를 의미합니다 (하나의 vdev가 풀의> 50 % 인 경우는 예외입니다). . 파일 시스템 메타 데이터는 항상 tto 레벨보다 +1 또는 +2 배 더 많이 복사 되므로 항상 디스크 장애에도 살아남습니다. 또한 3 개 이상의 디스크 풀이있는 경우 데이터 손실없이 디스크의 절반을 잃을 수 있습니다. ZFS는 인접한 두 개의 디스크를 잃어 버리지 않는 한 데이터 손실이없는 한 다음 디스크에 디 토트 블록을 저장합니다. (ditto = 2에 대해 세 개의 인접한 디스크 오류).

파일에 액세스하기에 충분한 데이터 사본이있는 경우 (복사본이 미러, 미러 또는 raidz에서 온 것인지) 파일에 액세스 할 때 누락 된 모든 데이터 사본이 복구됩니다. 이것은 스크럽의 목적입니다. 중복 사본을 사용하여 모든 데이터를 읽고 잘못된 것을 수정하십시오. 따라서 OP 질문에 직접 대답하려면 실패한 드라이브를 교체 한 후 스크럽 만하면 모든 사본이 복원됩니다.

항상 그렇듯이 백업 저장 소용 vdev가 일반적인 스파 스 파일 인 풀을 만들어 개념을 쉽게 실험 할 수 있습니다. vdev 파일을 삭제하거나 손상시킴으로써 모든 유형의 장애를 시뮬레이션하고 풀, 파일 시스템 및 데이터의 무결성을 확인할 수 있습니다.

편집 : 실험 후, 사본이 => 2 인 다중 디스크 비 중복 풀에서 디스크에 장애가 발생하면 zfs가 풀에 실패하는 것처럼 보입니다. 하나 이상의 디스크에서 패리티 어 데이터 손상이 지속 가능해야하며 스크럽으로 수정해야합니다.


이러한 종류의 실험에서 가장 무서운 점은 설정이 즉시 또는 적어도 빨리 실패한다고 알려주는 데 훌륭하다는 것입니다. 그들은 때때로 설정이 실패한다고 나에게 좋지 않습니다. 어쨌든 실패한 풀을 다시 가져 오는 방법은 명확하지 않습니다. 세 개의 스파 스 파일로 이와 같은 풀을 설정하려고 시도했으며 스파 스 파일 중 하나를 제거하면 전체 풀에 치명적인 것으로 보입니다. zpool replace는 실패한 파일을 대체하지 않으며 zpool scrub은 5 %에서 멈 춥니 다 (이것은 매우 작은 풀임 ). illumos.org/msg/ZFS-8000-5E 의 오류 페이지 는 낙관적이지 않습니다.
제임스 무어

내 답변과 비슷한 결과를 얻었습니다. 나는 보통 raidz 만 사용하고 신뢰할 수있는 출처 (오라클 블로그)라고 생각한 정보를 바탕으로 답했습니다. 사본이 1보다 큰 다중 디스크 JBOD 유형 풀은 더 이상 디스크 장애가 지속될 수 있다고 생각하지 않습니다.
Aaron B
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.