連載
» 2008年04月08日 00時00分 公開

OpenSolarisで始めるブログサーバ構築(4):一瞬でのバックアップを実現するSolaris ZFS (3/4)

[川井聡,サン・マイクロシステムズ株式会社]

ZFSスナップショットを利用したバックアップ

 データ領域に限ったことではありませんが、ファイルシステムにZFSを使用すると、さまざまな面で恩恵を受けることができます。その1つがバックアップです。

 ZFSには「スナップショット」という機能があります。これは、ある時点におけるファイルシステムのリードオンリーのコピーを作成するものです。

 ZFSは、前述したようにCOW技術を使用しているので、瞬時に、しかもディスク容量を消費することなくスナップショットを取ることができます。スナップショットを取った後にデータに変更があった場合も、実際にコピーされるのは当該ブロックだけとなるため、ufsdumpを用いたバックアップと異なり、ディスクの使用を最低限に抑えられます。

OpenSolaris 図2 ZFSスナップショットのメリット

 では早速、ブログデータが保存されているファイルシステムのスナップショットを取ってみましょう。各ゾーンは、大域ゾーンのZFSファイルシステム上に構築されているので、操作は大域ゾーンから行います。

 ブログデータはdb_zone内に保存されているので、ここではmypool/zones/db_zoneファイルシステムのスナップショットを取得します。スナップショットには任意の名前を付けることができますが、日々バックアップを行うのであれば、以下のようにdate(1)コマンドを組み合わせて、ファイル名に日付を付けておくと分かりやすいでしょう。

# zfs snapshot mypool/zones/db_zone@`date +%Y%m%d`
# zfs list -t snapshot
NAME               USED AVAIL REFER MOUNTPOINT
pool1/zones/db_zone@20080208 22.5K   - 27K   -
#

 このような操作をcronなどで決まった時間に行っていれば、日々のバックアップを自動的に取得できます。バックアップさえ取っておけば、もし誤ってデータを消してしまったとしても、その前日の日付のスナップショットからロールバックすることでデータを復旧できます。

# zfs rollback pool1/zones/db_zone@20080201

 以上のように、ZFSではバックアップデータの保存も復旧も非常に簡単な操作だということがお分かりいただけたと思います。

 ここで一つ気を付けておかなければいけないことは、スナップショットの格納先でしょう。スナップショットされたファイルシステムとオリジナルのファイルシステムは、同じストレージプール内に保存されます。従って、万一ストレージプールに障害が発生した場合のことを考慮すれば、スナップショットは異なるストレージプール、もしくは異なるホストに保存しておくことが望ましいといえます。

 このような場合に便利なのが、sendrecvというコマンドです。zfs sendを実行すると、スナップショットのストリームデータが標準出力に書き込まれるので、別のストレージプールや別のホストに簡単にリダイレクトできます。

# zfs send mypool/zones/db_zones@20080201 | ssh newhost zfs recv pool1/zones/db_zone@20080208

 これでnewhostというホストにバックアップファイルを転送できます。なお、最初にスナップショットを取ったときからの日々の増分を取得するには、-iオプションを使います。

# zfs send -i pool1/zones/db_zone@20080208 pool1/zones/db_zone@02082009 | ssh newhost recv pool1/zones/dbzone

ZFSをiSCSIターゲットとして利用する

 ここまでは、ZFSファイルシステムをローカルストレージとして使用する方法を紹介しました。次に、ネットワークを介した共有ストレージデバイスとしてZFSを利用する方法を紹介します。

 ZFSでは、ZFSストレージプールの一部をブロックデバイスとして利用できる機能である「ZFSボリューム」がサポートされています。このZFSボリュームは、スワップ領域やダンプデバイスとして利用することもできます。さらに、ZFSボリュームをiSCSI(internet SCSI)のターゲットとして利用することもできます。

 iSCSIは、SCSIコマンドをIPネットワーク経由で転送する技術です。このiSCSIプロトコルを利用することで、ユーザーは、ネットワーク上のiSCSIターゲットをローカルストレージと同じように利用できます。つまり、iSCSIを使えば、安価にSAN環境を構築することができます。

 最新のSolaris Expressでは、iSCSIターゲットとiSCSIイニシエータの両方をサポートしています(Solaris 10の最新リリースであるSolaris 10 8/07でも利用可能です)。

 早速、作成したストレージプールのうち20GBytesをZFSボリュームとして作成してみましょう。ZFSボリュームの作成方法は、ストレージプールを作成する際に、-Vオプションにサイズを指定するだけです。後は、shareiscsiプロパティをonに設定すれば、iSCSIターゲットとして利用できるようになります。

# zfs create -V 20g mypool/volume
# zfs set shareiscsi=on mypool/volume

 以下のコマンドを使用して、ZFSボリュームがiSCSIとして利用可能になったことを確認します。

# iscsitadm list target
Target: pool1/volume1
    iSCSI Name: iqn.1986-03.com.sun:02:6b98f1ad-128b-6794-9c0d-922febcd74feiscs
    Connections: 1

 次に、このiSCSIを利用する側であるiSCSIイニシエータの設定方法を見てみましょう。以下のように、iSCSIイニシエータのホスト上からiSCSIターゲット(例:IPアドレスが10.0.01の場合)を見つける方式を指定し、有効にします。

# iscsiadm add discovery-address 10.0.0.1
# iscsiadm modify discovery -t enable
# iostat -En
c2t0d0        Soft Errors: 2 Hard Errors: 1 Transport Errors: 1
Vendor: SUN   Product: SOLARIS            Revision: 1 Serial No:
Size: 21.47GB <21474836480 bytes>
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0
Illegal Request: 2 Predictive Failure Analysis: 0
...

 もし、ここでiSCSIターゲットが発見できなければ、

# devfsadm -c iscsi

と入力してください。

 この「c2t0d0」は、ローカルのブロックデバイスと同じように操作できます。当然、この上にUFSやZFSなどのファイルシステムを構築することも可能です。

 先に、ブログサーバ環境をZFS上に構築する方法を説明しましたが、もしローカルマシンに十分なディスク容量がなければ、十分なディスクを備えたほかのマシンにiSCSIターゲットを作成し、IPネットワーク越しにZFSを利用してみるという方法にもチャレンジしてください!

Copyright © ITmedia, Inc. All Rights Reserved.

編集部からのお知らせ

8月8日10時30分〜16時30分の間、システムメンテナンスのため記事の一部表示や資料のダウンロードができなくなります。ご理解のほどよろしくお願いいたします。

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。