RMSが起動すると、すべてのグラフノードの初期状態はUnknownとなります。RMSは、個々のグラフノードが自らの状態を判断するために必要な情報を獲得してから、この状態を変更します。
グラフノードが自らの状態を判断するために必要な情報とは、以下のとおりです。
ディテクタを保持するグラフノードの場合-ディテクタからの最初の通知
子を持つグラフノード-子の状態に関するメッセージ
上記より、以下の2つの結論が導き出されます。
ディテクタの存在しないリーフノードは、ディテクタからの通知を受けることがなく、かつ、グラフノードの状態を子の状態からも類推することができないことになります。この場合、Unknownの状態が残ってしまうため、RMS構成としては認められない構成となります。
Unknownからの状態遷移は、リーフノードからuserApplicationオブジェクトへと続くボトムアップ形式で行われます。リーフノードの上位グラフノードはすべて、自己の状態を識別するためには、まず、子の状態を取得する必要があります。
ポイント
SysNodeオブジェクトおよびuserApplicationオブジェクトには、対応するハードウェアのディテクタがありません。SysNodeオブジェクトはベースモニタから直接ディテクタのレポートを受信します。 userApplicationオブジェクトの状態は、その子の状態から判断します。
userApplicationオブジェクトの状態がUnknownから変更された段階で、userApplicationの初期化処理が完了し、RMSの制御が開始されます。
userApplicationオブジェクトの初期化プロセスは、互いのuserApplicationに対して無関係で行われます。したがって、あるuserApplicationオブジェクトがOnline、OfflineまたはStandbyの状態に変化しても、他のuserApplicationオブジェクトはUnknownの状態のままである場合があります。
SysNodeオブジェクトの初期化プロセスもまた、他とは無関係に行われます。SysNodeオブジェクトは、ディテクタの通知を受信した後に初期のUnknown状態から他の状態へ遷移します。
Unknown状態は初期状態のときのみ存在し、一度Unknown状態から他の状態へ変化したグラフノードが、Unknown状態に戻ることはありません。
構成例
以下にfuji2RMSおよびfuji3RMS上で実行するよう構成設定されたアプリケーションappを例にとってRMSの処理を説明します。
fuji2RMSおよびfuji3RMSの各ノードには、そのノードと同じ名前のSysNodeオブジェクトが1つ存在します。
アプリケーションが実行される各SysNodeでは、対応するuserApplicationオブジェクトがタイプandOpの子を持ち、これらの子にはこのSysNodeの名前がHostName属性として与えられています。このアプリケーションでのノードの優先順位は、userApplicationオブジェクトでノードを定義した順序によって決定します。
ベースモニタはこのレベルのandOpオブジェクトについて、HostName属性の値がローカルノード名に対応すればローカルオブジェクトであると判断し、対応しなければリモートオブジェクトと判断します。 ベースモニタは、すべてのリモートオブジェクトを無視します。このため、ローカルオブジェクトとその子だけが処理されます。
この論理ANDオブジェクトの子として、他の資源 (Cmdlineサブアプリケーションやローカルファイルシステム) がそれぞれの内部的な依存関係に基づいて構成されます。
オブジェクト階層を以下の図に示します。
図2.1 初期化の例におけるオブジェクト階層
図の階層には、アプリケーションの親として、SysNodeオブジェクトが含まれています。慣例で記載されることがありますが、SysNodeオブジェクトはいかなる形でもアプリケーションオブジェクトに依存していません。しかし、SysNodeオブジェクトを記載することにより、アプリケーションの子であるandOpオブジェクトがどのノードを表しているのかが明確になります。SysNodeオブジェクトはGUIが生成するグラフにも表示されますが、その場合は、アプリケーションが現在実行されているノードを示すことが主目的です。
RMS Wizard Toolsによって作成されたこの構成のRMSグラフを以下に示します。
図2.2 初期化におけるシステムグラフの例-RMS Wizard Toolsの構成
タイトルバーにはグラフが描かれたノードの名前fuji2RMSが表示されます。fuji2RMSとappを結ぶ線は緑です。これはノードにOnlineのアプリケーションがあることを示しています。
以下は、「hvdisp -a」による出力を示しています。
図2.3 初期化におけるhvdisp出力の例-RMS Wizard Toolsの構成
hvdispの出力に対応させるため、実際のグラフにはリソース名のデータも含まれています。リソース名は、Cluster Adminの [rms] タブ表示のグラフで [Preferences] メニューから [Show Resource Names] を選択することにより表示されます。
RMS Wizard Tools によって実際に生成されるオブジェクト名には、図2.1 初期化の例におけるオブジェクト階層のオブジェクト名よりも複雑な名称が使われていることがあります。図2.1 初期化の例におけるオブジェクト階層は、一般的なオブジェクト名を使用した抽象化されたグラフです。さらに実際のグラフには、正しい動作を保証するために、依存関係が自動的に挿入されています。 Cluster Adminの [Preferences] メニューから別の項目を選択すると、さらに詳細な項目や追加のオブジェクトおよび依存関係が表示されます。
実際のグラフに出現する追加項目や複雑な名称についての知識は、RMSの動作の基本を理解する上では必要ありません。 説明を簡単にするため、この章の例では主に抽象化されたグラフと一般的な名称を使います。
例1
図2.1 初期化の例におけるオブジェクト階層に示された構成では、以下のような処理が順に行われます。これはfuji2RMSで動作するモニタの場合でも同じです。
RMSが起動します。
SysNodeオブジェクトのディテクタはクラスタノードの状態をベースモニタに通知します。
cmdおよびlfsリソースのディテクタは、それぞれの状態をOfflineと報告します。
lfsはリーフノードであるため、即座にOffline化して、その状態変化を親に通知します。
ディテクタの通知と子の通知を受信すると、cmdには、それぞれの状態を決定するために必要な情報が揃ったことになります。cmdはOffline化し、その状態変化を親andOp1に通知します。
ポイント
andOp2は、fuji2RMSのベースモニタにより無視されるリモートノードです。
andOp1は、ディテクタを持たない論理オブジェクトです。このオブジェクトは子のメッセージを利用して自らのOffline状態を検出し、その状態変化をappに通知します。
appも、ディテクタを持たないオブジェクトです。ローカルノードに対応する子andOpがOffline化すると、appもOffline化します。
appのローカル子オブジェクトすべてが、Unknown状態に遷移すると、初期化プロセスは完了します。