障害検知

ノード障害の検知方法

ノード障害は、ハートビート、およびQuorum Disk(クォラムディスク)を利用して検知します。Quorum Diskの使用はオプションです。通常は、2ノード構成に特有の問題を防止するために利用します。3ノード以上の構成では、一般には、使用しなくても困ることはありません。

ハートビートによる障害検知

クラスタを構成するノードはハートビート・パケットを交換することで、クラスタのトポロジー(どのノードとどのノードが通信可能か)を把握します。ハートビートを確認できないノードが見つかった場合、フェンスデバイスを用いて該当のノードを強制再起動した上で、残ったノードでサービスの継続を行います。

ただし、ハートビート・ネットワークの障害でクラスタが複数の島に分断された場合(スプリットブレインと呼びます)は、Quorumの計算により、生き残る(相手側を強制再起動する)島が決定されます。

Quorumの計算方法

設定ファイルにて、次の値を設定します。

    • 各ノードのVote数(通常は、1ノードに1Vote)

    • 全ノードが正常稼働している場合のVoteの合計値(expected_votes)

この時、expected_votesの過半数以上がQuorum値になります(expected_votes=3ならQuorum=2)。スプリットブレイン発生時は、各島でノードのVoteの合計を計算して、これがQuorumに達した島が生き残ります。「多数決」のような仕組みです。

[注意] 偶数ノード構成の場合、半数ずつに分かれると両方の島がQuorumに達せずにサービスが停止します。3ノード以上の構成では、必ず奇数ノードの構成にする必要があります。

2ノード構成の場合は、専用のオプション(two_node="1")を指定するか、後述のQuorum Diskを利用するか、どちらかの選択が必要です。two_node="1"を指定した場合、スプリットブレイン発生時は、両方のノードがお互いに相手の再起動を試みて、「早い者勝ち」で生き残るノードが決まります。

[注意] ただし、タイミングによっては両方のノードが再起動してサービスが停止する恐れがあります。この問題を回避するには、Quorum Diskを使用する必要があります。

Quorum Diskによる障害検知

Quorum Diskには大きくは2つの役割があります。

    1. ハートビートに追加でノード障害の検知方法を提供する。

    2. 2ノード構成時の同時再起動の発生を回避する方法を提供する。

1. 通常稼働時、各ノードは定期的に稼働情報をQuorum Diskに書き込みます。一定時間、稼働情報の書き込みを行わなかったノードは、障害が発生したものと判断されて、他のノードからフェンスデバイスによる強制再起動が行われます。また、I/O障害などで、Quorum Diskにアクセスできなくなったノードは、自発的に再起動を行います。さらに、オプションとして、ユーザが作成したスクリプトによるヘルスチェック(Heuristicと呼びます)を定期的に実施することも可能です。ヘルスチェックに失敗したノードは、自発的に再起動を行います。

[注意]ハートビートによる障害検知時間は、Quorum Diskによる障害検知時間の2倍以上に設定する必要があります。

2. 2ノード構成時にスプリットブレインが発生すると、両方のノードがお互いに強制再起動を実施する問題を回避するには、次のどちらかの方法を用います。

    • master_winsオプションを指定する。

    • どちらかのノードのみが成功するHeuristicを定義する。

master_winsをオプションを指定すると、Quorum Diskによる情報交換を通じて、内部的に選択されるマスタノードが稼働を継続して、相手ノードを強制再起動します。基本的には、この方法がお勧めです。

例外的にHeuristicを使用した方がよい場合として、サービスネットワークとハートビート・ネットワークを兼用している場合があります。例えば、サービスネットワークに接続したNIC障害でハートビートが切断した場合は、NIC障害が起きたノードを強制再起動することが望まれます。そこで、サービスネットワーク上のゲートウェイへのping到達を確認するというHeuristicを用いると、NIC障害が起きたノードはヘルスチェックに失敗して、意図通りの動作になります。

なお、master_winsオプションとHeuristicを併用することはできません。