medamaの日記

技術的な事をメインにしてみる。

GFSフォーマットする前に。 (5) Clusterを起動させましょう

それではインストールの完了した各Cluster Memberを完全にshutdownして再起動してみましょう。
あれ?うまく起動しない??

はい、そうです。
うまく起動しないケースが出てくると思います。
それはなぜでしょうか。
前回取り上げたQuorumが密接に関係しています。

それでは起動が完了しないというケースを再現させてみましょう。

Cluster Memberが全く起動していない状態で1nodeをシングルモードで起動します。
その他nodeは起動させません。
起動後、以下のコマンドを実行。

/etc/init.d/network start

この状態で/etc/init.d/cman startを実行し、その結果と時間を計測します。

Starting cluster:
Loading modules... done
Mounting configfs... done
Starting ccsd... done
Starting cman... done
Starting daemons... done
Starting fencing... failed

real 5m2.932s
user 0m0.057s
sys 0m0.195s

Starting daemonsまでは直ぐに完了しますが、Starting fencingにて失敗、更に失敗するまでに5分経過していました。
実際、fencedも起動していません。

cman_tool services
type level name id state
(空)

なぜでしょうか?
なお、これは正しい挙動です。

Starting fencingはCentOS5から/etc/init.d/cmanに集約されています。
/etc/init.d/cmanを覗いてみると

FENCED_START_TIMEOUT=300

という記述があります。
どうもこのパラメータによって起動までに5分も要したようです。
この状態のcman_tool statusの出力結果は以下の通りです。

Nodes: 1
Expected votes: 4
Total votes: 1
Quorum: 3 Activity blocked
Active subsystems: 5

起動時、誰とも通信できない為split brain状態(=Status:Activity blocked)であるとこのnodeは認識したようです。
確かにその通りですね。

次にStarting fencing(fence_tool join)に失敗した理由は以下の通りです。

fence_tool join(またはleave)を完了するためにはfenceドメインに参加、離脱するためにそのnodeが参加しているClusterがQuorumに達している必要がある。

というルールがfence_tool join (or leave)に存在していたからです。

Quorum: 3 Activity blocked

という状態(Quorumに達していない)、ですからStarting fencingに失敗して当然です。
今回、cman_tool joinする時/etc/cluster/cluster.confより自分が参加すべきClusterを見つけようとしましたが誰とも通信できませんでした。
従って、ひとまずClusterに自分独りの状態で参加します。
cman_tool joinに成功してもfence_tool joinまで完了しなければClusterサービスは開始されませんのでここまでは動作的にも何ら問題ありません。
次にClusterサービスを完全に開始させるためにfenceドメインに参加します。(しなければなりません。)
この時、

fence_tool join(またはleave)を完了するためにはfenceドメインに参加、離脱するためにそのnodeが参加しているClusterがQuorumに達している必要がある。

というルールに引っかかりfenceドメインの参加(fence_tool join)に失敗してしまったのです。
CLVMなしGFSをマウントするためには、

cman_tool join
fence_tool join

これらサービスの開始に成功した状態(Clusterサービスが完全に開始された状態)でなければGFSマウントはできません。

前回、同じ1node状態なのに4nodesから1nodesへ正常手順でCluster Memberをシャットダウンした時とは明らかに違うようです。
それはそうですよね。
前回は4nodes状態から意図的に各Cluster Memberがcman_tool leave removeした事を最後の1nodeは知っていますが、今回はそのような事をこの1nodeサーバは知りません。
従って、cluster.confから推測(推測せざるを得ない)してQuorumに達していない、fenceドメインに参加してはならない、Starting fencing NGとなる訳です。

それでは正しいCluster起動手順はどうすればよいのでしょうか?
推奨手順は以下の通りです。

一番初めに起動させたnodeがfence_tool joinに失敗するまでの時間である300秒以内にQuorumを得るに為に必要なその他nodesを起動させStarting fencing(fence_tool join)をそれぞれ実行する。

となります。
台数が多い管理者には残酷な手順ですが、これが推奨手順となります。
その他考えられる方法としては、初めの一台をシングルで起動、cman_tool expected -e 1などを実行して起動を継続する、または、qdiskを利用するでしょうか。
え?何十台もあってそんな時間で完了させるのは無理、という場合はFENCED_START_TIMEOUT
を調整するか推奨はされていませんが、/etc/init.d/cluster.confに以下の記述を追加します。

<fence_daemon clean_start="1" post_fail_delay="0" post_join_delay="3"/>

というようにclean_start="1"を追加します。
こちらの方法は推奨されていません。
詳しくはman 8 fencedしてください。(暇があれば追記します。)

なお、別途書きますが、fencing動作が実際に行われる前提として、

fencing動作を行うのはQuorumに達している場合だけである。

このケースの場合、cman_tool joinしてもQuorumには達していませんので、fencing動作は行われません。(行われないはず。)

ただし、例外があります。以前書きましたが、2nodes Clusterのケースです。

2nodes Clusterは1ノードだけ起動した状態でもQuorumに達します。
そんなこともあり、意図しないfencing合戦を招くことになります。
(お互いのnodeがお互いをfencingしあう状態の事。)
よって、2nodesの場合、基本的にはパラメータを調整しなければ1node起動したらもう一台も素早く起動する、というのが正しい手順になります。
そのようなこともあり2nodes Clusterはあまり推奨されない感じですのでご注意ください。
この辺りをきちんと理解せずサーバがリブートを繰り返すなどとサポートへ問い合わせると、あは~ん?言われるかもしれません。(嘘です。)
2nodesでもfencing設定をきちんと行っていればサポートされます。
つまり、2nodesでもそれ以上でも推奨fencing設定をしていなければサポートを受けられません。この辺りは後日fencingについて書く時にでも触れます。

最後にこのような理由から4node(3nodes以上)のケースの場合、のんびりCluster Memberを起動させてしまうとうまくサービスが起動しないCluster Memberが発生してしまう、という事です。
そしてそれは状況によっては正しい挙動なのです。

(非常に中途半端ですが、眠いので今日はここまで。次回はfencingについてかな。)