BTRFS는 정전 중에 데이터 일관성을 보장할 수 있습니까?

BTRFS는 정전 중에 데이터 일관성을 보장할 수 있습니까?

~처럼ZFS 독점 성명,ZFS는 무적이라고 주장합니다.ZFS는 정전에 취약할 수 있음을 인정합니다.

BTRFS에서 그러한 진술을 찾을 수 없습니다. 정전 시에도 내구성이 있습니까(또는 설계/계획) 있습니까?

답변1

#btrfs IRC에 이 질문을 했는데 그들은 should be ok if your hw isn't "buggy""버기"가 your hw has correct flush/barrier semantics.

핵심요약: 이는 ZFS와 유사한 방식으로 btrfs가 정전으로 인한 데이터 손상으로부터 보호된다는 의미입니다.

이유는 다음과 같습니다. ZFS와 btrfs의 일반적인 아이디어는 비슷합니다.둘 다 Merkle 트리를 데이터 구조로 사용합니다.. 쓰기를 위해서는 디스크의 여러 블록을 업데이트해야 할 수도 있습니다.파일 시스템은 빈 블록에 새 데이터를 기록하여 이를 처리합니다(기존 파일이 수정되는 경우에도 이전 상태를 반영하는 블록을 수정할 필요가 없음).새로운 업데이트 트리를 구축하세요. 모든 어려운 작업이 완료되고 데이터와 업데이트된 트리가 디스크에 기록되면 헤드 포인터가 새 트리로 업데이트되어 변경 사항이 표시됩니다.

파일에 쓸 때 동작하는 방법은 다음과 같습니다.

  1. 디스크의 여유 블록에 데이터를 씁니다.
  2. (1)에 작성된 변경 사항에 따라 업데이트된 머클 트리*의 복사본을 만듭니다.
  3. 하드웨어에 데이터를 디스크에 플러시하도록 요청합니다. 하드웨어는 보류 중인 모든 데이터를 씁니다.
  4. 새로운 Merkle 트리에 대한 헤드 포인터를 업데이트합니다.
  5. 더 이상 필요하지 않은 오래된 블록을 해제합니다.

(4) 거래가 완료된 후 전원이 차단된 경우. (1)~(3) 단계 사이에 전원이 끊기면 파일 시스템은 이전 상태로 되돌아갑니다((1) 단계에서 기록된 데이터는 손실되지만 파일 시스템은 일관성을 유지합니다). 파일 시스템에 오류가 있는지 확인할 필요가 없습니다. 이는 파일 시스템을 즉시 사용할 수 있다는 것을 의미하며 이는 큰 이점입니다(대형 파일 시스템을 확인하는 데 시간이 오래 걸릴 수 있습니다!).

다음은 "결함이 있는" 하드웨어가 어떻게 잘못될 수 있는지에 대한 예입니다.

  1. 디스크의 여유 블록에 데이터를 씁니다.
  2. (1)에 작성된 변경 사항에 따라 업데이트된 머클 트리*의 복사본을 만듭니다.
  3. 하드웨어에 데이터를 디스크에 플러시하도록 요청합니다. 하드웨어는 완료를 승인하지만 완전히 플러시하지는 않습니다(예를 들어 데이터가 디스크의 후기입 캐시에 남아 있을 수 있음).
  4. 새로운 Merkle 트리에 대한 헤드 포인터를 업데이트합니다. 이 데이터는 보류 중인 다른 데이터보다 먼저 디스크에 기록됩니다(예: 디스크 헤드가 올바른 위치에 있기 때문에).
  5. (1)과 (2)단계에서 기록된 데이터가 디스크에 기록됩니다.
  6. 더 이상 필요하지 않은 오래된 블록을 해제합니다.

(4)와 (5) 사이에 또는 (5) 단계 중에 전원이 끊기면 파일 시스템이 일치하지 않게 됩니다. 결과적으로 머클 트리 및/또는 데이터가 부분적으로만 기록되어 파일 시스템이 일관성을 잃게 될 수 있습니다.

실제로 RAID 컨트롤러를 사용할 때는 특별한 주의가 필요합니다.. 일반적으로 디스크에서 후기입 캐싱을 비활성화하고 자체 후기입 캐시를 사용합니다. 여기서 문제가 발생할 수 있는 일반적인 두 가지 방법이 있습니다.

*여기서 내용을 단순화하고 있습니다. 실제로 전체 트리를 복사할 필요는 없습니다.변경된 부분만 추가하면 됩니다. 나머지는 기존 트리와 새 트리 간에 공유할 수 있습니다..

관련 정보