
フェンシングとは、コンピュータクラスタのノードが誤動作していると思われる場合に、そのノードを隔離したり、共有リソースを保護したりするプロセスです。 [ 1 ] [ 2 ]
クラスタ内のノード数が増えるにつれて、いずれかのノードが故障する可能性も高まります。故障したノードは、解放が必要な共有リソースを制御している可能性があり、ノードの動作が不安定な場合は、システム全体を保護する必要があります。そのため、フェンシングによってノードを無効化したり、共有ストレージへのアクセスを禁止したりすることで、データの整合性を確保できます。
ノードフェンス(またはI/Oフェンス)とは、共有リソースへのアクセスを許可してはならないノードを、そのリソースから分離する仮想的な「フェンス」です。アクティブノードとそのバックアップを分離することもあります。バックアップがフェンスを越えて、例えばプライマリと同じディスクアレイを制御しようとすると、データハザードが発生する可能性があります。STONITHなどのメカニズムは、このような事態を防ぐために設計されています。
ノードを隔離するとは、そのノードからI/Oが実行できなくなるようにすることです。フェンシングは通常、共有ディスクファイルシステムなどのクラスタインフラストラクチャによって自動的に行われ、ノード障害時に他のアクティブなノードがリソースを変更するのを防ぎます。SCSIの予約/解放メカニズムなど、フェンシングをサポートするメカニズムは、少なくとも1985年から存在しています。[ 3 ]
フェンシングが必要なのは、実際の障害と一時的なハングを区別することが不可能だからです。障害が発生したノードが本当にダウンしている場合、損害を与えることはないため、理論的には何も対処する必要はありません(通常の参加プロセスでクラスタに復帰させるだけで済みます)。しかし、障害が発生したノードが、クラスタの残りのノードが障害を起こしていると誤認する可能性があるため、スプリットブレイン状態が発生し、データ破損を引き起こす可能性があります。そのため、システムは最悪のシナリオを想定し、問題が発生した場合に備えて常にフェンシングを行う必要があります。
フェンシング方式には、ノード自体を無効にする方式と、共有ディスクなどのリソースへのアクセスを禁止する方式の2種類があります。[ 1 ]場合によっては、ノードが一定の時間しきい値を超えて応答しない場合、非稼働状態であるとみなされることがあります。ただし、長時間のページング暴走などの反例もあります。[ 1 ]
STONITH方式は「Shoot The Other Node In The Head」の略で、疑わしいノードを無効にするか電源をオフにすることを意味します。たとえば、パワーフェンシングでは、電源コントローラを使用して動作不能なノードをオフにします。その後、ノードは自動的に再起動して、後でクラスタに参加できます。ただし、ノードの手動再起動が必要であることをオペレーターに通知するアプローチもあります。[ 1 ]
リソースフェンシング方式では、ノードの電源をオフにせずにリソースにアクセスすることはできません。これには以下が含まれます。
クラスタにノードが2つしかない場合、予約/解放方式を2ノードSTONITHとして使用できます。ノードBが「障害」を起こしたことを検出すると、ノードAは予約を発行し、すべてのリソース(共有ディスクなど)を自身用に取得します。ノードBがI/Oを実行しようとすると(一時的にハングアップした場合など)、ノードBは無効化されます。ノードBでは、I/O障害が発生すると、ノードを強制終了するコードがトリガーされます。
永続的な予約は基本的にキーの照合であり、正しいキーを持つノードのみがI/Oを実行でき、そうでない場合はI/Oが失敗します。したがって、障害発生時にキーを変更すれば、障害発生時の適切な動作が保証されます。しかし、障害が発生したノードで常にキーを変更できるとは限りません。
STONITHは複数のクラスターに実装するより簡単でシンプルな方法ですが、リソースフェンシングのさまざまなアプローチでは、各クラスターの実装ごとに特定の実装方法が必要になります。[ 1 ]
STONITH(他のノードの頭を撃つ、または問題のあるノードの頭を撃つ)、時にはSTOMITH(他のメンバー/マシンの頭を撃つ)とも呼ばれるこの手法は、コンピュータクラスタのフェンスに使用されます。Googleの包括的な言語開発者向けドキュメントでは、この用語の使用を推奨しておらず、 「障害ノードをフェンスする」という用語に置き換えることを推奨しています。[ 4 ]
フェンシングとは、障害が発生したノードを隔離することで、コンピュータクラスタへの障害を防ぐ仕組みです。STONITHは、その名の通り、障害が発生したノードをリセットまたは電源オフすることで、障害ノードを隔離します。
クラスタにおける複数ノード間のエラー発生しやすい競合は、両方のノードが共有ストレージリソースへの書き込みを試みる場合など、壊滅的な結果を招く可能性があります。STONITHは、こうした問題に対して、やや強引ではあるものの効果的な保護機能を提供します。
シングルノードシステムでは、ウォッチドッグタイマーと呼ばれる同様のメカニズムが使用されます。ウォッチドッグタイマーは、ノードがウォッチドッグ回路に正常に動作していることを通知しない場合、ノードをリセットします。STONITHの決定は、顧客固有のプラグインなど、さまざまな決定に基づいて行うことができます。