pingdはipfailに代わるコマンドです。バージョン2のほかのコマンドと同様に、任意の数のノードを含んだクラスタ内の接続性を確保する機能を提供します(および相対的な接続性に基いたリソースの実装)。
pingdの役割は、ノードの接続性の変更を検出して、同時に、その情報をCIBに更新することです。
管理者は、接続性が最も高いノードのリソースを特定するため、pingdがCIBに入れた情報を使用してください。 これは、pingdによって生成された属性を参照する位置制約を(管理者が)作成することで実行できます。下記の「位置制約でpingd出力を使用する」をご参照ください。
pingdの構成には、次の2つのオプションがあります。
1つ目は、respawn命令をha.cfに追加するオプションです。
respawn root /usr/lib/heartbeat/pingd -m 100 -d 5s
pingdに渡されるオプションの意味については、下記の「pingdの使用方法」を参照してください。
2つ目は、pingdのOCFリソースエージェントを使用してcloneを作成するオプションです。RAはrootとして開始されるので、「apiauth pingd uid=root」などの行をha.cfに追加してください。より適切な方法としては、user=haclusterのパラメータをRA構成に追加し、respawnメソッドと同じようにapiauth命令を使用こともできます。バージョン2.0.6では、指定したユーザーが書き込みパーミッションを持つ場所(/tmp/pingd-defaultなど)を指定するパラメータpidfileも追加する必要があります。
いずれの方法でも、ha.cfファイルにpingノードが含まれていなければなりません。RAのhost_listパラメータでは、ほかのホストではなく、サブセットのみ使用できます。
いずれの方法でも、CIBに最低1つのコロケーション制約を追加してください。下記の「位置制約でpingd出力を使用する」をご参照ください。
リソースエージェントを使用するメリットとして、以下が実行できます。
以下に、上記のrespawn命令に相当するリソースです。
<clone id="pingd"> <instance_attributes id="pingd" globally_unique="false"> <attributes> <nvpair id="pingd-clone_node_max" name="clone_node_max" value="1"/> </attributes> </instance_attributes> <primitive id="pingd-child" provider="heartbeat" class="ocf" type="pingd"> <operations> <op id="pingd-child-monitor" name="monitor" interval="20s" timeout="40s" prereq="nothing"/> <op id="pingd-child-start" name="start" prereq="nothing"/> </operations> <instance_attributes id="pingd_inst_attr"> <attributes> <nvpair id="pingd-dampen" name="dampen" value="5s"/> <nvpair id="pingd-multiplier" name="multiplier" value="100"/> </attributes> </instance_attributes> </primitive> </clone>
注: CIBに含まれる属性の場所を変更することは、たとえ可能な場合でも、お勧めはできません。各ノードの属性のコピーが複数作成されてしまうことになり、クラスタが予期せぬ動作をすることがあります。
usage: pingd [-V?p:a:d:s:S:h:Dm:] --help (-?) This text --daemonize (-D) Run in daemon mode --pid-file (-p) <filename> File in which to store the process' PID * Default=/tmp/pingd.pid --attr-name (-a) <string> Name of the node attribute to set * Default=pingd --attr-set (-s) <string> Name of the set in which to set the attribute * Default=cib-bootstrap-options --attr-section (-S) <string> Which part of the CIB to put the attribute in * Default=status --ping-host (-h) <single_host_name> Monitor a subset of the ping nodes listed in ha.cf (can be specified multiple times) --attr-dampen (-d) <integer> How long to wait for no further changes to occur before updating the CIB with a changed attribute --value-multiplier (-m) <integer> For every connected node, add <integer> to the value set in the CIB * Default=1
respawn root /usr/lib/heartbeat/pingd -m 100 -d 5s -a default_ping_set
Node |
Connected Ping Nodes |
default_ping_set Value |
c001n01 |
5 |
500 |
c001n02 |
4 |
400 |
c001n03 |
5 |
500 |
c001n04 |
N/A |
N/A |
c001n05 |
0 |
0 |
<rsc_location id="my_resource:connected" rsc="my_resource"> <rule id="my_resource:connected:rule" score_attribute="default_ping_set"> <expression id="my_resource:connected:expr:defined" attribute="default_ping_set" operation="defined"/> </rule> </rsc_location>
以下は、上記の制約の内容です。
default_ping_setに値を設定するよう要求する(c001n04は変更しない)
default_ping_setの値を100より大きく設定するよう要求する(c001n05は変更しない)
c001n01で実行するmy_resourceの設定を500増加させる
c001n02で実行するmy_resourceの設定を400増加させる
c001n03で実行するmy_resourceの設定を500増加させる
ノード |
接続するPingノード |
default_ping_setの値 |
複合スコア |
c001n01 |
5 |
500 |
500 |
c001n02 |
4 |
400 |
400 |
c001n03 |
5 |
500 |
500 |
c001n04 |
N/A |
N/A |
0 |
c001n05 |
0 |
0 |
0 |
例として、以下の制約があると仮定します。
<rsc_location id="my_resource:preferred" rsc="my_resource"> <rule id="my_resource:prefer:c001n01" score="100"> <expression id="my_resource:prefer:c001n01:expr" attribute="#uname" operation="eq" value="c001n01"/> </rule> <rule id="my_resource:prefer:c001n02" score="200"> <expression id="my_resource:prefer:c001n02:expr" attribute="#uname" operation="eq" value="c001n02"/> </rule> <rule id="my_resource:prefer:c001n03" score="300"> <expression id="my_resource:prefer:c001n03:expr" attribute="#uname" operation="eq" value="c001n03"/> </rule> <rule id="my_resource:never" score="-INFINITY" boolean_op="or"> <expression id="my_resource:never:c001n04:expr" attribute="#uname" operation="eq" value="c001n04"/> <expression id="my_resource:never:c001n05:expr" attribute="#uname" operation="eq" value="c001n05"/> </rule> </rsc_location>
その場合、リソースを実行するために更新されたスコアは、以下のようになります。
ノード |
接続するPingノード |
default_ping_setの値 |
複合スコア |
c001n01 |
5 |
500 |
600 |
c001n02 |
4 |
400 |
600 |
c001n03 |
5 |
500 |
800 |
c001n04 |
N/A |
N/A |
-INFINITY |
c001n05 |
0 |
0 |
-INFINITY |
現時点では、リソースが実行されていないか、resource stickinessがゼロに設定されている場合、リソースはc001n01とc001n02をともにバックアップとしてc001n03で開始されます。
ただし、リソースがc001n02で実行され、resource_stickinessが1000に設定されている場合、更新されたスコアは以下のようになります。
ノード |
接続するPingノード |
default_ping_setの値 |
複合スコア |
c001n01 |
5 |
500 |
600 |
c001n02 |
4 |
400 |
1600 |
c001n03 |
5 |
500 |
800 |
c001n04 |
N/A |
N/A |
-INFINITY |
c001n05 |
0 |
0 |
-INFINITY |
さらに、リソースは、c001n02で実行されたままになります。
あるいは、resource_stickinessが100に設定されている場合、スコアは以下のようになります。
ノード |
接続するPingノード |
default_ping_setの値 |
複合スコア |
c001n01 |
5 |
500 |
600 |
c001n02 |
4 |
400 |
700 |
c001n03 |
5 |
500 |
800 |
c001n04 |
N/A |
N/A |
-INFINITY |
c001n05 |
0 |
0 |
-INFINITY |
さらに、リソースはc001n03に移動されます。
以下は、正しく設定することの重要性を示したものです。
pingdの--value-multiplierオプション
default_resource_stickiness / resource_stickiness
rsc_location制約のscore
以下の行をha.cfに追加します。
respawn root /usr/lib/heartbeat/pingd -m 100 -d 5s -a pingd
この制約をCIBに追加します。
ping接続が失われた際、特定のサービスを終了した方がよい場合もあります。このルールでは、外部へのping接続が確立されない場所からサービスを実行することを禁止しています。ある程度の接続が確立された全てのノードは、pingノードにアクセスできる数には関係なく同様に扱われます。
<rsc_location id="my_resource:connected" rsc="my_resource"> <rule id="my_resource:connected:rule" score="-INFINITY" boolean_op="or"> <expression id="my_resource:connected:expr:undefined" attribute="pingd" operation="not_defined"/> <expression id="my_resource:connected:expr:zero" attribute="pingd" operation="lte" value="0"/> </rule> </rsc_location>
もちろん、デフォルト(pingd)以外の属性名を設定するようにpingd デーモンを構成した場合は、attributeをpingdからpingdデーモンが使用するように構成した名前に変更する必要があります。
注: pingを送信したノードが停止するか、ハートビートがノードへの接続性を失った場合、あらゆるリソースが停止されてしまいます。代わりに、最高の接続性が確立された、ノードを優先するスコア の使用を検討してください。
pingdの適切な使用方法の1つをご紹介します。この方法では、pingd属性値がルールのスコアになります。そのため、設定する--value-multiplier は、ほかの条件に割り当てたスコアによって大きく異なります。このルールでは、全てのノードが外部への接続性を失っってしまうと、リソースが完全に停止されます。
ほとんどの場合、 が特定のルールのスコアとして直接設定した属性値を許可することが妥当と言えるでしょう。
例えば、pingdの倍率を100に設定し、1つのノードへのアクセスが100に相当する場合、2つのノードは200に相当します。
このように、ほかの全ての条件が同等である場合には、最も高いping接続が確立されたノードが選択されるのです。複数のノードのスコアが同じ場合には、次のルールに従えば、同等の重要性が与えられます。
<rsc_location id="my_resource:connected" rsc="my_resource"> <rule id="my_resource:connected:rule" score_attribute="pingd" > <expression id="my_resource:connected:expr:defined" attribute="pingd" operation="defined"/> </rule> </rsc_location>
もちろん、デフォルト(pingd)以外の属性名を設定するようにpingdデーモンを構成した場合には、score_attributeの名前をpingdから、pingdデーモン用に構成した名前に変更する必要があります。