コミュニケーションパスを通じて疎通確認を行い、Quorum チェックを行います。クラスター内の過半数のノードと疎通ができることで、Quorum を持っていると判断します。本モードは、ノード数が奇数のクラスターで推奨されます。
Majority モードの設定
%LKROOT%/etc/default/LifeKeeper 設定ファイルで QUORUM_MODE の設定を majority に設定してください。QUORUM_MODE を majority に設定した場合、WITNESS_MODE は remote_verify に設定する必要があります。Majority モードの場合の Witness モードの設定
QUORUM_MODE で majority を使用する場合、WITNESS_MODE を remote_verify に設定する必要があります。
Majority モードの期待される動作(標準の設定を仮定)
ノード A(リソースは稼働状態)、ノード B(リソースは待機状態)、そしてノード C(リソースは待機状態)の3ノード構成のクラスターの振る舞いについて説明します。
ノード障害に関するリソースの状態を変更し得るイベントは以下の3つです。
- COMM_DOWN イベント
ノード間のコミュニケーションパスが全て切断した時に呼び出されるイベント。
- COMM_UP イベント
COMM_DOWN 状態からコミュニケーションパスが復旧した際に呼び出されるイベント。
- LCM_AVAIL イベント
LCM の初期化が終わった時に呼び出されるイベントで、LifeKeeper 起動時に1度だけ呼び出される。一度 LCM_AVAIL になると、接続が確立されたコミュニケーションパス上でクラスター内の他ノードへのハートビートの伝送が開始される。また、他ノードからのハートビート要求の受信も受けられるようになる。LCM_AVAIL イベントの処理は必ず COMM_UP イベントの処理より前に行われる。
シナリオ 1
ノード A とノード B の間のコミュニケーションパス通信に障害が発生
この場合、以下のように動作します。
- ノード A とノード B は、COMM_DOWN イベントの処理を開始します。ただし、全く同時とは限りません。
- 両方のノードは Quorum チェックを実行し、両方共自身が Quorum を持っていると判断します(ノード A とノード B の両方からノード C が見えているため、既知の3ノードのうちの2ノードと疎通があるため多数派にいると判断します)。
- 各ノードは、まだ通信可能な別のノードに対し、自ノードと通信できなくなったノードの実際の状態について問い合わせ(Witness チェック)を行います。このシナリオでは、ノード A がノード B のステータスについてノード C に問い合わせ、ノード B がノード A のステータスについてノード C に問い合わせることになります。
- ノード A とノード B は共に ノード C への問い合わせによって他方のノードがまだ生存していると判断し、フェイルオーバー処理は発生しません。リソースはノード A で 稼働状態のままになります。
シナリオ 2
ノード A に障害が発生してノード A が停止
この場合、ノード B は以下の動作をします。
- ノード A との COMM_DOWN イベントの処理を開始します。
- ノード C と通信が可能なため、Quorum を持っていると判断します。
- ノード A が見えないことをノード C に確認した後、通常のフェイルオーバー処理を開始します。
- イクイバレンシーの値が最も低いノードがイベントの処理を続行し、保護されたリソースを 稼働状態にします。
ノード C は以下の動作をします。
- ノード A との COMM_DOWN イベントの処理を開始します。
- ノード B と通信が可能なため、Quorum を持っていると判断します。
- ノード A が見えないことをノード B に確認した後、通常のフェイルオーバー処理を開始します。
- イクイバレンシーの値が最も低いノードがイベントの処理を続行し、保護されたリソースを 稼働状態にします。
リソースがノード B で稼働中に、他のノードと通信可能な状態でノード A のサーバーが電源ON
この場合、ノード A は LCM_AVAIL イベントを処理します。ノード A は、Quorum を持っていると判断し、ノード B でリソースが稼働中のためリソースを起動させません。次に、ノード A とノード B、ノード A とノード C との COMM_UP イベントが各ノードで発生します(ノード A では2回発生する)。COMM_UP イベント中、各ノードは Quorum を持っていると判断し、またノード B でリソースが稼働中のためリソースは起動させません。
リソースがノード B で稼働中に、他のノードと通信不能な状態でノード A のサーバーが電源ON
この場合、ノード A は LCM_AVAIL イベントを処理し、ノード B とノード C はノード A と通信できないので何もしません。ノード A は、3ノードのうちの1ノード(自分自身)としか通信できないため Quorum を持っていないと判断します。Quorum を持っていないため、ノード A はリソースを起動させません。
シナリオ 3
ノード A のネットワークに障害が発生(ノード A は稼働しているが、他のノードと通信不能)
この場合、ノード A は以下の動作をします。
- ノード B との COMM_DOWN イベントの処理を開始します(ほぼ同時に、ノードC との COMM_DOWN イベントの処理も開始されます)。
- ノード B ともノード C とも通信ができないため、Quorum を持っていないと判断します。
- LifeKeeper に設定されている QUORUM_LOSS_ACTION(OSU) パラメータの設定に従ってノードの強制再起動などの動作を行い、リソースを停止します。
- LifeKeeper は、QUORUM_QUARANTINE_SECS で指定された期間、すべてのノードとの通信を一時停止します。
- 指定した時間を過ぎると LifeKeeperは通信を再開します。
ノード B は以下の動作をします。
- ノード A との COMM_DOWN イベントの処理を開始します。
- ノード Cとまだ通信が可能なため、Quorum を持っていると判断します。
- ノード A が見えないことをノード C に確認(Witness チェック)した後、通常のフェイルオーバー動作を開始します。
- イクイバレンシーの値が最も低いノードがイベントの処理を続行し、保護されたリソースを 稼働状態にします。
ノード C は以下の動作をします。
- ノード A との COMM_DOWN イベントの処理を開始します。
- ノード B とまだ通信が可能なため、Quorum を持っていると判断します。
- ノード A が見えないことをノード B に確認(Witness チェック)した後、通常のフェイルオーバー動作を開始します。
- イクイバレンシーの値が最も低いノードがイベントの処理を続行し、保護されたリソースを 稼働状態にします。
リソースがノード B で稼働中に、ノード A の通信が回復
この場合、ノード B は COMM_UP イベントを処理し、Quorum を持っている(3ノードすべてが見える)ことと、稼働中のリソースを持っていることを判断します。ノード A は、COMM_UP イベントを処理し、Quorum を持っていることと、リソースが別のノードで稼働中であることを判断します。この時点では、ノード A はリソースを起動させません。
シナリオ 4
3つのノードすべてが他のノードと通信不能
この場合、ノード A は以下の動作をします。
- ノード B との COMM_DOWN イベントの処理を開始します(ほぼ同時に、ノード C との COMM_DOWN イベントの処理も開始されます)。
- ノード B ともノード C とも通信ができないため、Quorum を持っていないと判断します。
- LifeKeeper は QUORUM_LOSS_ACTION の設定に従って動作します。
ノード B は以下の動作をします。
- ノード A との COMM_DOWN イベントの処理を開始します(ほぼ同時に、ノード C との COMM_DOWN イベントの処理も開始されます)。
- ノード A ともノード C とも通信ができないため、Quorum を持っていないと判断します。
- 稼働状態のリソースがないので、QUORUM_LOSS_ACTION (OSU)に従った動作は行いません。
ノード C は以下の動作をします。
- ノード A との COMM_DOWN イベントの処理を開始します(ほぼ同時に、ノード B との COMM_DOWN イベントの処理も開始されます)。
- ノード A ともノード B とも通信ができないため、Quorum を持っていないと判断します。
- 稼働状態のリソースがないので、QUORUM_LOSS_ACTION (OSU)に従った動作は行いません。
コミュニケーションパスが復旧した場合、ノード A 上でリソースが起動します。なお、本動作となるためには、以下の 2条件を満たす必要があります。
- ノード A のリソースに設定された初期化設定値が AUTORES_ISP であること。
- リソースにセットされた優先度がノード A で最も高い値であること。
このトピックへフィードバック