2010年10月11日月曜日

ZFS スナップショットレプリケーション


このエントリーをはてなブックマークに追加



ZFS send/recv を使った、サーバ間でのレプリケーションを試してみる。

Table of Contents
=================
1 ZFS スナップショットレプリケーション
    1.1 準備するもの
    1.2 今回テストした環境
    1.3 基本的な転送方法
        1.3.1 送信元でスナップショットを取得する
        1.3.2 フル転送する
            1.3.2.1 zfs recv のオプション
            1.3.2.2 転送時の注意
            1.3.2.3 SSHの利用
        1.3.3 転送先での状態1
        1.3.4 差分転送する
            1.3.4.1 zfs send のオプション
            1.3.4.2 zfs recv のオプション
            1.3.4.3 差分転送前の注意
            1.3.4.4 疑問
        1.3.5 転送先での状態2
    1.4 ちょっと高度に使ってみる
        1.4.1 差分圧縮転送
            1.4.1.1 スナップショットの作成
            1.4.1.2 対象のファイルシステムをアンマウント
            1.4.1.3 増分を圧縮転送する
            1.4.1.4 ファイルシステムをマウントする
        1.4.2 フル圧縮転送
    1.5 転送時間


1 ZFS スナップショットレプリケーション
#######################################
  2台のサーバ間でのデータ移行やバックアップにZFS send/recvを使ってみる。

1.1 準備するもの
^^^^^^^^^^^^^^^^^
   + 2台のSolaris/OpenSolarisサーバ
   + ZFSのバージョンは下位互換なので、送信先>送信元である必要があるが、
     バックアップとして使う場合は当然ながら送信先=送信元が良い。

1.2 今回テストした環境
^^^^^^^^^^^^^^^^^^^^^^^
   + 送信元 Ultra 24
     Intel(R) Core(TM)2 Extreme CPU X9650  @ 3.00GHz CPU 1(4core)
     8GB Mem
     RAIDZ(Hitachi SATA 2TB 7200rpm x4)
   + 送信先 Ultra 27
     Intel(R) Xeon(R) CPU W3520  @ 2.67GHz CPU 1(4core)
     12GB Mem
     Hitachi 500GB + 500GB + 1000GB(all SATA 7200rpm)
   + 上記2台は1GbpsのLANで接続

1.3 基本的な転送方法
^^^^^^^^^^^^^^^^^^^^^

1.3.1 送信元でスナップショットを取得する
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # zfs snapshot spool/cifs01@2010-1010-234505

1.3.2 フル転送する
~~~~~~~~~~~~~~~~~~~
    送信元から実行
    # zfs send spool/cifs01@2010-1010-234505 | ssh root@192.168.1.11 zfs recv -vd testpool
    パスワード:
    receiving full stream of spool/cifs01@2010-1010-234505 into testpool/cifs01@2010-1010-234505

    転送終了
    received 1.15TB stream in 21557 seconds (55.9MB/sec)

1.3.2.1 zfs recv のオプション
==============================
     + -v 転送後に受信時間と容量を表示する。
     + -d 転送先のzfs名を転送元の名前と合わせる。
       このオプションを使うときはzpoolのみを指定する。

1.3.2.2 転送時の注意
=====================
     転送開始と同時に、送信先にZFSが作られるが転送終了まではアンマウントされるのでアクセスでできない。

1.3.2.3 SSHの利用
==================
     今回はSSHのパスワードプロンプトが出ているが、自動バックアップ等で使う場合は認証無しのSSHができるようにしておく必要がある。

1.3.3 転送先での状態1
~~~~~~~~~~~~~~~~~~~~~~~
    # zfs list
    NAME                               USED  AVAIL  REFER  MOUNTPOINT
    testpool                          1.14T   642G    24K  /testpool
    testpool/cifs01                   1.14T   642G  1.14T  /testpool/cifs01
    testpool/cifs01@2010-1010-234505      0      -  1.14T  -

1.3.4 差分転送する
~~~~~~~~~~~~~~~~~~~
    # zfs snapshot spool/cifs01@spool/cifs01@2010-1011-110237
    # zfs send -i spool/cifs01@2010-1010-234505 spool/cifs01@2010-1011-110237| ssh root@192.168.1.11 zfs recv -vdF testpool
    パスワード:
    receiving incremental stream of spool/cifs01@2010-1011-110237 into testpool/cifs01@2010-1011-110237

    received 19.7GB stream in 388 seconds (51.9MB/sec)

1.3.4.1 zfs send のオプション
==============================
     + -i 増分転送するオプション。
          <起点スナップショット> <起点の後に取得したスナップショット>
          という形で指定する。
          起点のスナップショットは送信先に同じものがないと行けない。
          (転送前に送信先でzfs rollback <起点スナップショット>すると確実)

1.3.4.2 zfs recv のオプション
==============================
     + -F 受信する前に、対象のファイルシステムを最新のスナップショットまで自動的にロールバックする。

1.3.4.3 差分転送前の注意
=========================
     差分転送をおこなう場合は、転送先でZFSに変更加えられていてはいけない。
     もし変更されている場合は、zfs rollbackを使って、元の状態に戻しておく必要がある。

1.3.4.4 疑問
=============
     差分転送時にはファイルシステムがアンマウントされていない。
     そのため、転送中にファイルシステムが変更されると転送が失敗する。

1.3.5 転送先での状態2
~~~~~~~~~~~~~~~~~~~~~~~
    bash-3.00#  zfs list
    NAME                               USED  AVAIL  REFER  MOUNTPOINT
    testpool                          1.16T   623G    24K  /testpool
    testpool/backup                     21K   623G    21K  /testpool/backup
    testpool/cifs01                   1.16T   623G  1.15T  /testpool/cifs01
    testpool/cifs01@2010-1010-234505  6.80G      -  1.14T  -
    testpool/cifs01@2010-1011-110237      0      -  1.15T  -

1.4 ちょっと高度に使ってみる
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1.4.1 差分圧縮転送
~~~~~~~~~~~~~~~~~~~
    転送時にzfsストリームを圧縮して転送する。

1.4.1.1 スナップショットの作成
===============================
     # zfs snapshot spool/cifs01@2010-1011-113632

1.4.1.2 対象のファイルシステムをアンマウント
=============================================
     # ssh root@192.168.1.11 "zfs umount -f testpool/cifs01"

1.4.1.3 増分を圧縮転送する
===========================
     # zfs send -i spool/cifs01@2010-1011-110237 spool/cifs01@2010-1011-113632 | gzip -c | ssh root@192.168.1.11 "gzip -cd |zfs recv -vdF testpool"
     receiving incremental stream of spool/cifs01@2010-1011-113632 into testpool/cifs01@2010-1011-113632
     received 1.38MB stream in 1 seconds (1.38MB/sec)

1.4.1.4 ファイルシステムをマウントする
=======================================
     # ssh root@192.168.1.11 "zfs mount testpool/cifs01"

1.4.2 フル圧縮転送
~~~~~~~~~~~~~~~~~~~
    # zfs snapshot spool/winprofile@2010-1011-114513
    # zfs send spool/winprofile@2010-1011-114513 | gzip -c | ssh root@192.168.1.11 "gzip -cd |zfs recv -vdF testpool"
    receiving full stream of spool/winprofile@2010-1011-114513 into testpool/winprofile@2010-1011-114513
    received 52.8GB stream in 2792 seconds (19.3MB/sec)

1.5 転送時間
^^^^^^^^^^^^^
   + 通常フル received 1.15TB stream in 21557 seconds (55.9MB/sec)
   + 通常増分 received 19.7GB stream in 388 seconds (51.9MB/sec)
   + 圧縮フル received 52.8GB stream in 2792 seconds (19.3MB/sec)
   + 圧縮増分 received 1.38MB stream in 1 seconds (1.38MB/sec)

     圧縮した方が遅いのが気になる。