glusterfsで仮想化サーバの余っているローカルハードディスクを分散共有ストレージにする at nkjmkzk.net

仮想化サーバが数台あると共有ストレージをつないで仮想マシンを全仮想化サーバで共有したくなります。

そうすることによって仮想マシンはリソースが空いていればどの仮想化サーバ上で起動させることができ、起動後もLive Migrationで別の仮想化サーバ上に移動させることさえできます。なのである程度の規模になると仮想化サーバ数台 + 共有ストレージという構成が一般的となります。

こうなってくると仮想化サーバのローカルハードディスクはほとんど使われません。サーバの故障率を下げるためにSANブートにしたりするとさらにローカルハードディスクは全く使わないことになります。それはそれですっきりしいると言えばそうなのですが、せっかくのローカルハードディスクが無駄になっている気もします。もし、共有ストレージを別途用意しなくても、個々の仮想化サーバのローカルハードディスクが元気玉のようにあつまって共有ストレージにようにつかえたら便利でエコですよね。

それを可能にするのがglusterfsです。glusterfsはいろいろな構成がありますが、その内の一構成として複数台のI/Aサーバのローカルハードディスクをつなげて一つの大きなストレージにすることができます。言葉にするとややこしいですが、図にするとこんな感じ。

今まで必要だった外付けの共有ストレージが不要になり、かつて使われることのなかったローカルハードディスクが息を吹き返して共有ストレージの代わりとなる、しかも分散共有ストレージ、というエグい構成となります。なんということでしょう。

それでは早速インストールしてみましょう。

今回はvmserver1, vmserver2, vmserver3という3台の仮想化サーバでglusterfsを構成します。以下では仮想化サーバにはOracle VM Server for x86 2.2.1を使用していますが、Linuxベースの仮想化サーバであれば利用できるものが多いでしょう。RHEL, CentOS, Fedora, Debian, UbuntuはglusterfsのRPMが用意されているのでインストールも楽でしょう。今回はOracle VM Serverで話を進めます。

Oracle VM Server for x86 2.2.1はベースがOracle Linux 5の32bitなのですが、残念ながらglusterfsの32bit版RPMは見当たりません。なのでソースからビルドしていきますが、Oracle VM Serverにはgcc等の開発系ツールはデフォルトではインストールされていません。追加インストールしてもよいのですが、出来る限りdom0はシンプルにしておきたいので別途ビルド専用の環境を作ります。作るといってもOracle VM Server 2.2.1 SDKというVM Templateが提供されているので、それをedeliveryからダウンロードして起動するだけです。下記からたどってOracle VM Template 32 bitからOracle VM Server 2.2.1 SDK Template Media Packをダウンロードしてください。

E-Delivery

SDK VM Templateを起動したらビルドに必要なfuseのパッケージをインストールしておきます。

[root@sdk]# rpm -Uvh http://public-yum.oracle.com/repo/OracleLinux/OL5/6/base/i386/fuse-2.7.4-8.el5.i386.rpm[root@sdk]# rpm -Uvh http://public-yum.oracle.com/repo/OracleLinux/OL5/6/base/i386/fuse-devel-2.7.4-8.el5.i386.rpm

次にglusterfsの最新ソースをダウンロードしてSDK VMの任意のディレクトリに保存し、下記のようにビルドを進めます。

2011年2月10日現在最新のglusterfsのダウンロード:glusterfs-3.1.2.tar.gz

[root@sdk]# tar xvfz glusterfs-3.1.2.tar.gz[root@sdk]# cd glusterfs-3.1.2/[root@sdk]# ./configure --prefix=/srv/glusterfs[root@sdk]# make[root@sdk]# make install

これをVM Serverにコピーします。

[root@sdk]# scp -r /srv/glusterfs vmserver1:/srv/[root@sdk]# scp -r /srv/glusterfs vmserver2:/srv/[root@sdk]# scp -r /srv/glusterfs vmserver3:/srv/[root@sdk]# scp /etc/init.d/glusterd vmserver1:/etc/init.d/[root@sdk]# scp /etc/init.d/glusterd vmserver2:/etc/init.d/[root@sdk]# scp /etc/init.d/glusterd vmserver3:/etc/init.d/

VM Serverでパスを通しておきます。全てのVM Server上で下記の作業を行います。

[root@vmserver1]# vi /root/.bash_profile--省略--PATH=/srv/glusterfs/bin:/srv/glusterfs/sbin:$PATH:$HOME/bin--省略--

次にVM Serverにもfuseパッケージをインストールしておきます。全てのVM Server上で下記の作業を行います。

[root@vmserver1]# rpm -Uvh http://public-yum.oracle.com/repo/OracleLinux/OL5/6/base/i386/fuse-2.7.4-8.el5.i386.rpm[root@vmserver1]# rpm -Uvh http://public-yum.oracle.com/repo/OracleLinux/OL5/6/base/i386/fuse-devel-2.7.4-8.el5.i386.rpm

これでインストールは完了です。
次に初期設定を行います。glusterfsのデーモンを起動し、次回以降OS起動時に自動起動するように設定します。全てのVM Server上で下記の作業を行います。

[root@vmserver1]# service glusterd start[root@vmserver1]# chkconfig glusterd on

また、iptablesを停止しておきます。全てのVM Server上で下記の作業を行います。

[root@vmserver1]# service iptables off

次にglusterfsを構成するVM ServerでTrusted Storage Poolを構成します。これは複数台のVM Serverで信頼関係を構築するという作業です。この操作は任意の一台のVM Serverで行います。

[root@vmserver1]# gluster peer probe vmserver2Probe successful[root@vmserver1]# gluster peer probe vmserver3Probe successful

その後gluster peer statusコマンドを実行するとpeerの登録状況を確認できます。自身以外のpeerが表示されています。

[root@vmserver1]# gluster peer statusNumber of Peers: 2Hostname: vmserver2Uuid: 07048247-90dc-4148-9ba9-b7e90dfd23e5State: Peer in Cluster (Connected)Hostname: vmserver3Uuid: b3ce7bc6-2a5e-43fa-b6e9-2d2ec74bb530State: Peer in Cluster (Connected)

次にいよいよglusterfsを構成します。任意の一台のVM Serverからgluster volume createコマンドを発行します。glusterfsでは自身がマウントしているいずれかのファイルシステムの全てまたは一部の領域をglusterfs用に指定し、それをTrusted Storage Poolで合体させて一つのボリュームを構成します。このファイルシステムは新しいものを作成しても構いませんし、既存のファイルシステムのあるディレクトリを指定しても構いません。下記ではそれぞれのVM Serverの既存ファイルシステム上に/var/gluster_brickというディレクトリを作成し、そのディレクトリ以下を新しいボリューム「gluster_vol」を構成するための領域として指定しています。

[root@vmserver1]# mkdir /var/gluster_brick
[root@vmserver2]# mkdir /var/gluster_brick
[root@vmserver3]# mkdir /var/gluster_brick
[root@vmserver1]# gluster volume create gluster_vol vmserver1:/var/gluster_brick vmserver2:/var/gluster_brick vmserver3:/var/gluster_brickCreation of volume gluster_vol has been successful. Please start the volume to access data.

これで新しいglusterfsのボリュームが作成されました。
このボリュームをgluster volume startコマンドでスタートさせることでクライアントからマウントできるようになります。

[root@vmserver1]# gluster volume start gluster_volStarting volume gluster_vol has been successful

ここで焦ってはいけません。というのも、感覚的には/var/gluster_brickが共有ストレージとして使えるようになっているのかな、と思ってしまうのですが、実際はそうではなく、このボリュームを一度NFSマウントしなければなりません。
*CIFS等他のプロトコルもサポートされてますが今回はNFSに話を絞ります。
ごく一般的なglusterfsの構成は、Trusted Storage Pool、つまり分散共有ストレージを構成するglusterfsのノード群(今回でいうとVM Server)と、それをネットワーク越しにマウントするクライアントという2層に分かれます。

しかし今回はglusterfsノードがNFSクライアントも兼ねる構成になります。つまり各VM Serverが自身のglusterfsボリュームをNFSマウントすることになります。

マウントするのは[VM_SERVER]:/var/gluster_brickではなく[VM_SERVER]:gluster_volであることに注意してください。

[root@vmserver1]# mount vmserver1:gluster_vol /mnt
[root@vmserver2]# mount vmserver2:gluster_vol /mnt
[root@vmserver3]# mount vmserver3:gluster_vol /mnt

dfコマンド等でマウントした領域を確認してみてください。3つのVM Serverの容量を合わせた容量が/mntにマウントされているはずです。しかもファイルシステムの中身は3ノードで共有されています。
gluster volume createで作成したボリュームはデフォルトではデータをランダムに各VM Serverに分散させて保存します。ただしオプションがあり、replicaあるいはstripeを指定することでネットワークRAIDを行うことができます。詳しくは下記のglusterfsの管理者ガイドを参照ください。

このようにサーバと分散共有ストレージを同一筐体内におさめる構成は各モージュルの結合度が高くなるのでその設計と運用には工夫が必要となります。例えばVM Serverだけリブートしたい、と思ってもVM Serverをリブートすると必然的にストレージノードもリブートされるので相互の依存関係にオペレーションが足を引っ張られます。

デフォルトの分散モードで構成しているとストレージノードが一台ダウンするとそこそこエラいことになりますが、前述のreplica等をうまくつかってストレージがダウンしても運用を続けられるような構成を組めば今回ご紹介した環境も夢ではありません。

僕も職場のデータベースエンジニアが共有して使っているVM Server 3台に勝手にこっそりglusterfsをインストールして余っていたローカルハードディスクで分散共有ストレージを作ってみましたがなかなかどうして便利です。一度お試しあれ。

Bookmark this on Hatena Bookmark

Hatena Bookmark - glusterfsで仮想化サーバの余っているローカルハードディスクを分散共有ストレージにする

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中