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に追加すれば、同様の動作確認ができます。