さて、 前回はDRBDは順調だったものの、ocfs2の構成には失敗しました。そこでさっそくGFSを試してみようと思います。
しかし今回も作業の途中で回復の難しい状況に陥ってしまったため、VMWare上に環境を作って、その中で作業を行ないました。
- ocfs2のアンインストール
- GFSの導入
- clvmの稼働
- 物理ボリューム(PV)の作成
- Node addresses: 127.0.1.1の修正
- ファイルシステムの作成
- VMWare上ではUbuntuとDebian lenny間で共有ファイルシステムが動いたものの
ocfs2のアンインストール
DRBDの構成はそのままで良いので、/etc/fstabも編集していないですし、サービスを停止してパッケージを削除します。
$ sudo /etc/init.d/ocfs2 stop $ sudo apt-get remove ocfs2-tools $ sudo dpkg --purge ocfs2-tools $ sudo apt-get autoremove
変更されている/etc/ocfs2/cluster.confは削除されませんが、後で使うかもしれないので、そのままにしておきました。
GFSの導入
Debian lennyへのパッケージ導入
ドキュメントに従ってdrbd.confを少しだけ変更します。
...
net {
cram-hmac-alg sha1;
shared-secret "FooFunFactory";
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
...
両方のサーバで変更したdrbd.confの内容を反映させます。
$ sudo /sbin/drbdadm adjust r0
/etc/init.d/drbdスクリプトを使うと次のようになり、 これは内部でdrbdadm adjust allを呼び出しています。
$ sudo /etc/init.d/drbd reload
DRBDのステータスを確認しておきます。
$ sudo /etc/init.d/drbd status
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by root@vmgfsl02, 2010-03-24 00:43:08 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Primary UpToDate/UpToDate C
続いてgfs関連のパッケージを導入します。
$ sudo apt-get install gfs-tools clvm redhat-cluster-modules-2.6-686
Ubuntu 8.04にパッケージを導入する
drbd.confはdebianと同じように修正します。
$ sudo /sbin/drbdadm adjust r0
導入するパッケージはほとんど同じですが、カーネルモジュールの指定は不要なのでgfs-toolsとclvmだけです。
$ sudo apt-get install gfs-tools clvm
clvmの稼働
まずclvmdを起動する前に/etc/init.d/cmanスクリプトの起動に成功しなければなりません。 そのためには/etc/cluster/cluster.confファイルを配置します。 しかしディレクトリからして存在していないので、手動でファイルを配置します。
/etc/cluster/cluster.confファイルの配置
$ sudo mkdir /etc/cluster $ sudo vi /etc/cluster/cluster.conf
<?xml version="1.0" encoding="UTF-8" ?> <cluster name="gwlogcl" config_version="1"> <dlm plock_ownership="1" plock_rate_limit="0"/> <cman two_node="1" expected_votes="1"> </cman> <clusternodes> <clusternode name="vmgfsl01" votes="1" nodeid="1"> <fence> <method name="single"> <device name="human" ipaddr="10.0.0.2"/> </method> </fence> </clusternode> <clusternode name="vmgfsl02" votes="1" nodeid="2"> <fence> <method name="single"> <device name="human" ipaddr="10.0.0.3"/> </method> </fence> </clusternode> </clusternodes> <fence_devices> <fence_device name="human" agent="fence_manual"/> </fence_devices> </cluster>
これは samba.orgのドキュメントにあるcluster.confをコピーして、clusterのname属性を適当な名前に、clusternodeのname属性2個所を実際のホスト名に変更して、deviceのipaddrを対応するIPアドレスに変更したものです。
ファイルの準備が終れば、両方のノードでcmanコマンドを実行します。
$ sudo /etc/init.d/cman start
これが正常に起動すればclvmのプロセスをスタートします。
$ sudo /etc/init.d/clvm start
ここまでが無事に終るとGFSを使うために必要なクラスターの準備ができたことになります。
物理ボリューム(PV)の作成
既に/dev/drbd0は作成済みで同期が取れている状態なので、どちらかでPVを作成します。
$ sudo /sbin/pvcreate /dev/drbd0
ここで$ sudo pvdisplay
を実行すると重複した定義を発見したというエラーと作成した領域が表示されるはずです。
Ubuntuでのlocking_typeの変更
/etc/lvm/lvm.confを修正し、locking_type = 3にする指示はwww.drbd.jpのドキュメントにありましたが、これはmanによればコンパイル時に"--with-cluster=internal"のオプション付きでないと意味がないようです。
そこでapt-get source lvm2
でconfigureの引数を調べたところ"...=shared"となっていたので、locking_type = 2を試すことにしました。
--- lvm.conf.orig 2010-03-25 18:14:00.000000000 +0900
+++ lvm.conf 2010-03-25 18:14:28.000000000 +0900
@@ -235,7 +235,7 @@
# if LVM2 commands get run concurrently).
# Type 2 uses the external shared library locking_library.
# Type 3 uses built-in clustered locking.
- locking_type = 1
+ ##locking_type = 1
# If using external locking (type 2) and initialisation fails,
# with this set to 1 an attempt will be made to use the built-in
@@ -265,9 +265,9 @@
# Enable these three for cluster LVM when clvmd is running.
# Remember to remove the "locking_type = 1" above.
#
- # locking_library = "liblvm2clusterlock.so"
- # locking_type = 2
- # library_dir = "/lib/lvm2"
+ locking_library = "liblvm2clusterlock.so"
+ locking_type = 2
+ library_dir = "/lib/lvm2"
# The external locking library to load if locking_type is set to 2.
# locking_library = "liblvm2clusterlock.so"
Debianでのlocking_typeの変更
debianのlvm2パッケージを確認するとコンパイル時のオプションは"--with-cluster=none"となっています。 これではうまく使えないのでlvm2パッケージを再コンパイルします。
まずビルドに必要な関連パッケージを導入します。
$ sudo apt-get build-dep lvm2
次にパッケージのソースファイルを展開して修正します。
$ apt-get source lvm2 $ cd lvm2-2.02.39 $ vi debian/rules
--- debian/rules.orig 2010-03-26 13:04:42.000000000 +0900
+++ debian/rules 2010-03-26 12:51:56.000000000 +0900
@@ -62,6 +62,7 @@
./configure CFLAGS="$(CFLAGS)" \
$(CONFIGURE_FLAGS) \
--with-optimisation="" \
+ --with-cluster=shared \
--with-clvmd=cman \
--enable-readline
touch $@
ここでパッケージの再作成を行ないます。
$ dpkg-buildpackage -rfakeroot $ cd .. $ sudo dpkg -i clvm_2.02.39-7_amd64.deb lvm2_2.02.39-7_amd64.deb
パッケージを導入してから、Ubuntuの時と同じように/etc/lvm/lvm.confファイルを編集します。
/etc/lvm/lvm.confでのfilter行の修正
ここでlvm.confのfilter行を修正して、$ sudo pvdisplay
コマンドが期待通りに動くようにしたいと思います。
ここではLMVに認識させるPVの名前を/dev/drdb0にします。 方法についてはdrbdのドキュメントの DRBDリソースを物理ボリュームとして構成するがまとまっているようです。
LVMをDRBD以外に使わないのであればドキュメントにあるように[ "a/drbd.*/", "r/.*/" ]
のようなルールがシンプルになると思います。
他のPVとの競合を避けるのであれば、drbdを構成するデバイス名を"r/sdb.*/"のように書き、最後に... "a/drbd.*/", "a/.*/" ]
を配置します。
この手前までにPVとして間違って認識された名前を外すように"r"で始まるルールを追加しました。
最終的に次のようなルールで落ち着きました。
filter = [ "r/sdb.*/", "r!/dev/disk/.*!", "a/drbd.*/", "a/.*/" ]
もしdebian lennyであれば、さらに真ん中に"r!/dev/block/.*!"
ぐらいのルール追加が必要になるはずです。
Node addresses: 127.0.1.1の修正
"clvmd: cluster is not running. Aborting."というメッセージが表示されてしまい、clvmが起動しなかったのですが、/etc/init.d/clvmスクリプトをみると"cman_tool status"を実行した戻り値(Return Code == RC)が0でないからのようです。
両方のノードで$ sudo cman_tool statusを実行すると奇妙な事がわかりました。
Version: 6.1.0
Config Version: 3
Cluster Name: gwlogcl
Cluster Id: 13734
Cluster Member: Yes
Cluster Generation: 0
Membership state: Cluster-Member
Nodes: 1
Expected votes: 1
Total votes: 1
Quorum: 1
Active subsystems: 7
Flags: 2node Dirty
Ports Bound: 0
Node name: vmgfsl02
Node ID: 2
Multicast addresses: 239.192.53.219
Node addresses: 127.0.1.1
この中にある"Nodes: 1"は他のノードを見つけられていないからですが、最後のNode addresses: 127.0.1.1は他のノードからアクセスできないアドレスなので、どうもこれが関係していそうです。
Debian系ではインストール時に入力したホスト名は127.0.1.1に紐付けられることが多いと思います。 /etc/hostsに記述がある事は覚えていたので、ここを修正しました。
127.0.0.1 localhost
10.0.0.3 vmgfsl02
ここで両方のノードでcmanを再起動します。
$ sudo /etc/init.d/cman restart
両方のノードが無事に起動して、念のため$ sudo cman_tool statusでNodes: 2に増えていることを確認。 続いて両方のノードでclvmを起動します。
$ sudo /etc/init.d/clvm restart
ファイルシステムの作成
いよいよgfsを作成しますが、まだPVだけしか作成していませんでしたが、気にせずgfsを作成します。 これは片側だけで実行することにします。
$ sudo gfs2_mkfs -t gwlogcl:drbd0 -p lock_dlm -j 2 /dev/drbd0
とりあえず、VMWare上では無事に動いたようです。 そのため設定ファイルがとりあえず動くものであることは分かりました。
VMWare上ではUbuntuとDebian lenny間で共有ファイルシステムが動いたものの
しかし当初のubuntuとdebian lennyの組み合せで試していた方はcmanが起動しない、おかしな状況になってしまい修復が難しい状況になってしまいました。
Starting cluster manager:
Loading kernel modules: done
Mounting config filesystem: done
Starting cluster configuration system: done
Joining cluster:cman_tool: Cannot open connection to cman, is it running ?
done
Starting daemons: groupd fenced dlm_controld gfs_controld
Joining fence domain:fence_tool: can't communicate with fenced -1
done
Starting Quorum Disk daemon: done
一度はclvmdまでちゃんと動いて、両方からpvが認識できたんですけどね。 どういうタイミングかよくわからないなまま、パッケージを入れ直しても戻らないようになってしまいました。
いずれにしてもgfs/clvmはquorumの考え方があるので基本的には起動時にクラスタメンバー全体が稼働しているのが前提だと思います。 いろいろ考慮するとocfs2がお手軽に思えます。
今回の目的はログファイルを別のマシンからも取り出せるようにしたいという事なので、read-onlyでマウントできればそれでも良いんですよね。 GFSはNFSやらSambaやらの常に全ノードが稼働してクラスタによる冗長性が必要なストレージバックエンドとして使うのが良いんだろうと思います。
この目的なら単純にext3でフォーマットして必要な時だけ$ sudo mount -o ro ...でマウントすれば良いんだと思いますけどね。
0 件のコメント:
コメントを投稿