![성능 저하 없이 ZFS RAID-Z[123]를 확장하시겠습니까?](https://rvso.com/image/1609701/%EC%84%B1%EB%8A%A5%20%EC%A0%80%ED%95%98%20%EC%97%86%EC%9D%B4%20ZFS%20RAID-Z%5B123%5D%EB%A5%BC%20%ED%99%95%EC%9E%A5%ED%95%98%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
ZFS에서 RAID-Z(또는 RAID-Z2 또는 RAID-Z3) vdev를 확장하는 유일한 방법은 디스크를 더 큰 디스크로 교체하는 것이라는 것을 알고 있습니다. 형상을 변경할 방법이 없습니다. 하지만 그 과정에서 어레이의 성능을 저하시키지 않고 그렇게 할 수 있습니까?
예를 들어, 4개의 디스크가 있는 RAID-Z 어레이가 있다고 가정합니다. 1x2TB 및 3x1TB는 3TB의 사용 가능한 공간을 만듭니다. 모든 드라이브가 작동하는 동안 어레이를 확장하기 위해(사용 가능한 6TB까지) 2TB를 3개 더 구입합니다. 각 1TB를 제거하고 한 번에 하나씩 2TB로 교체하여 각 리실버를 강제로 적용하면 불필요하게 반복적으로 어레이 성능이 저하되고 프로세스에서 오류가 발생할 위험이 높아집니다.
제가 희망하는 것은 디스크를 교체하기 전에 각 디스크를 미러링하는 것입니다. 즉, 첫 번째 2TB를 예비 베이에 추가하고 첫 번째 1TB 디스크를 여기에 미러링한 다음 1TB를 제거하고 2TB를 제거된 드라이브 슬롯에 넣습니다. 그런 다음 두 번째 및 세 번째 1TB 디스크에 대해 반복합니다. 이는 어쨌든 리실버나 패리티를 다시 계산할 필요성을 잠재적으로 제거할 수도 있습니다.
그런 일이 가능합니까?
답변1
제안한 솔루션은 가능하지만 몇 가지 심각한 단점이 있습니다.
zpool import -o readonly=on ${YOUR_ZFS_POOL}
디스크 복제가 진행되는 동안에는 풀( )에 아무것도 쓸 수 없습니다 .zpool export ${YOUR_ZFS_POOL}
전환하는 각 디스크에 대해 풀( )을 내보내야 합니다 .
vdev 디스크를 복제한 후 다음을 수행해야 합니다.
- 풀(
zpool export ${YOUR_ZFS_POOL}
)을 내보냅니다. zpool labelclear ${OLD_DISK_DEVICE}
기존 디스크를 Zap( )하거나 물리적으로 제거합니다.
경고:디스크를 Zap해도 취소할 수 없습니다.- 필요한 경우 새 디스크에서 vdev 파티션을 늘립니다.
- 풀(
zpool import ${YOUR_ZFS_POOL}
)을 가져옵니다.
경고:이 시점 이후에는 실행취소할 수 없습니다. 이전 디스크는 더 이상 동일한 풀에서 온라인 상태가 될 수 없습니다. - 디스크(
zpool online -e ${NEW_DISK_VDEV}
)를 확장합니다.
교체하는 각 디스크에 대해 이러한 단계를 반복하면 새 용량이 적용됩니다.
ZFS에 내장된 대체 기능은 위 섹션에 설명된 이러한 추가 복잡성을 모두 방지하도록 설계되었습니다. 리실버 중에 RAID-Z zpool이 손상될까 봐 걱정된다면 다음을 수행해야 합니다.
- 더 많은 중복성을 갖춘 풀(RAID-Z2, RAID-Z3)을 생성했습니다.
- 어레이를 확장하는 동안 풀을 다른 곳에 백업하십시오.
게다가 실제로 디스크에 오류가 발생하더라도 여전히 RAID-Z에 만족하시겠습니까?
예산이 부족하고 데이터세트를 백업할 공간이 없는 경우 복제는 트랜잭션 방식의 전부 아니면 전무 작업이므로 계획을 실행하는 것이 실제로 더 안전합니다. 그러나 풀은 읽기 전용이라는 점을 기억하세요. 또는 잠시 동안 오프라인 상태일 수도 있으며 복제 후 단계에서 실수할 위험도 있습니다.
다음 을 사용 zpool replace
하면:
- 전체 블록 장치 대신 사용된 저장소만 복사되므로 더 빠릅니다
*순차적 스크러빙/리실버 기능 - 리실버가 진행되는 동안 풀이 완전히 작동하므로 가동 중지 시간이 없습니다.
- 디스크를 교체하는 ZFS 예상 작업 흐름을 사용하므로 사람의 실수를 제거합니다.