2012年1月21日土曜日

ZFSとGlusterFSの操作の対比

最近GlusterFSをいじっています。
ZFSが長年染み付いているので、対比表を作ってみました。

1年以上前にも導入を検討しましたが、いろいろあって見送りました。
最近システム構成を考える中で意外と行けるかもと思い直すようになりました。
ZFSよりもメモリへの要求が少ないのが、特にいいですね。

■確認したバージョン
GlusterFS 3.2.5(CentOS5.7)
ZFS v28(FreeBSD9.0)

まずは概念図から。
GlusterFSのマニュアルはZFSと同じだけど意味の違う用語が入り乱れているので、読んでて混乱します。
頭に叩き込んでおきましょう。



次にファイルシステムを作成する段取りについて。

ZFSでの操作GlusterFSでの操作

サーバにデバイス(ディスク)を設置する
/dev/ada0
/dev/ada1
/dev/ada2
/dev/ada3
/dev/ada4
/dev/ada5
/dev/ada6
/dev/ada7

サーバを信任する(例:2台)
gluster peer probe 192.168.0.131
gluster peer probe 192.168.0.132

ブリック(ディレクトリ)を作成する
mkdir /gluster-bricks/brick01
mkdir /gluster-bricks/brick02
mkdir /gluster-bricks/brick03
mkdir /gluster-bricks/brick04

デバイスからストレージプールを作成する
zpool create tank0 mirror ada0 ada1 mirror ada2 ada3 mirror ada4 ada5 mirror ada6 ada7

ストレージプールからファイルシステムを作成する
zfs create tank0/hogemoge

ブリックからボリュームを作成する
gluster volume create hogemoge replica 2 transport tcp 192.168.0.131:/gluster-bricks/brick01 192.168.0.132:/gluster-bricks/brick01 192.168.0.131:/gluster-bricks/brick02 192.168.0.132:/gluster-bricks/brick02 192.168.0.131:/gluster-bricks/brick03 192.168.0.132:/gluster-bricks/brick03 192.168.0.131:/gluster-bricks/brick04 192.168.0.132:/gluster-bricks/brick04

ボリュームを利用開始する
gluster volume start hogemoge

マウントポイントを設定する(マウント自体は全自動)
zfs set mountpoint="/hogemoge" tank0/hogemoge

マウントする
echo "192.168.0.131:hogemoge /hogemoge glusterfs default,user_xattr,_netdev 0 0" >> /etc/fstab
mount -a







最後に、もうちょっと細かい操作コマンドの違いについて。
オプションは一切省いているので、説明書を必ず熟読してください。
GlusterFSは設定ファイルを直接いじれば、リネームとかも可能なんだと思いますけれども、覚えるのが面倒なのでコマンドラインツールで操作できる内容に絞りました。

ZFSの操作ZFSでのコマンドGlusterFSでのコマンドGlusterFSの操作
ZFSにはGlusterFSの"信頼されたストレージプール"に相当する概念はない。
サーバ構成は自分自身の1台のみで完結なので関係ない。
gluster peer probeサーバを信任する("信頼されたストレージプール"に追加する)
gluster peer detachサーバを信任解除する("信頼されたストレージプール"から取り除く)
ファイルシステムのマウント許可(デフォルト)zfs set canmount=ongluster volume startボリューム利用開始
ファイルシステムのマウント禁止zfs set canmount=offgluster volume stopボリューム利用停止(デフォルト)
デバイスからストレージプールを作成するzpool creategluster volume createディレクトリからボリュームを作成する
ストレージプールからファイルシステムを作成するzfs create
ストレージプールを破棄するzpool destroygluster volume deleteボリュームを破棄する
ファイルシステムを破棄するzfs destroy
ストレージプールにデバイスを追加する(容量拡大、ホットスペア、ZIL、L2ARC)zpool addgluster volume add-brickボリュームにブリックを追加する(容量拡大のみ)
ZFSでは容量は縮小できない(通常デバイスは取り外せない)gluster volume remove-brickボリュームからブリックを取り外す(そのブリックに記録されているデータはボリュームから消失する)(*1)
ストレージプールからデバイスを取り外す(ホットスペア、ZIL、L2ARC)zpool removeGlusterFSにはそうした特殊デバイスは存在しない。
デバイスを入れ替えるzpool replacegluster volume replace-brickブリックを入れ替える
ZFSでは記録済みデータはリバランスできないgluster volume rebalanceブリック間で記録済みデータをリバランスする
ストレージプールにミラーデバイスを追加するzpool attachGlusterFSではミラー数は途中変更できない。
ストレージプールのミラーデバイスを削除するzpool detach
ストレージプールの一覧を表示するzpool listgluster volume info allボリュームの構成情報を表示する。ただし容量は表示されない。(*2)
ストレージプールの状態を表示するzpool status
ファイルシステムの一覧を表示するzfs list
デバイスの使用を停止するzpool offlineGlusterFSではブリックは個別停止できない。(*3)(*5)
デバイスの使用を再開するzpool online
エラーチェック&修復zpool scrubレプリケーションはファイルにアクセスする度に自動修復される。(*4)
ファイルシステムをリネームするzfs renameGlusterFSではボリューム名は途中変更できない。


(*1)ファイル消失について
ボリュームの構成情報のみが削除され、データは残る。
各ブリックはただのディレクトリなので、ストライピングしていなければ直接救出可能。
ストライピングしている場合はファイルの一部分がsparseで欠損しているので非常に大変だと思うが、不可能ではないだろうとは思う。
まぁディスクなりブリックなりを一度追加したら簡単には外せないというのはZFSもGlusterFSも似たような状況ということで。

(*2)容量の確認方法
容量はマウント先でdf -kコマンド等で確認すればよい。
ただしGlusterFSのボリュームは普通のディレクトリの寄せ集めのため、ディレクトリ毎に空き容量がバラバラなので、df的には空いててもバランシングの状況次第では容量フルでエラっちゃう可能性がある気がする。
容量オーバーを防止するなら構成ディレクトリをそれぞれ個別に監視しないといけませんね。

(*3)ブリックは個別停止できない件について
ミラーされていて、かつNative Clientでマウントしていれば自動でフェイルオーバーされるので、停止させずに抜いちゃっても問題ないはず・・・(と思うけど確かめたわけではない)(*5)

(*4)レプリケーションの修復について
インデックスのみで良ければ find <gluster-mount> -print0 | xargs --null stat >/dev/null
ファイル内容まで完全に find <gluster-mount> -type f -exec dd if='{}' of=/dev/null bs=1M; > /dev/null 2>&1
チェックサム情報は(多分)持っていないので静的なデータ破壊までは点検できない(と思うけど確かめたわけではない)


以下20120124追記

(*5)試してみた
稼働中に、brickに使ってるディスクをマウントしてあるディレクトリをumountしてみました。
umountされてもGlusterFSは何事も無かったかのように稼働し続けました。素晴らしい。ではなくて、大変な事態に陥りました。

マウントポイントはマウント解除されることによって単なる空ディレクトリに変わりますが、GlusterFSはその空ディレクトリを使って勝手にレプリカの復元を始めてしまいます。おそらくファイルシステムの異変は感知せずレプリカの片割れが欠落したとだけ認識してしまうんでしょう。USB起動だったので起動ディスクが一瞬で埋まってしまいました・・・orz

では単にumountするだけではなくマウントポイントのディレクトリを削除するとどうなるかというと、復元動作は一応停止しますが、レプリケーションの片割れが読み書きできないことでクライアントにinput/output errorが返ってしまい、稼働継続できませんでした。レプリケーションの片割れは正常であるにも関わらずです。

シンプル設計との観点でいえば妥当な動作ではあろうと思いますが、運用中にマウントが外れることは、異常/正常を問わず有り得ると思うんですよね。これじゃ単発ディスクがSPOFになっちゃう。その対策としてディスクとファイルシステムで2重に冗長化するのはコスト高でしょう。やっぱりbrickは明示的に個別に一時停止できたほうが、いいんじゃないかなぁ。

これがネットワーク切断やサーバダウンによる片割れ停止だったら異常検知されて稼働し続けられるのかなぁと想像しますが、どうなんでしょう。後日、試してみたいと思います。

0 件のコメント: