3    接続マネージャ

クラスタ化されたシステムでは,さまざまなデータとシステム・リソース (ディスクおよびファイルへのアクセスなど) を共用します。リソースの完全性を維持するための調整を行うには,クラスタにはメンバシップの明確な基準が必要で,その基準を満たしていないシステムはクラスタに参加できないようにしなければなりません。

接続マネージャは,クラスタのメンバが相互に通信できるかどうかを監視し,クラスタのメンバシップに関する規則を強制する分散型のカーネル構成要素です。接続マネージャには次のような機能があります。

接続マネージャのインスタンスは,クラスタの各メンバ上で動作します。これらのインスタンスは,クラスタのメンバシップ・リストのような情報を共有することによって,メンバ間の相互接続を維持します。接続マネージャは,三相コミット・プロトコルを使って,すべてのメンバから見えるクラスタのビューの一貫性を維持します。

この章では,次の事項について説明します。

3.1    クォーラムとボート

接続マネージャは,投票メカニズムを使用することによって,通信障害の発生時でもデータの一貫性を保証します。このメカニズムでは,ボート (投票数) が過半数に達したときに限り,クラスタ内でのプロセス動作と入出力操作を許可します。このようにクラスタ内に過半数のボートが存在する状態を,クラスタがクォーラム (定足数) を維持しているといいます。

接続マネージャはクォーラムを計算し,その結果に基づいて,システムがクラスタ・メンバになることを許可します。このような投票メカニズムは,期待ボート現在のボートノード・ボートクォーラム・ディスク・ボートなど多くの要素に依存します。この節では,これらの要素の概念について説明します。

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. 接続マネージャは,クラスタのクォーラム・ボートの計算に使用するクラスタ・メンバの集合を選択します。この集合には相互通信可能なメンバのみが含まれます。構成されているがブートされていないノード,ダウンしているメンバ,ハードウェアの障害 (クラスタのインターコネクト・ケーブルの切断やクラスタ・インターコネクト・アダプタの故障) によって通信不能になったメンバなどは含まれません。

  2. クラスタが形成され,ノードがブートされてクラスタに参加するたびに,接続マネージャは次の値から最大値を選択し,その値を使ってクラスタ期待ボートを計算します。

    たとえば,クォーラム・ディスクがない 3 メンバ構成のクラスタがあるとします。すべてのメンバは稼働中であり,相互に接続されています。各メンバのノード・ボートは 1 に設定され,期待ボートは 3 に設定されています。クラスタ期待ボートは現在 3 です。

    その後,4 番目の投票メンバがクラスタに参加するとします。この新しいメンバがブートしてクラスタに参加した場合,接続マネージャはクラスタ期待ボートを計算して,4 に設定します。この値はクラスタ内のノード・ボートの合計です。

    クラスタ期待ボートの現在の値を表示するには,clu_quorum コマンドまたは clu_get_info-full コマンドを使用します。

  3. 接続マネージャは,クラスタ期待ボートを再計算するたびに (または clu_quorum -e コマンドでクラスタ期待ボートをリセットするたびに),クォーラム・ボートを計算します。

    クォーラム・ボートは,クラスタ期待ボートの値に基づいて動的に計算されるクラスタ単位の値です。この値によって,ノードに対し,クラスタの形成,クラスタへの参加,またはクラスタへの残留を許可するかどうかが決まります。接続マネージャは,次の数式を使ってクラスタのクォーラム・ボートを計算します。

    クォーラム・ボート = (クラスタ期待ボート + 2) / 2 (小数点以下切り捨て)
    
     
    

    たとえば,手順 2 で説明した 3 メンバ構成のクラスタの場合,クラスタ期待ボートが 3 なので,クォーラム・ボートは,(3+2) / 2 で計算して小数点以下を切り捨てた結果,2 になります。4 番目のメンバが正常に追加された場合,クォーラム・ボートは,(4+2) / 2 で計算して小数点以下を切り捨てた結果,3 になります。

    注意

    期待ボートは (結果的にクォーラム・ボートも) クラスタ構成に基づきます。どのノードが稼働しているかダウンしているかには関係ありません。メンバがシャットダウンされたか,他の何らかの理由でダウンしたとき,接続マネージャはクォーラム・ボートの値を減らしません。メンバが削除されたか,clu_quorum -e コマンドが実行されたときだけ,接続マネージャは稼働中のクラスタのクォーラム・ボート値を減らします。

  4. クラスタのメンバが認識可能なボート数が変化したとき (ノードがクラスタに参加するか,既存メンバがクラスタから削除されるか,通信エラーが報告されているとき),そのメンバは常に現在のボートとクォーラム・ボートとを比較します。

    メンバは,次の条件に基づいた動作を実行します。

クォーラム・ロスはクラスタ単位のイベントのように見えますが,現在のボートとクォーラム・ボートの比較は,メンバごとに行われます。

そのメンバがどのようにクォーラムを失ったかにもよりますが,クォーラムを失ったメンバがクォーラムを満たせるだけのボートを別のメンバに割り当て,そのメンバをブートし,クォーラムを回復させることによって,この状況を解決できる場合があります。ただし,クラスタのすべてのメンバがクォーラムを失った場合は,それらのメンバがクォーラムを満たせるだけのボートを新規メンバに割り当て,その新規メンバをブートするか,クラスタ全体をリブートするか,あるいは『クラスタ管理ガイド』 に記載されているトラブルシューティングに関する手順を実行するしかありません。

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
        .
        .
        .
 

クォーラム・ディスクの使用には,次の制限が適用されます。