ZFS: 암호화된 데이터 세트를 사용하여 한 번에 여러 풀을 재구성하는 모범 사례

ZFS: 암호화된 데이터 세트를 사용하여 한 번에 여러 풀을 재구성하는 모범 사례

대략적인 설명

그래서 저는 현재 복잡한 ZFS 설정을 가지고 있으며 이를 재구성하고 일부 기존 하드웨어를 재사용하고 싶습니다.

이와 같은 작업을 수행하는 데 권장되는 방법은 모든 데이터를 백업하고, 이전 풀을 삭제하고, 새 풀을 만들고, 데이터를 복원하는 것입니다. 문제는 다음과 같습니다.어떻게이를 수행하는 가장 좋은 방법

설정 및 세부정보

현재 설정은 3×1TB 및 3×4TB 드라이브로 구성되어 있으며 다음과 같이 설정되어 있습니다. 두 개의 4TB 드라이브는 각각 하나의 1TB 및 하나의 3TB 파티션으로 포맷되었습니다.

  • media_pool5×1TB 디스크/파티션으로 구성된 raidz1 풀입니다(-> 4TB 사용 가능, 3.26TB 사용).
  • three_t_pool3TB 파티션 2개로 구성된 미러인가요? (-> 3TB 사용가능, 1.93TB 사용)
  • non_redundant4TB 드라이브가 하나만 포함된 풀입니다(1.07TB 사용).

이러한 각 풀에는 전체 풀에 걸쳐 암호화된 데이터 세트가 하나만 있습니다. media_pool/media_encrypted, three_t_pool/backups, 그리고 non_redundant/nr_encrypted.


향후 설정에서는 다음과 같이 1TB 드라이브를 제거하고 12TB 드라이브를 추가할 것입니다.

  • media_and_backups3개의 4TB 드라이브와 12TB 드라이브의 4TB 파티션으로 구성된 raidz1 풀((4-1)×4TB = 12TB 사용 가능)
  • non_redundant_foo8TB가 남아 있는 대용량 드라이브입니다.

및 암호화된 데이터 세트 media_and_backups/media_encrypted, media_and_backups/backupsnon_redundant_foo/nr_encrypted.

(미디어와 백업 데이터 세트를 분리할 필요는 없지만 이로 인해 상황이 복잡해질 수 있습니다)


이제 마이그레이션 프로세스는 다음과 같습니다(7개 드라이브가 모두 동일한 컴퓨터에 연결됨).

  • 원하는 4TB 및 8TB 파티션에서 12TB 드라이브 포맷
  • 기존 풀/데이터 세트 데이터를 8TB 파티션에 백업
  • 이전 풀 3개를 삭제하고 media_and_backups풀 및 해당 데이터 세트( media_and_backups/media_encrypted, media_and_backups/backups)를 생성하고 백업에서 복원합니다.
  • nr_encrypted[ 데이터를 으로 이동하고 media_and_backups, 8TB 파티션의 파일 시스템을 삭제하고, 거기에 새 풀을 생성하고, nr_encrypted거기에 데이터 세트를 복원하는 옵션도 있습니다 .]

그런데 위에서도 말씀드렸듯이 잘 모르겠는 부분이 백업과 복원 진행상황이에요

  • 제가 생각할 수 있는 간단한 방법 중 하나는 rsync를 사용하고, 각 데이터세트에 대한 폴더를 만들고, 모든 데이터를 동기화하고, 원하는 풀과 데이터세트를 만든 다음 해당 데이터세트를 다시 rsync하는 것입니다.
    • 한 가지 분명한 단점은 백업 시 데이터가 해독되고 복원 시 다시 암호화된다는 점입니다.
    • 그냥 느낌잘못된예를 들어 전송 중 데이터 손상을 어떻게 식별합니까?
  • zfs sendzfs receive가야 할 길인 것 같습니다 . 그런데... 실제로 어떻게 해야 합니까?
    • 나는 대답을 읽었다ZFS 전체 스냅샷 보내기/받기그러나 내 설정과 다른 설정 사이에는 몇 가지 주요 차이점이 있습니다.
      • 새 서버에 직접 새 풀을 생성합니다. 먼저 백업을 저장한 다음 동일한 서버에 복원하고 싶습니다.
      • 동일한 풀에 저장하고 싶은 3개의 서로 다른 풀의 3개 데이터 세트가 있습니다.
    • 사용 가능한 스토리지에 대한 질문도 있습니다. 8TB(= 7.28TiB)는 3.26+1.93+1.07=6.26TiB의 사용된 데이터를 보관하기에 충분하지만, 물론 8TB 풀은 4+3+ 4TB 상당의 데이터 세트를 호스팅할 수 없습니다.
  • 따라서 현재 데이터 세트를 8TB 풀의 하나의 큰 파일에 개별적으로 저장해야 한다고 생각합니다 zfs send(또는 어떻게든 청크로 분할). 그런 다음 완료되면 이전 풀을 파괴하고 zfs recv파일을 풀에 복사하여 새 풀을 생성해야 합니다.

이것이 가장 좋은 방법입니까, 아니면 더 나은/권장 방법이 있습니까? 또는 zfs send/ 사용에 대한 모범 사례 zfs receive. 이 작업을 수행하는 경우 알아야 할 사항이 있나요?

답변1

그래서 오류 수정이 수신 시 발생한다는 것을 알았으므로 중간 파일을 만드는 것은 좋은 생각이 아닙니다.

또한 내 데이터세트에 볼륨 크기가 설정되어 있지 않다는 사실을 발견했습니다( 를 사용하여 확인 zfs get volsize). 따라서 풀 크기가 아닌 총 사용량 크기에만 주의하면 됩니다.

나도 거기 가봤어 전체 zfs 풀을 다른 zfs 풀로 단방향 미러링하는 방법내가 아는 한 -d(discard) 옵션을 사용하여 zfs receive파일 시스템 경로가 새 풀과 일치하도록 할 수 있습니다.

또한 데이터세트가 암호화되어 있기 때문에 --raw해당 플래그를 켜야 합니다 zfs send. 데이터세트를 해독하고 다시 암호화하는 것을 방지하고 싶기 때문입니다.

마지막으로, 서로 다른 풀의 여러 데이터 세트를 모두 동일한 대상 풀로 보내기 때문에 풀 스냅샷이 아닌 데이터 세트 스냅샷만 보내도록 주의해야 합니다. 그렇지 않으면 풀에서 충돌하는 스냅샷에 대한 오류가 발생합니다.

전반적으로 내 전송 명령은 다음과 같습니다.

zfs send -R --raw origin_pool/dataset@transfer_some_timestamp | pv -Wbraft | zfs receive -Fduv destination_pool

  • zfs send
    • -R모든 속성, 스냅샷을 보존하기 위해 복사 스트림 패키지를 생성합니다...
    • --raw암호화된 데이터 세트의 경우 전송된 데이터는 디스크에 존재하는 데이터와 정확히 동일합니다. 재암호화 방지
  • pv -Wbraft모니터 상태
  • zfs receive
    • -F` 대상 풀 확장
    • -dorigin_pool파일 시스템 이름의 일부를 버리고 destination_pool사용하십시오 .
    • -u설치하지 마세요
    • -v 스트림에 대한 자세한 정보와 수신 작업을 수행하는 데 필요한 시간을 인쇄합니다. (돌아보면 아마도 pv-v옵션이 모두 필요하지 않았을 것입니다. 하지만 아 뭐)

위의 내용은 일반적인 요점이지만 완전성을 위해 다음 단계를 수행했습니다.

  • tmux전제 조건: 실행 중인 프로세스를 중지하지 않고도 쉽게 연결을 끊을 수 있도록 열린 세션을 설정합니다.
  • 12T 드라이브를 4T 및 8T로 포맷합니다. 4T 파티션의 크기는 다른 4T 드라이브와 정확히 동일합니다(기존 파티션 테이블 중 하나를 보려면 다음을 fdisk -l /dev/sdX사용 하세요).
  • non_redundant_two8T 파티션에 풀 생성
  • 첫 번째 소스 풀에서 재귀적 스냅샷 생성zfs snap -r drei_t_pool@transfer_$(date '+%Y%m%d%H%M%S')
  • non_redundant수영장 으로 이동 : ( zfs send -R --raw drei_t_pool@transfer_20231210194637| pv -Wbraft | zfs receive -Fduv non_redundant_two이상적이지는 않습니다. 아래를 참조하세요.)
  • 다음 소스 풀의 스냅샷 생성zfs snap -r media_pool@transfer_$(date '+%Y%m%d%H%M%S')
  • 전송을 시도했는데 오류가 발생하여 스냅샷( zfs list -t snapshot)을 확인한 결과 풀에는 아주 작은 스냅샷이 있고 데이터 세트에는 큰 스냅샷이 있는 것을 발견했습니다. 풀 스냅샷을 삭제합니다.zfs destroy non_redundant_two@transfer_20231210194637
  • 또한 "보유자" 데이터 세트를 생성하고 전체 풀 스냅샷을 여기에 보내는 것을 고려하고 시도했습니다.
    • zfs create non_redundant_two/media_holder
    • zfs send -R --raw media_pool@transfer_20231210232518 | pv -Wbraft | zfs receive -Fduv non_redundant_two/media _holder
    • 이 방법도 효과가 있는 것 같았지만 더 나은 아이디어가 있었기 때문에 시도를 취소하고 중단했습니다.
  • 데이터 세트만 보내기:zfs send -R --raw media_pool/media_encrypted@transfer_20231210232518 | pv -Wbraft | zfs receive -Fduv non_redundant_two
  • 마지막 풀/데이터 세트에 대해 동일한 작업을 수행 zfs snap -r non_redundant@transfer_$(date '+%Y%m%d%H%M%S')한 다음zfs send -R --raw non_redundant/nr_encrypted@transfer_20231211121954 | pv -Wbraft | zfs receive -Fduv non_redundant_two
  • 백업된 데이터 세트를 열고 파일을 읽을 수 있는지 테스트합니다(모든 풀에 대해 이 작업을 수행).
    • zfs load-key non_redundant_two/backups
    • 조사하다...
    • 키를 제거하고 제거합니다 zfs unmount -a.zfs unload-key non_redundant/nr_encrypted
  • 풀을 삭제하기 전에 풀의 속성을 백업하세요.pool get all drei_t_pool > zfs.get.drei_t_pool
  • 원본 스냅샷, 데이터 세트, 풀을 삭제합니다. (재귀 플래그를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 수행 중인 작업을 확실히 확인하고 싶습니다.) (모든 소스 풀에 대해)
    • zfs destroy drei_t_pool@transfer_20231210194637,zfs destroy drei_t_pool/backups@transfer_20231210194637
    • zfs destroy drei_t_pool/backups
    • zpool destroy drei_t_pool
  • 마이그레이션하려는 새 풀 만들기media_and_backups
  • 그곳으로 데이터 세트를 전송합니다(데이터가 변경되지 않았으므로 스냅샷을 다시 생성할 필요가 없습니다).
    • zfs send -R --raw non_redundant_two/backups@transfer_20231210194637 | pv -Wbraft | zfs receive -Fduv media_and_backups
    • zfs send -R --raw non_redundant_two/media_encrypted@transfer_20231210232518 | pv -Wbraft | zfs receive -Fduv media_and_backups
  • 암호 해독 및 설치가 예상대로 작동하는지 확인하고 데이터세트를 삭제합니다.non_redundant_two
  • 전송 스냅샷 폐기

또 다른 궁금증: NFS가 작동하지 않아서 zfs get sharenfs pool_name/dataset_name내가 설정한 기본 설정이 어디에 표시되는지 확인했는데 SOURCE탭이 표시되었습니다 remote. 그래서 속성을 재설정한 후 탭이 SOURCE나타나고 localNFS가 다시 작동했습니다.

관련 정보