ZFS Clone 의 함정

제목이 ‘ZFS Clone의 함정!’ 이러니깐 굉장히 자극적이네요. 이래서 기자들이 제목을 저렇게 쓰나 봅니다. 각설하고, ZFS 클론에 관해서 이야기 해 볼까 합니다.

간단한 개념 설명

ZFS 에는 스냅샷이라는 기능이 있습니다. ZFS 스냅샷이 작동하는 방식은 디스크 블록의 주소를 참조하는 방식으로 이루어지기 떄문에, 스냅샷 자체는 용량을 거의 차지하지 않고, 스냅샷을 찍는 것은 즉시 이루어집니다. 그게 매우 거대한 파일이나, 아주 빠르게 변하는 DB나 시스템, VM 이 저장된 zvol 이라도 마찬가지입니다.

ZFS Clone 은 거기서 파생된 기술인데, ZFS 스냅샷을 참조하여, 해당 스냅샷이 가르키는 블록을 참조하는 클론을 만드는 것입니다. 덕분에, 생성히 매우 빠르고, 데이터를 수정하지 않는 이상 동일한 블록을 차지하기 때문에 디스크 용량을 차지하지 않습니다.

이렇게 보면 상당히 편리하고 멋진 기능 같습니다. 하지만 득만 있는 기능이라면 제가 제목을 저렇게 쓰진 않았겠지요. 문제가 뭐냐면, 앞서 찍은 부모 스냅샷을 파괴할수 없다는 것입니다. 적어도, 복제된 자식을 파괴하기 전까지는 말입니다.

백문이 불여일견

데이터셋 만들기

zfs create TEMP/org

org 데이터셋을 만들고

dd if=/dev/urandom of=/mnt/TEMP/org/rand bs=10M count=1

10M 짜리 rand 라는 랜덤 데이터 파일을 만들었습니다.

zfs snapshot TEMP/org@snapshot1

org 데이터셋의 snapshot1 이라는 이름의 스냅샷을 찍었습니다.

클론 생성

zfs clone TEMP/org@snapshot1 TEMP/org_clone

TEMP/org@snapshot1 을 부모로 하는 org_clone 이라는 클론을 만들었습니다.

원본 파괴?

zfs destroy TEMP/org

이제 org 를 날려 보겠습니다.

cannot destroy 'TEMP/org': filesystem has dependent clones
use '-R' to destroy the following datasets:
TEMP/org_clone

안 날아갑니다. 그럼, 스냅샷은?

zfs destroy TEMP/org@snapshot1

cannot destroy 'org@snapshot1': snapshot has dependent clones
use '-R' to destroy the following datasets:
TEMP/org_clone

똑같이 안 날아갑니다. 복제된 dataset 이 부모 스냅샷을 참조하기 때문입니다. 그래서 부모 스냅샷이나 데이터셋을 지우기 위해선, 자식까지 다 파괴해야 합니다.

이건 좀더 골때리는 문제가 됩니다. 부모와 자식 간에 공통되는 데이터가 하나도 없어도 종속 관계는 유지되거든요. 한번 봅시다.

분기 생성

rm /mnt/TEMP/org/rand

org 아래의 rand 파일을 삭제하고

dd if=/dev/urandom of=/mnt/TEMP/org/rand bs=20M count=1

20m 짜리 새로운 랜덤 파일을 생성합니다. 이제 TEMP/org 과 TEMP/org@snapshot1 은 완전히 다른 블록을 가르킵니다.

rm /mnt/TEMP/org_clone/rand

이어서, org_clone 의 rand 파일도 삭제합니다.

dd if=/dev/urandom of=/mnt/TEMP/org_clone/rand bs=20M count=1

org_clone 데이터셋에도 새로운 랜덤 파일을 생성합니다.

이제 org 와 org_clone 은 공통되는 데이터 블록이 없습니다. 서로 완전히 다른 데이터셋이죠. 자, 다시 지워보도록 하겠습니다.

원본 파괴 시도

zfs destroy TEMP/org

시스템님 org만 지우게 해 주세요.

cannot destroy 'TEMP/org': filesystem has dependent clones
use '-R' to destroy the following datasets:
TEMP/org_clone

안돼, 안 지워줘. 지워줄 생각 없어. 빨리 돌아가.

똑같이 안됩니다. 완전히 분기했는데 말입니다. 이제 org 를 제거하는 방법은 org_clone 까지 날려 버리는 것 뿐입니다.

org_clone 을 ZFS 스냅샷 전송 기능으로 백업한 다음 org (부모) 를 날려 버리는 방법이 있기는 한데, 그건 ‘zfs 스냅샷 백업’ 에서 더 자세히 다룰 것입니다.

그러니… zfs clone 은 조심해서 써야 합니다. 그렇지 않으면 자리만 차지하고 관리하기 어려운 데이터셋이나 스냅샷이 남을 수도 있으니깐요.

참고한 사이트

이 포스팅은 아래 블로그를 참조컨닝했습니다.

https://jrs-s.net/2017/03/15/zfs-clones-probably-not-what-you-really-want/

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다