Pacemakerのリソースtimeoutのテスト方法

Pacemakerのリソースエージェントの設定にintervalやtimeoutの値があります。これはPacemakerがリソースを監視する間隔やリソース実行後に待機する時間です。この挙動をテストする時に便利なのがPacemakerのパッケージに同梱されているリソースエージェントのDummyです。今回はこのリソースエージェントを使ったtimeoutのテスト方法を紹介します。

準備

Dummyリソースエージェントのテスト環境の設定を紹介します。まずnode1、node2からなるの2台構成のクラスターのテスト環境を作り、testというprimitiveリソースを定義します。

[root@node1 ~]# crm configure show
node 1: node1.localdomain
node 2: node2.localdomain
primitive test Dummy \
	op start interval=0s timeout=300s \
	op monitor interval=10s timeout=60s \
	op stop interval=0s timeout=300s \
	meta target-role=Started
property cib-bootstrap-options: \
	stonith-enabled=false \
	have-watchdog=false \
	dc-version=1.1.21-4.el7-f14e36fd43 \
	cluster-infrastructure=corosync \
	cluster-name=dbcluster \
	no-quorum-policy=ignore
rsc_defaults rsc-options: \
	resource-stickiness=200

※propertyのstonith-enabled=false、no-quorum-policy=ignore、rsc_defaults のresource-stickiness=200はLINBIT社の推奨する設定です。

テスト環境でcrm_monコマンドで表示するとnode1でリソースtestが動いていることが判ります。

[root@node2 ~]# systemctl start pacemaker
[root@node2 ~]# crm_mon -frAD1

Online: [ node1.localdomain node2.localdomain ]

Full list of resources:

 test	(ocf::heartbeat:Dummy):	Started node1.localdomain

Node Attributes:
* Node node1.localdomain:
* Node node2.localdomain:

Migration Summary:
* Node node1.localdomain:
* Node node2.localdomain:

以上でテスト環境の準備が終わりました。

Dummyの動作確認

このリソースエージェントDummyで何ができるか確認します。

リソースエージェントDummyで定義されたリソースtestを起動すると/var/run/resource-agentsの中に”Dummy-リソース名.state”というファイルを作成します。リソースを停止するとこのファイルは削除されます。リソースエージェントDummyはただこれだけの事しか行いません。

加えて、Dummyにはリソース監視の機能があり、このファイルがあることでサービスは正常に起動中と判断します。リソースが起動しているノードでこのファイルを削除すると、Pacemakerはリソースtestが実行エラーになったと判断します。

node1でこのファイルの確認してから、削除してみましょう。

[root@node1 ~]# ls -l /var/run/resource-agents/Dummy-test.state
-rw-r----- 1 root root 0  8月 25 22:43 /var/run/resource-agents/Dummy-test.state
[root@node1 ~]# rm -f  /var/run/resource-agents/Dummy-test.state
[root@node1 ~]# 

testリソースにエラーが発生して、node2へフェールオーバーします。

Online: [ node1.localdomain node2.localdomain ]

Full list of resources:

test    (ocf::heartbeat:Dummy): Started node1.localdomain

Node Attributes:
* Node node1.localdomain:
* Node node2.localdomain:

Migration Summary:
* Node node1.localdomain:
   test: migration-threshold=1000000 fail-count=1 last-failure='Wed Aug 26 18:57:26 2020'
* Node node2.localdomain:

Failed Resource Actions:
* test_monitor_10000 on node1.localdomain 'not running' (7): call=11, status=complete, exitreaso
n='No process state file found',
    last-rc-change='Wed Aug 26 18:57:26 2020', queued=0ms, exec=0ms

test_monitor_10000とリソースの監視(monitor)でエラーが出ている事が判ります。

 

リソースのtimeoutのテスト

さて、Pacemakerの設定にあるintervalとtimeoutですが、testリソースの定義では次のようになっています。

primitive test Dummy \
	op start interval=0s timeout=300s \
	op monitor interval=10s timeout=60s \
	op stop interval=0s timeout=300s 

それぞれ、リソースの起動を開始して300秒応答を待つ、リソース起動中に10秒間隔でリソースを監視(monitor)して、60秒応答が無いとエラー、リソースの停止を実行して300秒応答待つという意味です。

リソースが300秒以上応答がないことをテストするために、リソースエージェントDummyを少し改造します。
リソースエージェントDummyは/usr/lib/ocf/resource.d/heartbeatにあります。このDummyはシェルスクリプトで、viエディタなどで開いて修正することができます。なおファイルのバックアップは必ずとっておきましょう。

Dummyファイルの100行目付近に次のような定義があります。

dummy_start() {
    dummy_monitor
    if [ $? =  $OCF_SUCCESS ]; then
        return $OCF_SUCCESS
    fi
    touch ${OCF_RESKEY_state}
}

シェルスクリプトの関数と呼ばれる記述で、リソースtestが起動する時には、必ずこの関数が呼び出されたます。関数が呼び出されてから動作が300秒以上停止すれば、timeoutのエラーが発生します。それを再現させるためにsleep命令を追加します。

 

dummy_start() {
    sleep 310
    dummy_monitor
    if [ $? =  $OCF_SUCCESS ]; then
        return $OCF_SUCCESS
    fi
    touch ${OCF_RESKEY_state}
}

リソースエージェントDummyの修正後にリソースtestを再起動します。

[root@node1 ~]# crm resource stop test
[root@node1 ~]# crm resource start test

300秒後にエラーが発生して、リソースtestはnode2で起動します。

Online: [ node1.localdomain node2.localdomain ]

Full list of resources:

test    (ocf::heartbeat:Dummy): Started node2.localdomain

Node Attributes:
* Node node1.localdomain:
* Node node2.localdomain:

Migration Summary:
* Node node1.localdomain:
   test: migration-threshold=1000000 fail-count=1000000	last-failure='Wed Aug 26 19:24:35 2020'
* Node node2.localdomain:

Failed Resource Actions:
* test_start_0 on node1.localdomain 'unknown error' (1): call=38, status=Timed Out, exitreason='
',
    last-rc-change='Wed Aug 26 19:24:05 2020', queued=0ms, exec=30007ms

今度はtest_start_0と起動中のエラーであることが判ります。

startのtimeoutの確認はできました。
monitorやstopもtimeoutの時間以上のsleep文をDummyに追加すれば、同様の動作確認ができます。