2010/03/26

OCFS2がだめでもGFSがあるじゃないか

さて、 前回はDRBDは順調だったものの、ocfs2の構成には失敗しました。そこでさっそくGFSを試してみようと思います。

しかし今回も作業の途中で回復の難しい状況に陥ってしまったため、VMWare上に環境を作って、その中で作業を行ないました。

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を少しだけ変更します。

/etc/drbd.confファイルの修正したnetエントリ全体

...
  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を試すことにしました。

/etc/lvm/lvm.confファイルの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ファイルの変更点

--- 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"で始まるルールを追加しました。

最終的に次のようなルールで落ち着きました。

Ubuntu用の/etc/lvm/lvm.confファイル

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を実行すると奇妙な事がわかりました。

192.168.1.210側での出力例

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に記述がある事は覚えていたので、ここを修正しました。

/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 件のコメント: