ZFS 스냅샷을 이용한 복원
ZFS 스냅샷으로 안전한 데이터 복원 및 증분 백업 관리
Wiki topics:
🔓 · Open Source
ZFS 스냅샷을 이용한 복원
서버 운영 환경에서는 데이터 손실을 대비한 복원이 중요합니다. ZFS(Zettabyte File System)의 스냅샷 기능을 활용해 변경된 데이터만 스냅샷으로 저장하여 증분 백업을 구현했습니다.
ZFS(Zettabyte File System)
- 기존 Unix 파일 시스템(ext4, xfs) 대체하는 차세대 파일 시스템
- 디스크를 zpool이라는 단위로 관리하며, 논리적 볼륨 관리, Quota, NFS 공유 기능 → LVM과 NFS 장점 통합
- 저장 장치 추가하면 zpool 파일 시스템에서 즉시 새 공간 사용 가능
ZFS 스냅샷(Snapshot)
- ZFS Dataset의 특정 시점 상태를 읽기 전용 가상 이미지로 저장
- 필요할 때, 해당 시점으로 바로 롤백 가능 → 데이터 손실이나 장애 발생 시 복원 가능
복원(Restore)
- 백업된 스냅샷 데이터를 ZFS 풀에 재적용하여 원본 데이터 상태로 되돌리는 과정
- 단순 데이터 복사가 아닌, Dataset 구조 전체를 재구성
백업(Backup)
- 전체 백업(Full Backup): 특정 시점의 전체 파일 시스템 전체 저장
- 증분 백업(Incremental Backup): 기존 스냅샷 기반으로 차이점만 기록
*데이터 용량이 크고, 전송 시간 오래 걸림
데이터 전송량 최소화, 복원 시 반드시 전체 백업 → 증분 백업 순서로 순차적 처리 필요
스냅샷 생성
전체 백업 스냅샷 생성
- 3MB Dump 파일 생성
dd if=/dev/urandom of=/user/testuser01/dummyfile01 bs=1M count=3
- Dump 파일 생성 확인
ls -lart /user/testuser01
- 출력 확인

- 디스크에 데이터 동기화
sync
- 스냅샷 생성
zfs snapshot -r mypool01@snap01
- -r: Dataset 계층 전체를 스냅샷으로 묶어서 저장
- 스냅샷 생성 확인
zfs list -t snapshot | grep snap01
- 출력 확인

- ZPool 디렉터리로 이동
cd /user
- ZFS 스냅샷 파일로 생성
zfs send -R mypool01@snap01 > ~/user/full_backup.snap
경로를 신규 서버의 ZPool로 설정
- 스냅샷 파일 생성 확인
ls -lart
- 출력 확인

- ZFS 파일 검증
file ./full_backup.snap
- 출력 확인

변경사항 추가 후 증분 스냅샷 생성
- 새 3MB Dump 파일 생성
dd if=/dev/urandom of=/user/testuser01/dummyfile02 bs=1M count=3
- Dump 파일 생성 확인
ls -lart /user/testuser01
- 출력 확인

- 디스크에 데이터 동기화
syn
- 스냅샷 생성
zfs snapshot -r mypool01@snap02
- -r: Dataset 계층 전체를 스냅샷으로 묶어서 저장
- 스냅샷 목록 확인
zfs list -t snapshot
- 출력 확인

- 스냅샷 파일 검증
file ./incr_backup.snap
- 출력 확인

- 증분 파일만 전송
zfs send -R -I mypool01@snap01 mypool01@snap02 > /user/incr_backup.snap
- -I: 이전 스냅샷부터 생성 스냅샷까지의 증분 스트림 생성 (Increment)
- -R: 지정한 스냅샷의 하위 데이터까지 모두 포함해서 전송하여 ZFS 풀 전체를 계층 구조 그대로 백업 (Recursive)
- 백업 서버에서 증분 백업 파일 전송 확인
cd ~ && ls -lart | grep backup
- 출력 확인

백업 파일 압축 후 전송
- 전체 백업 및 증분 백업 파일 압축
tar -zvcf backup.tar *.snap
- 압축 파일 생성 확인
ls -lart | grep tar
- 출력 확인

- 원격 서버로 전송
scp backup.tar root@[private_ip]:~
- 출력 확인

복원
NFS 옵션 해제
- NFS 옵션 해제
zfs set sharenfs=off mypool02
- NFS 옵션 해제 확인
zfs get sharenfs
- 출력 확인

복원 중 충돌 방지를 위해 ZFS Pool의 NFS 공유 설정을 해제
전체 백업 복원
- 수신 서버에서 파일 전송 확인
cd ~ && ls -lart | grep tar
- 출력 확인

- 압축 해제
tar -zxvf backup.tar
- 스냅샷 파일 확인
ls -lart
- 출력 확인

- 전체 백업 스냅샷 복원
zfs receive -F mypool02 < ./full_backup.snap
전체 백업 → 증분 백업 순서로 진행, 증분 스냅샷은 전체 스냅샷을 기반으로 하기 때문에 순서가 준수 되어야 함
- ZPool 목록 추가 확인
zfs list
- 출력 확인

- 스냅샷 목록 확인
zfs list -t snapshot
- 출력 확인

- 데이터 백업 확인
ls -lart /user/testuser01
- 출력 확인

증분 백업
- 증분 백업 스냅샷 복원
zfs receive -F mypool02 < ./incr_backup.snap
- ZPool 목록 확인
zfs list
- AS-IS

- TO-BE

두 번째 스냅샷의 변경 사항 반영 확인, 용량 3.03MB → 6.03MB 증가 확인
- 스냅샷 목록 확인
zfs list -t snapshot | grep snap02
- 출력 확인

- 전체 스냅샷 목록 확인
zfs list -t snapshot
- 출력 확인

- 데이터 복원 확인
ls -lart /user/testuser01
- 출력 확인

트러블 슈팅
- 백업 경로 설정 오류로 인한 스냅샷 손상
invalid stream (bad magic number)
- 원인: ZFS 파일 전송 시 Stream이 아니라 다른 형식(tar 등 압축 파일)으로 덮어쓰기 됨
- 해결: 백업 대상 ZFS Pool 내부에 파일 전송
zfs send -R [pool]@[snapshot] > ~/[base_path]/[filename].snap 메타데이터
- post_id
- d1d5e6bd56e4
- slug
- zfs-스냅샷을-이용한-복원-d1d5e6bd56e4
- url
- https://medium.com/@haedall/zfs-%EC%8A%A4%EB%83%85%EC%83%B7%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B3%B5%EC%9B%90-d1d5e6bd56e4
- canonical_url
- https://medium.com/@haedall/zfs-%EC%8A%A4%EB%83%85%EC%83%B7%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B3%B5%EC%9B%90-d1d5e6bd56e4
- author_url
- https://medium.com/@haedall
- status
- ok
- fetched_at
- 2026-06-24 16:30:55