やっぱり Sun がスキ! : Weblog やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20061121 2006年 11月 21日 火曜日

ZFS のレプリカを作成する

今回は、ZFS のファイルシステムを筐体間でレプリカを作成する方法を 紹介します。

ZFS は、ファイルシステムのスナップショットをバックアップ/リストアする 機能を備えており、これを使う事でファイルシステムのリモートコピーを作成す る事ができます。 さらに、ZFSはスナップショットの差分バックアップも取得可能なので、 バックアップ/リストアする為のデータ量を最小限に抑える事も可能です。



それでは、実際にファイルシステムのレプリカを作成してみましょう。
今回は、motoサーバにある pool/testdata1 ファイルシステムを、sakiサーバ の pool/testdata2 にレプリカを作成してみます。

このテストを行う前提環境として、ファイルシステムのレプリカ情報を ssh で自動 転送する為に、root 権限で ssh の自動ログインが可能な環境を構築する必要があります。

<Step.1>
まずは、コピー元のサーバ(moto)にて最新のスナップショット(pool/testdata1@snap-1) を作成します。
moto# zfs snapshot pool/testdata1@snap-1
<Step.2>
最初の一回だけ ZFS pool 内の全データをコピー先サーバ(saki)に転送します。
moto# zfs send pool/testdata1@snap-1 | ssh saki zfs recv pool/testdata2@snap-1
この時点でコピー元サーバ(moto)のスナップショット testdata1@snap-1 がコピー先サーバ(saki)に 反映されました。
<Step.3>
ここで差分を作成する為に pool/testdata1ファイルシステム内に新規ファイルを数個作成します。
<Step.4>
最新ファイルシステムのスナップショット(pool/testdata1@snap-2)を作成します。
moto# zfs snapshot pool/testdata1@snap-2
<Step.5>
差分データ(snap-1と snap-2 の差分)を抽出してレプリカを作成します。
もし、コピー先のファイルシステムに対して内容が変更され、前回のスナップショット (pool/testdata2@snap-1) と違う 内容になっていた場合、前回のスナップショットにロールバックする必要があります。
moto# zfs send -i pool/testdata1@snap-1 pool/testdata1@snap-2 | \
      ssh saki zfs recv pool/testdata2


これで正・副ファイルシステムの同期が可能になりました。これ以降は Step.4 〜 Step.5 を 繰り返す事により差分バックアップによる ZFS ファイルシステムの筐体間レプリカが作成可能 になります。

この手順は、リアルタイムでの同期は難しいですが、一日一回の同期をとる(バックアップをとる) 運用には向いているのではないでしょうか? X4500 などニアラインストレージとして使用する場合、 ファイルシステムのレプリカを別筐体に作成する運用も多いと思います。


[注意事項]
レプリケート実行中は、コピー先のファイルシステムはアンマウントされる為、 アンマウントができない状態の時は失敗します。

 [エラー内容]

cannot unmount '/pool/testdata2': デバイスは使用中です
cannot receive: dataset is busy
cannot mount '/pool/testdata2': directory is not empty