커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 시스템 관리 / 서버운영 > 디스크 관리 / 파일시스템 / mount 도움말
검색 : 사이트 WHOIS 웹서버 종류


  ZFS 파일시스템의 snapshot(스냅샷) 기능 작성일 : 2010/08/02 18:14
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 17456
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 : ZFS 파일시스템의 snapshot(스냅샷) 기능
    작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2010.6.21(월)
    수정일 : 2010.8.2(월) FreeBSD에서 ZFS 버전 정보 추가


    ZFS 파일시스템은 snapshot(스냅샷) 기능을 제공하여, 원하면 언제든지 snapshot시점으로 복원할 수 있다. 명령어 한줄로 snapshot을 만들고, 명령어 한줄로 복원한다. snapshot 생성을 매일 1회 이상 자동으로 실행되도록 해주면, 데이터 복원에 유용할 것이다.

    참고로 FreeBSD 8.0은 ZFS v13을, 8.1은 v14를 지원한다. FreeBSD 8.2 또는 9.0에서는 v15를 지원할 예정이다.
    ZFS v15는 Solaris 10 update 8과 FreeBSD간의 호환성이 좋아졌으며, ZFS파일시스템에 php 코드가 있을경우에 기존보다 15~20%정도 RPS가 향상되었다.


    1. snapshot 만들기

    ZFS 파일시스템은 snapshot 기능을 지원한다. 따라서 파일 시스템의 백업과 특정 시점으로의 rollback(롤백)이 쉽다.
    이론적으로 snapshot은 최대 2의 64제곱개까지 만들 수 있다. snapshot은 같은 스토리지 풀(파일시스템, 볼륨)의 공간을 사용한다.

    snapshot을 만들어보자. snapshot시에 형식은 '파일시스템@snapshot명' 또는 '볼륨@snapshot명'이다. snapshot 이름은 기존 이름과 중복되지 않으면 임의로 만들면 된다.

     
    # zfs snapshot data/log@2010_0621_1740_Mon
     


    snapshot이름은 개인적으로 '년월일' 형식을 선호한다. snapshot 목록을 볼 때, 별도 속성 옵션(-o creation)을 줘야 생성일자를 볼 수 있는 불편함 때문이다. 좀 더 직관적으로 표기하기위해 요일까지 붙여줘도 좋다.


    2. snapshot 확인하기

    생성된 snapshot 목록을 살펴보자. 생성일시를 알고 싶다면 -o creation의 추가 옵션이 필요하다.

     
    # zfs list -t snapshot
    NAME                          USED  AVAIL  REFER  MOUNTPOINT
    ... 생략 ...
    data/log@2010_0619_0701_Sat   26K      -  20.9M  -
    data/log@2010_0620_0701_Sun   30K      -  21.5M  -
    data/log@2010_0621_0701_Mon   31K      -  21.5M  -
    data/log@2010_0621_1740_Mon     0      -  28.5M  -
    #
    # zfs list -o name,used,referenced,creation -t snapshot
    NAME                          USED  REFER  CREATION
    ... 생략 ...
    data/log@2010_0619_0701_Sat    26K  20.9M  Sat Jun 19  7:01 2010
    data/log@2010_0620_0701_Sun    30K  21.5M  Sun Jun 20  7:01 2010
    data/log@2010_0621_0701_Mon    31K  21.5M  Mon Jun 21  7:01 2010
    data/log@2010_0621_1740_Mon      0  28.5M  Mon Jun 21 17:40 2010
     


    스토리지 풀의 history 정보에서도 snapshot 생성 일시를 확인할 수 있다. history에서는 스토리지 풀 생성, 삭제, 그리고 snapshot 생성, 복구, 삭제 등 모든 변경 정보를 확인할 수 있다.

     
    # zpool history
    History for 'data':
    2010-06-08.10:13:05 zpool create data amrd0s1h
    2010-06-08.10:13:18 zfs create data/log
    ... 생략 ...
    2010-06-20.07:01:02 zfs snapshot data/log@2010_0620_0701_Sun
    2010-06-21.07:01:02 zfs snapshot data/log@2010_0621_0701_Mon
    2010-06-21.17:40:57 zfs snapshot data/log@2010_0621_1740_Mon
     


    snapshot의 각종 속성 정보(Property)를 확인해보자.

     
    # zfs get all data/log@2010_0621_0701_Mon
    NAME                         PROPERTY              VALUE                  SOURCE
    data/log@2010_0621_0701_Mon  type                  snapshot               -
    data/log@2010_0621_0701_Mon  creation              Mon Jun 21  7:01 2010  -
    data/log@2010_0621_0701_Mon  used                  31K                    -
    data/log@2010_0621_0701_Mon  referenced            21.5M                  -
    data/log@2010_0621_0701_Mon  compressratio         1.00x                  -
    data/log@2010_0621_0701_Mon  devices               on                     default
    data/log@2010_0621_0701_Mon  exec                  on                     default
    data/log@2010_0621_0701_Mon  setuid                on                     default
    data/log@2010_0621_0701_Mon  shareiscsi            off                    default
    data/log@2010_0621_0701_Mon  xattr                 on                     default
    data/log@2010_0621_0701_Mon  version               3                      -
    data/log@2010_0621_0701_Mon  utf8only              off                    -
    data/log@2010_0621_0701_Mon  normalization         none                   -
    data/log@2010_0621_0701_Mon  casesensitivity       sensitive              -
    data/log@2010_0621_0701_Mon  nbmand                off                    default
    data/log@2010_0621_0701_Mon  primarycache          all                    default
    data/log@2010_0621_0701_Mon  secondarycache        all                    default
     



    3. snapshot rollback하기

    rollback은 snapshot 방법과 동일하다. 특정 시점으로 되돌리고 싶으면 해당 'snapshot명'을 지정하기만 하면 된다.

     
    # zfs rollback data/log@2010_0621_1740_Mon
    cannot rollback to 'data/log@2010_0621_1740_Mon': more recent snapshots exist
    use '-r' to force deletion of the following snapshots:
    data/log@2010_0621_1750_Mon
    data/log@2010_0621_1813_Mon
     


    위의 경우는 data/log@2010_0621_1740_Mon 스냅샷 이후(즉, 보다 최근)에 2개의 스냅샷이 존재하기 때문에 나오는 메시지이다. 이를 무시하고 롤백하려면 -r 옵션(Recursively)을 주면 된다.

     
    # zfs rollback -r data/log@2010_0621_1740_Mon
     



    4. snapshot 지우기

    'zfs destroy snapshot명' 형식으로 snapshot을 지운다.

     
    # zfs list -t snapshot
    NAME                          USED  AVAIL  REFER  MOUNTPOINT
    ... 생략 ...
    data/log@2010_0621_1824_Mon      0      -  28.5M  -
    data/log@2010_0621_1825_Mon      0      -  28.5M  -
    # zfs destroy data/log@2010_0621_1825_Mon
    # zfs list -t snapshot
    NAME                          USED  AVAIL  REFER  MOUNTPOINT
    ... 생략 ...
    data/log@2010_0621_1824_Mon      0      -  28.5M  -
    #
     



    5. snapshot을 파일로 저장 (send & receive)

    zfs send 명령으로 snapshot을 파일로 저장한다. 저장된 파일은 별도 서버에 보관해두고, 필요시 복구할 수 있다.

     
    # zfs send data/log@2010_0621_0701_Mon > /data/snapshot_2010_0621
    # ls -l /data
    drwxr-xr-x  49 root  wheel       113 Jun 21 15:57 log
    -rw-r--r--   1 root  wheel  20139288 Jun 21 16:47 snapshot_2010_0621
     


    파일로 보관했던 snapshot을 복구하려면 어떻게 할까? 현시점의 파일시스템을 다른 이름으로 바꾼다. 그리고, 새로운 파일시스템으로 snapshot을 복구한다.

     
    [ 이름 변경 ]
    # zfs rename data/log data/log_old
    # zfs list
    NAME           USED  AVAIL  REFER  MOUNTPOINT
    data          99.6M  27.7G  67.8M  /data
    data/log_old  31.0M  27.7G  28.5M  /data/log_old

    [ snapshot파일에서 복구 ]
    # zfs receive data/log < /data/snapshot_2010_0621
    # zfs list
    NAME           USED  AVAIL  REFER  MOUNTPOINT
    data           128M  27.7G  67.8M  /data
    data/log      28.5M  27.7G  28.5M  /data/log
    data/log_old  31.0M  27.7G  28.5M  /data/log_old
     



    6. snapshot 생성, 조회하는 간단한 스크립트

    snapshot명을 날짜형식(예. data/log@YYYY_MMDD_HHmm_요일)으로 생성해주는 간단한 스크립트를 만들었다. snapshot 목록 볼 때, 여러 옵션 넣는게 귀찮은데, 이 것도 쉽게 할 수 있도록 했다.

    - 목록 조회 : ./zfs_snapshot.sh list
    - 생성      : ./zfs_snapshot.sh create data/log
    - 속성 조회 : ./zfs_snapshot.sh status data/log@2010_0621_0701_Mon

    * snapshot 스크립트 내려받기
     
    #!/bin/sh
    #
    # zfs snapshot 스크립트
    # - list(조회), create(생성), status(상세 속성)
    #
    # 2010.6.18(금)
    # by 좋은진호(truefeel, http://coffeenix.net/ )

    PATH=$PATH:/sbin

    case "$1" in
      # snapshot 목록
      "list" )
       zfs list -o name,used,referenced,creation -t snapshot
       ;;
      # snapshot 만들기
      "create" )
       DATE=`date +'%Y_%m%d_%H%M_%a'`

       if [ "$2" = "" ]; then
          echo "Usage: $0 $1 "
          echo "Exam:  $0 $1 data/log"
          echo
          zfs list
          exit 1
       fi
       zfs snapshot -r data/log@$DATE
       ;;
      # snapshot 상세 속성 조회
      "status" )
       if [ "$2" = "" ]; then
          $0 list
          echo
          echo "Usage: $0 $1 "
          exit 1
       fi
       zfs get all $2
       ;;
      *)
       echo "Usage: $0 {list|create|status}"
       exit 1
    esac
     


    매일 아침 07:01분에 data/log 파일시스템에 대한 snapshot을 만드려면 다음과 같이 /etc/crontab에 넣어주면 된다.

     
    1   7   *   *   *   root   /root/bin/zfs_snapshot.sh create data/log > /dev/null 2>&1
     



    7. 참고자료

    1) ZFS 관련

    * FreeBSD 7.x에서 ZFS 사용 & 성능 (2009.2, 글 좋은진호)
      http://coffeenix.net/board_view.php?bd_code=1662
    * ZFS, Btrfs 파일시스템에 대해 (2009.9)
      http://coffeenix.net/bbs/viewtopic.php?p=5816#5816
    * FreeBSD 8.0 릴리즈 (공식발표) (2009.11)
      http://coffeenix.net/bbs/viewtopic.php?p=5963#5963
    * All welcome ZFS v15 in FreeBSD
      http://ivoras.sharanet.org/blog/tree/2010-07-13.all-welcome-zfs-v15-in-freebsd.html

    2) ZFS snapshot 관련

    * Chapter 6. Working With ZFS Snapshots and Clones
      http://docs.huihoo.com/opensolaris/solaris-zfs-administration-guide/html/ch06.html
    * ZFS Best Practices Guide
      http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide
    * 스토리지 유틸리티 실습: ZFS 스냅샷과 Amazon S3 연동
      http://blog.sdnkorea.com/blog/545
      커피닉스 카페 최근 글
    [08/18] Самое лучшее средст
    [08/12] Красивые фотографии
    [08/12] Красивые фотографии
    [08/12] Красивые фотографии
    [08/12] Красивые фотографии
    [08/10] ио€Ð¸ иг
    [08/10] €Ð¾Ð казин
    [08/09] 피부&#4
    [08/05] 피부&#4
    [08/05] 수원&#5
    [08/02] 수원&#5
    [07/16] You don't want to m
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~