クラスタ化されたシステムでは,さまざまなデータとシステム・リソース (ディスクおよびファイルへのアクセスなど) を共用します。リソースの完全性を維持するための調整を行うには,クラスタにはメンバシップの明確な基準が必要で,その基準を満たしていないシステムはクラスタに参加できないようにしなければなりません。
接続マネージャは,クラスタのメンバが相互に通信できるかどうかを監視し,クラスタのメンバシップに関する規則を強制する分散型のカーネル構成要素です。接続マネージャには次のような機能があります。
クラスタの形成,クラスタへのメンバの追加,およびクラスタからのメンバの削除
クラスタのどのメンバが稼働中であるかの追跡
すべてのクラスタ・メンバで一貫したクラスタ・メンバシップ・リストの保守
イベント・マネージャ (EVM) イベントを使用した,メンバシップ変更のタイムリな通知
クラスタ分断の検出と処理
接続マネージャのインスタンスは,クラスタの各メンバ上で動作します。これらのインスタンスは,クラスタのメンバシップ・リストのような情報を共有することによって,メンバ間の相互接続を維持します。接続マネージャは,三相コミット・プロトコルを使って,すべてのメンバから見えるクラスタのビューの一貫性を維持します。
この章では,次の事項について説明します。
クォーラム,ボート,およびクラスタ・メンバシップの説明 (3.1 節)
接続マネージャによるクォーラムの計算方法の説明 (3.2 節)
クォーラム・ディスクの使用時期と使用方法 (3.3 節)
接続マネージャは,投票メカニズムを使用することによって,通信障害の発生時でもデータの一貫性を保証します。このメカニズムでは,ボート (投票数) が過半数に達したときに限り,クラスタ内でのプロセス動作と入出力操作を許可します。このようにクラスタ内に過半数のボートが存在する状態を,クラスタがクォーラム (定足数) を維持しているといいます。
接続マネージャはクォーラムを計算し,その結果に基づいて,システムがクラスタ・メンバになることを許可します。このような投票メカニズムは,期待ボート,現在のボート,ノード・ボート,クォーラム・ディスク・ボートなど多くの要素に依存します。この節では,これらの要素の概念について説明します。
3.1.1 クラスタのメンバとは
クラスタのメンバシップを管理できるのは接続マネージャだけです。コマンド
clu_create
または
clu_add_member
を使ってクラスタのメンバになるようにノードを構成しても,そのノードはすぐにはクラスタのメンバになりません。メンバになるのは,クラスタ化カーネルによってリブートされ,接続マネージャによってクラスタの形成またはクラスタへの参加を許可されてからです。クラスタのメンバと,クラスタのメンバになるように構成されたノードとの違いは,クォーラムとボートについて考えるとき常に重要です。
ノードがクラスタを形成したか,クラスタに参加すると,そのノードは接続マネージャによって無期限に (ただし
clu_delete_member
を使ってクラスタから削除されるまで) クラスタのメンバとみなされます。クラスタ内でのハードウェアの故障または切断などによる通信の切断によって,既存クラスタが複数のクラスタに分断されることがあります。この状況をクラスタ分断といいます。クラスタ分断が生じると,ノードは所属先のクラスタを特定できなくなる可能性があります。ただし
3.2 節で説明するように,接続マネージャは,これらのクラスタの 1 つしか稼働させません。
3.1.2 ノード・ボート
ノード・ボートは,クラスタの 1 つのメンバがクォーラムに投じるボートの定数です。メンバには 1 または 0 (ゼロ) ノード・ボートを割り当てることができます。1 ボートを持つメンバは,クラスタの投票メンバとみなされます。0 (ゼロ) ボートを持つメンバは非投票メンバとみなされます。
投票メンバはクラスタを形成できます。非投票メンバは既存クラスタへの参加しかできません。
メンバのボートは,最初,メンバ固有の
etc/sysconfigtab
ファイル内にある,clubase
サブシステムの
cluster_node_votes
カーネル属性によって決定されます。
3.1.3 クォーラム・ディスク・ボート
一部のクラスタ構成では,3.3 節の説明に従ってクォーラム・ディスクを構成することにより,クラスタの可用性を高めることができます。クォーラム・ディスク・ボートは,クォーラム・ディスクがクォーラムに投じるボートの定数です。クォーラム・ディスクには 1 または 0 ボートを割り当てることができます。
クォーラム・ディスク・ボートは,各メンバの
etc/sysconfigtab
ファイル内にある
clubase
サブシステムのカーネル属性
cluster_qdisk_votes
によって初期化されます。
クォーラム・ディスクを構成すると,そのボートは,接続マネージャが強制する次の規則に従って,クラスタの形成で特殊な役割を果たします。
ブート・ノードは,クォーラムを満たすまでクラスタを形成できない。
ブート・ノードは,クォーラム・ディスクの所有権とそのボートを要求するために,クラスタのメンバでなければならない。
つまり,ブート・ノードがクォーラムを満たそうとしてクォーラム・ディスク・ボートを要求すると,これらの規則によってジレンマに陥ります。ブート・ノードはいつになってもクラスタを形成できません。
このジレンマから抜け出すために,接続マネージャは,ブート・ノードがクォーラムにクォーラム・ディスク・ボートを一時的に投じることができるようにします。これによって,ブート・ノードはクォーラムを満たして,クラスタを形成できます。ブート・ノードは,クラスタを形成した後,クォーラム・ディスクの所有権を要求します。この時点で,そのクォーラム・ディスクのボートは仮のボートから正式なボートになります。
3.1.4 期待ボート
期待ボートは,構成済みのボートがすべて使用可能なときに接続マネージャが期待するボートの数です。つまり期待ボートは,クラスタ内で構成済みのノード・ボートとクォーラム・ディスク・ボートとの合計です (クォーラム・ディスク・ボートはクォーラム・ディスクが構成されている場合のみ加算します)。各メンバは,それぞれ自身の期待ボートをクラスタに渡します。すべてのメンバの期待ボートの数が一致する必要があります。
接続マネージャは,クラスタのブート・メンバのノードの期待ボートを参照して,クラスタ全体の期待ボートを独自に内部で決定します。このクラスタ全体の期待ボートのことをクラスタ期待ボートといいます。接続マネージャは,自分のクラスタ期待ボートの値を使って,クラスタがクォーラムを維持するために必要なボート数 (3.2 節を参照) を決定します。
クラスタ期待ボートの現在の値を表示するには,clu_quorum
コマンドまたは
clu_get_info-full
コマンドを使用します。
clu_create
および
clu_add_member
コマンドは,新しい投票メンバまたはクォーラム・ディスクがクラスタ内に構成されると,各メンバの期待ボートを自動的に調整します。clu_delete_member
コマンドは,メンバが削除されると期待ボートの数を自動的に減らします。同じように,clu_quorum
コマンドは,クォーラム・ディスクが追加または削除されたときや,ノード・ボートがメンバに割り当てられたりメンバから削除されたときに,各メンバの期待ボートを調整します。これらのコマンドにより,メンバ固有の期待ボート値はどのクラスタ・メンバでも同じで,すべてのノード・ボートとクォーラム・ディスク・ボート (クォーラム・ディスクが構成されている場合) の合計になります。
メンバの期待ボートは,メンバ固有の
etc/sysconfigtab
ファイル内の,clubase
サブシステムの
cluster_expected_votes
カーネル属性によって初期化されます。メンバの期待ボートを表示するには,clu_quorum
コマンドを使用します。
3.1.5 現在のボート
現在のボートは,クラスタ内で実際に見えるボートの数です。期待ボートの数がクラスタ内で構成されたボートの数と一致する場合,現在のボートは,現在オンラインのメンバと構成済みクォーラム・ディスクが投じたボートの合計です。
3.2 クラスタ・クォーラムの計算
接続マネージャは,クォーラム・アルゴリズムを使って,あるノードがクラスタに参加し,クラスタ全体のリソースに安全にアクセスして,有用な作業を実行できるかどうかを調べます。このアルゴリズムは動的です。つまり,クラスタのクォーラム・ボートの計算はクラスタのイベントによって開始され,その計算結果はクラスタの存在期間に渡って変化します。ここでは,接続マネージャのクォーラム・アルゴリズムの仕組みについて説明します。
クォーラム・アルゴリズムは次のように機能します。
接続マネージャは,クラスタのクォーラム・ボートの計算に使用するクラスタ・メンバの集合を選択します。この集合には相互通信可能なメンバのみが含まれます。構成されているがブートされていないノード,ダウンしているメンバ,ハードウェアの障害 (クラスタのインターコネクト・ケーブルの切断やクラスタ・インターコネクト・アダプタの故障) によって通信不能になったメンバなどは含まれません。
クラスタが形成され,ノードがブートされてクラスタに参加するたびに,接続マネージャは次の値から最大値を選択し,その値を使ってクラスタ期待ボートを計算します。
手順 1 で選択したメンバの集合から取得したメンバの期待ボートのうちの最大値
手順 1 で選択したメンバの集合から取得したノード・ボートとクォーラム・ディスク・ボート (クォーラム・ディスクが構成されている場合) との合計
前回のクラスタ期待ボート値
たとえば,クォーラム・ディスクがない 3 メンバ構成のクラスタがあるとします。すべてのメンバは稼働中であり,相互に接続されています。各メンバのノード・ボートは 1 に設定され,期待ボートは 3 に設定されています。クラスタ期待ボートは現在 3 です。
その後,4 番目の投票メンバがクラスタに参加するとします。この新しいメンバがブートしてクラスタに参加した場合,接続マネージャはクラスタ期待ボートを計算して,4 に設定します。この値はクラスタ内のノード・ボートの合計です。
クラスタ期待ボートの現在の値を表示するには,clu_quorum
コマンドまたは
clu_get_info-full
コマンドを使用します。
接続マネージャは,クラスタ期待ボートを再計算するたびに (または
clu_quorum -e
コマンドでクラスタ期待ボートをリセットするたびに),クォーラム・ボートを計算します。
クォーラム・ボートは,クラスタ期待ボートの値に基づいて動的に計算されるクラスタ単位の値です。この値によって,ノードに対し,クラスタの形成,クラスタへの参加,またはクラスタへの残留を許可するかどうかが決まります。接続マネージャは,次の数式を使ってクラスタのクォーラム・ボートを計算します。
クォーラム・ボート = (クラスタ期待ボート + 2) / 2 (小数点以下切り捨て)
たとえば,手順 2 で説明した 3 メンバ構成のクラスタの場合,クラスタ期待ボートが 3 なので,クォーラム・ボートは,(3+2) / 2 で計算して小数点以下を切り捨てた結果,2 になります。4 番目のメンバが正常に追加された場合,クォーラム・ボートは,(4+2) / 2 で計算して小数点以下を切り捨てた結果,3 になります。
注意
期待ボートは (結果的にクォーラム・ボートも) クラスタ構成に基づきます。どのノードが稼働しているかダウンしているかには関係ありません。メンバがシャットダウンされたか,他の何らかの理由でダウンしたとき,接続マネージャはクォーラム・ボートの値を減らしません。メンバが削除されたか,
clu_quorum -e
コマンドが実行されたときだけ,接続マネージャは稼働中のクラスタのクォーラム・ボート値を減らします。
クラスタのメンバが認識可能なボート数が変化したとき (ノードがクラスタに参加するか,既存メンバがクラスタから削除されるか,通信エラーが報告されているとき),そのメンバは常に現在のボートとクォーラム・ボートとを比較します。
メンバは,次の条件に基づいた動作を実行します。
現在のボートの値がクォーラム・ボートの値以上であれば,そのメンバは実行を続行するか,再開 (中断状態だった場合) します。
現在のボートの値がクォーラム・ボートより小さい場合,入出力はすべて中断され,クラスタ・インターコネクト・インタフェースを除くネットワーク・インタフェースはすべてオフになります。クラスタ単位のリソースにアクセスするコマンドは,そのメンバ上では動作せず,ハングしたように見えます。
この状態は,十分なボートが追加され (つまり,十分なメンバがクラスタに参加するか通信上の問題が修復されて),現在のボートがクォーラム以上になるまで続きます。
クォーラム・ロスはクラスタ単位のイベントのように見えますが,現在のボートとクォーラム・ボートの比較は,メンバごとに行われます。
そのメンバがどのようにクォーラムを失ったかにもよりますが,クォーラムを失ったメンバがクォーラムを満たせるだけのボートを別のメンバに割り当て,そのメンバをブートし,クォーラムを回復させることによって,この状況を解決できる場合があります。ただし,クラスタのすべてのメンバがクォーラムを失った場合は,それらのメンバがクォーラムを満たせるだけのボートを新規メンバに割り当て,その新規メンバをブートするか,クラスタ全体をリブートするか,あるいは『クラスタ管理ガイド』 に記載されているトラブルシューティングに関する手順を実行するしかありません。
3.3 クォーラム・ディスクの使用
2 メンバのクラスタ構成で,期待ボートが 2 で各メンバにメンバ・ボートが 1 票ずつある場合,メンバを 1 つ失うとクラスタはクォーラムを失い,すべてのアプリケーションが中断されます。このような構成では,可用性は高くありません。
より現実的な (しかし,実質的により良いわけではない) 2 メンバ構成で,1 つのメンバにボートを 1 票割り当て,もう一方のメンバには 0 (ゼロ) 票を割り当てているとします。この場合,期待ボートは 1 になります。このクラスタは 2 番目のメンバ (0 票を持つメンバ) を失っても継続して動作できます。ただし,最初のメンバ (1 票を持つメンバ) を失うことはできません。
このような構成の可用性を高めるために,共用バス上のディスクをクォーラム・ディスクとして指定できます。クォーラム・ディスクは,期待ボートの合計にボートを 1 つ追加するための,仮想的なクラスタ・メンバの働きをします。2 メンバのクラスタにクォーラム・ディスクが構成されている場合,クォーラム・ディスクやメンバの 1 つに障害が発生してもクラスタは持ちこたえて,動作を続けます。
たとえば,図 3-1
に示すように,クォーラム・ディスクのない,2 メンバの
deli
クラスタがあるとします。
図 3-1: クォーラム・ディスクのない,2 メンバの deli クラスタ
1 つのメンバのノード・ボートは 1 票で,もう一方のメンバのノード・ボートは 0 (ゼロ) 票で,クラスタ期待ボートは 1 です。接続マネージャは,次のようにクォーラム・ボートを計算します。
クォーラム・ボート = (クラスタ期待ボート + 2) / 2 (小数点以下切り捨て) = (1 + 2) /2 = 1
salami
メンバの障害やシャットダウン時には,polishham
メンバがクォーラムを失います。クラスタの動作は中断されます。
ただし,クラスタにクォーラム・ディスクがあり (クラスタ期待ボートの合計にボートを 1 票追加する),メンバ
polishham
にも 1 票与えられると,期待ボートは 3 になり,クォーラム・ボートは 2 のままです。
クォーラム・ボート = (クラスタ期待ボート + 2) / 2 (小数点以下切り捨て) = ( 3 + 2 ) / 2 = 2
メンバの 1 つ,またはクォーラム・ディスクがクラスタから失われても,クラスタがクォーラムを失わないだけの現在のボートが残ります。図 3-2
のクラスタは,動作を続けます。
図 3-2: メンバが 1 つ失われても持ちこたえる,クォーラム・ディスクがある 2 メンバの deli クラスタ
clu_create
ユーティリティを使用すると,クラスタの作成時にクォーラム・ディスクを指定し,それにボートを 1 票割り当てることができます。また,clu_quorum
ユーティリティを使用すると,後でクォーラム・ディスクを追加することができます。たとえば,clu_delete_member
コマンドを実行した結果として,可用性の低下した 2 メンバ構成のクラスタになった場合などです。
クォーラム・ディスクを構成するには,clu_quorum -d add
コマンドを使用します。たとえば,次のコマンドは,/dev/disk/dsk11
をボート 1 票を持つクォーラム・ディスクとして定義します。
# clu_quorum -d add dsk11 1 Collecting quorum data for Member(s): 1 2 Initializing cnx partition on quorum disk : dsk11h Successful quorum disk creation # clu_quorum Collecting quorum data for Member(s): 1 2 Quorum Data for Cluster: deli as of Thu Mar 9 09:59:18 EDT 2000 Cluster Common Quorum Data Quorum disk: dsk11h . . .
クォーラム・ディスクの使用には,次の制限が適用されます。
クラスタは,クォーラム・ディスクを 1 台だけ持つことができる。
クォーラム・ディスクは,すべてのクラスタ・メンバに直接接続されている共用バス上に置く。
この位置にない場合,クォーラム・ディスクに直接接続されていないメンバは,直接接続されているメンバよりも早くクォーラムを失うことがあります。
クォーラム・ディスクには,データを置いてはならない。
clu_quorum
コマンドは,クォーラム・ディスクの初期化時に既存のデータを上書きします。実行中のクラスタからクォーラム・ディスクに置かれたデータ (またはファイル・システムのメタデータ) の完全性は,メンバに障害が発生すると保証されなくなります。
メンバのブート・ディスクとクラスタ単位のルート (/
) を含むディスクは,クォーラム・ディスクとしては使用しないでください。
クォーラム・ディスクは,小さくても構わない。
クラスタ・サブシステムでは,ディスクを 1 MB だけ使用します。
クォーラム・ディスクには,ボートが 1 票あるか,ボートがない (0 (ゼロ) 票) かのどちらかである。
通常,クォーラム・ディスクには常にボートを割り当てなければなりません。1 メンバ・クラスタのような,テスト構成または一時的な構成では,既存のクォーラム・ディスクにボートを割り当てないこともできます (このような構成では,投票クォーラム・ディスクが第 2 の故障点になることがあります)。
クォーラム・ディスクでは,LSM (Logical Storage Manager) は使用できない。