ZFS 분리 풀의 미러링된 드라이브

ZFS 분리 풀의 미러링된 드라이브

저는 FreeNAS를 실행하는 오래된(2-3년) NAS를 가지고 있습니다. 이제 하드 드라이브를 업그레이드할 때가 된 것 같습니다. 현재 상태는 다음과 같습니다.

    NAME        STATE     READ WRITE CKSUM                                  
    Pool1       ONLINE       0     0     0                                  
      raidz1    ONLINE       0     0     0                                  
        ada3p2  ONLINE       0     0     0                                  
        ada4p2  ONLINE       0     0     0                                  
        ada5p2  ONLINE       0     0     0                                  
      mirror    ONLINE       0     0     0                                  
        ada1p2  ONLINE       0     0     0                                  
        ada2p2  ONLINE       0     0     0 

RaidZ1의 드라이브는 모두 1GB이며 그대로 유지됩니다.

RaidZ1에 2개 또는 3개의 1GB 하드 드라이브를 추가하고 다음 작업을 수행하지 않고도 미러 드라이브(500GB만)를 완전히 제거하는 가장 좋은 방법은 무엇입니까?

  • 임시 저장 위치에 데이터 복사
  • 풀 다시 만들기
  • 다시 복사

풀이 50% 정도 찼기 때문에 미러링된 드라이브에 데이터가 있는지도 잘 모르겠습니다.

확인하는 방법이나 시작 위치는 무엇입니까?

답변1

유일한 방법은 제안한 대로 수행하는 것입니다. 모든 데이터 세트를 새 풀에 복사하고 풀을 다시 작성하는 것입니다. zfs는 드라이브 추가를 통한 raidz1 확장을 지원하지 않으며 최상위 vdev("미러") 제거도 지원하지 않습니다.

답변2

짧은 답변:

RaidZ1에 드라이브를 추가하고 미러 드라이브를 완전히 제거하는 가장 좋은 방법은 무엇입니까? 아니요:

  • 임시 저장 위치에 데이터 복사
  • 풀 다시 만들기
  • 다시 복사

당신은 할 수 없습니다. 기간. 구성에 따라 새 풀을 만들고 복사하지 않으면 미러링된 드라이브를 삭제할 수 없습니다. 특히 게시물 시간을 고려하면 ZFS는 풀에서 VDEV 삭제를 지원하지 않습니다. 최근에 이 문제가 발생한 독자의 경우 이 글을 쓰는 시점에서 zpool remove하나 이상의 VDEV가 포함된 풀에서 VDEV를 삭제하는 것이 지원되지 않습니다 raidz. zpool remove연결된 디스크 또는 연결된 미러 제거는 지원되지 않습니다.

긴 답변:

raidz1미러 vdev에 대한 vdev 연결 구성은 약간 특이합니다. 새 풀을 생성하고 기존 풀의 데이터를 새 풀로 복사한 다음 기존 풀을 삭제하지 않으면 풀에서 미러링된 vdev를 제거할 수 없습니다.

그러나 vdev 구조를 변경하지 않는 한 현재 풀의 용량을 확실히 확장할 수 있습니다.

그래서 추가하는 대신드라이브로 전환할 수 있습니다.더 큰운전사. 풀을 각각의 새 드라이브에 한 번에 하나씩 다시 동기화하려면 여러 번의 반복이 필요하지만 비교적 어렵지 않습니다. 그러나 ZFS는 재동기화 시 기존 RAID보다 더 효율적이므로 풀이 얼마나 가득 차 있는지에 따라 상황이 그렇게 나쁘지 않을 수도 있습니다.

핵심은 이것이다~ 해야 하다한 번에 하나의 디스크를 완료하십시오. 먼저 풀의 완전하고 테스트된 백업이 있는지 확인하십시오.

이것은 3개의 1G 드라이브와 장치 /dev/md0 ~ /dev/md2가 설정된 테스트 샌드박스입니다. 각 드라이브에는 GPT 파티션 테이블이 있습니다.

# gpart show md{0..2}
=>     40  2097072  md0  GPT  (1.0G)
       40      200    1  linux-swap  (100K)
      240  2096872    2  freebsd-zfs  (1.0G)

=>     40  2097072  md1  GPT  (1.0G)
       40      200    1  linux-swap  (100K)
      240  2096872    2  freebsd-zfs  (1.0G)

=>     40  2097072  md2  GPT  (1.0G)
       40      200    1  linux-swap  (100K)
      240  2096872    2  freebsd-zfs  (1.0G)

다음 드라이브로 풀을 만들었습니다 raidz1.

# zpool create tank raidz1 /dev/md{0..2}p2
# zpool status tank; echo; zpool list tank
  pool: tank
 state: ONLINE
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md0p2   ONLINE       0     0     0
        md1p2   ONLINE       0     0     0
        md2p2   ONLINE       0     0     0

errors: No known data errors

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
tank  2.75G   196K  2.75G        -         -     0%     0%  1.00x    ONLINE

매력적인. 이제 /dev/md3, md4 및 md5라는 세 개의 새 드라이브가 있다고 가정해 보겠습니다. 하지만 이 드라이브는 단순한 1G 드라이브가 아니라 10G 드라이브입니다. 또한 GPT 파티션 테이블이 설정되어 준비되어 있습니다.

# gpart show md{3..5}
=>      40  20971440  md3  GPT  (10G)
        40       200    1  linux-swap  (100K)
       240  20971240    2  freebsd-zfs  (10G)

=>      40  20971440  md4  GPT  (10G)
        40       200    1  linux-swap  (100K)
       240  20971240    2  freebsd-zfs  (10G)

=>      40  20971440  md5  GPT  (10G)
        40       200    1  linux-swap  (100K)
       240  20971240    2  freebsd-zfs  (10G)

수영장이 중복되어 있으므로주의 깊은바꾸다하나raidz1어레이 로 구동하나그러면 더 큰 드라이브기다리다풀이 다시 동기화되도록 한 후 다음 드라이브를 한 번에 하나씩 계속 교체합니다. offline드라이브를 -ing하고 어레이가 아직 실행 중인지 확인한 다음 작은 드라이브를 큰 드라이브로 교체하여 첫 번째 작업을 완료합니다 .

# zpool offline tank md0p2
# zpool status tank
  pool: tank
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using 'zpool online' or replace the device with
    'zpool replace'.
config:

    NAME        STATE     READ WRITE CKSUM
    tank        DEGRADED     0     0     0
      raidz1-0  DEGRADED     0     0     0
        md0p2   OFFLINE      0     0     0
        md1p2   ONLINE       0     0     0
        md2p2   ONLINE       0     0     0

errors: No known data errors

/dev/md0p2이제 1G 파티션을 10G 파티션으로 교체 할 수 있습니다 /dev/md3p2. 사실 zpool offline위의 단계가 반드시 필요한 것은 아닙니다. 이 명령을 직접 실행할 수 있습니다 zpool replace.

# zpool replace tank md0p2 md3p2
# zpool status tank; echo; zpool list tank
  pool: tank
 state: ONLINE
  scan: resilvered 128K in 00:00:02 with 0 errors on Wed Oct 13 13:46:23 2021
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md3p2   ONLINE       0     0     0
        md1p2   ONLINE       0     0     0
        md2p2   ONLINE       0     0     0

errors: No known data errors

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
tank  2.75G   265K  2.75G        -         -     0%     0%  1.00x    ONLINE

재동기화가 완료되었습니다. 이것은 매우 중요합니다. 풀에 저장된 데이터의 양이 많은 경우 zpool status tank재동기화가 완료될 때까지 가끔씩 기다려 확인해야 합니다.

재동기화가 완료되면 두 번째 디스크 교체를 진행할 수 있습니다.

# zpool replace tank md1p2 md4p2

zpool status다시 한 번, 재동기화가 완료될 때까지 기다려야 합니다 .

# zpool status tank
  pool: tank
 state: ONLINE
  scan: resilvered 134K in 00:00:03 with 0 errors on Wed Oct 13 13:54:17 2021
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md3p2   ONLINE       0     0     0
        md4p2   ONLINE       0     0     0
        md2p2   ONLINE       0     0     0

errors: No known data errors

이제 재동기화가 완료되었으므로 세 번째 작은 디스크를 더 큰 교체 디스크로 교체하겠습니다.

# zpool replace tank md2p2 md5p2
# zpool status tank; echo; zpool list tank
  pool: tank
 state: ONLINE
  scan: resilvered 146K in 00:00:03 with 0 errors on Wed Oct 13 14:55:56 2021
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md3p2   ONLINE       0     0     0
        md4p2   ONLINE       0     0     0
        md5p2   ONLINE       0     0     0

errors: No known data errors

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
tank  2.75G   319K  2.75G        -         -     0%     0%  1.00x    ONLINE

이제 이전 소형 디스크 md0 md1 및 md2는 더 이상 풀에 없습니다. 풀은 더 큰 디스크 md3, md4 및 md5에서 실행됩니다. 하지만 어레이를 zpool확장하라는 지시가 없기 때문에 추가 공간은 없습니다 . raidz1이것은 쉽습니다:

# zpool online -e tank md5p2
# zpool status tank; echo; zpool list tank
  pool: tank
 state: ONLINE
  scan: resilvered 146K in 00:00:03 with 0 errors on Wed Oct 13 14:55:56 2021
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md3p2   ONLINE       0     0     0
        md4p2   ONLINE       0     0     0
        md5p2   ONLINE       0     0     0

errors: No known data errors

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
tank  29.8G   394K  29.7G        -         -     0%     0%  1.00x    ONLINE

이제 3G 풀을 사용하는 대신 30G 풀을 사용하게 되었는데, 이는 디스크를 한 번에 하나씩 조심스럽게 교체한 다음 어레이를 확장하는 방식으로 수행됩니다.

답변3

zpool scrub먼저, 변경하기 전에 모든 것이 제대로 작동하는지 확인하기 위해 부팅을 고려할 수 있습니다 .

메모리에서 벗어나(따라서 확인이 필요함) 원하는 옵션은 zpool add기존 raidz 풀을 확장할 수 있는 것이라고 생각합니다.

데이터를 쉽게 이동하려면 zfs send|receive와 스냅샷을 사용한 증분 send|receive를 사용할 수 있습니다.

관련 정보