Pacemakerのスコアについて

Pacemakerはクラスタのリソース管理をスコアをもとに管理しています。ノード毎のリソースのスコアを計算し、スコアが高いノードにリソースを配置します。今回はこのスコアについて解説します。

1.スコアの計算方法の説明

スコアの計算はPacemakerがリソースの配置やフェイルオーバーを最適化するために行うプロセスです。以下では、MySQLクラスタを例に取り、スコア変化の要素を説明します。MySQLクラスタの設定はこちらの記事で紹介しています。

2.初期スコア

設定例で示したMySQLクラスタは、node1でDRBDがPrimaryになり、ファイルシステムが/var/lib/mysqlにマウントされ、MariaDBが起動しています。なぜ2つのノードのうちnode1でMariaDBが起動するのでしょうか?それはlocationの設定が影響しています。

location l_mariadb rg_mariadb 100: node1

この設定の意味はrg_mariadbというリソースグループのnode1でのスコアを100にする条件を定義するになります。l_mariadbは条件(位置制約)の名前です。このスコアの設定で、node1のrg_mariadbの点数はnode2の点数より大きくなり、node1でrg_mariadbが動きやすくなります。

3.スコアの調べる方法

crm_simulateを使うと、スコアをわかりやすく表示できます。
実際の表示例を紹介します。

[root@node1 ~]# crm_simulate -Ls

Current cluster status:
Online: [ node1 node2 ]

 Resource Group: rg_mariadb
     res_ipadr  (ocf::heartbeat:IPaddr2):        Started node1
     res_fsmnt  (ocf::heartbeat:Filesystem):     Started node1
     res_mysql  (ocf::heartbeat:mysql):  Started node1
 Clone Set: ms_drbd_r0 [res_drbd_r0] (promotable)
     Masters: [ node1 ]
     Slaves: [ node2 ]

Allocation scores:
pcmk__group_allocate: rg_mariadb allocation score on node1: 100
pcmk__group_allocate: rg_mariadb allocation score on node2: 0
pcmk__group_allocate: res_ipadr allocation score on node1: 300
pcmk__group_allocate: res_ipadr allocation score on node2: 0
pcmk__group_allocate: res_fsmnt allocation score on node1: 200
pcmk__group_allocate: res_fsmnt allocation score on node2: 0
pcmk__group_allocate: res_mysql allocation score on node1: 200
pcmk__group_allocate: res_mysql allocation score on node2: 0
pcmk__clone_allocate: ms_drbd_r0 allocation score on node1: 700
pcmk__clone_allocate: ms_drbd_r0 allocation score on node2: 0
pcmk__clone_allocate: res_drbd_r0:0 allocation score on node1: 10200
pcmk__clone_allocate: res_drbd_r0:0 allocation score on node2: 0
pcmk__clone_allocate: res_drbd_r0:1 allocation score on node1: 0
pcmk__clone_allocate: res_drbd_r0:1 allocation score on node2: 10200
pcmk__native_allocate: res_drbd_r0:0 allocation score on node1: 10200
pcmk__native_allocate: res_drbd_r0:0 allocation score on node2: 0
pcmk__native_allocate: res_drbd_r0:1 allocation score on node1: -INFINITY
pcmk__native_allocate: res_drbd_r0:1 allocation score on node2: 10200
res_drbd_r0:0 promotion score on node1: 11400
res_drbd_r0:1 promotion score on node2: 10000
pcmk__native_allocate: res_ipadr allocation score on node1: 10900
pcmk__native_allocate: res_ipadr allocation score on node2: -INFINITY
pcmk__native_allocate: res_fsmnt allocation score on node1: 400
pcmk__native_allocate: res_fsmnt allocation score on node2: -INFINITY
pcmk__native_allocate: res_mysql allocation score on node1: 200
pcmk__native_allocate: res_mysql allocation score on node2: -INFINITY

Transition Summary:

Allocation scores:を見ると現在のスコアが判ります。

4.スコアの意味

それでは、スコアの意味を順に説明します。最初の行にrg_mariadbの情報があり、node1は100、node2が0になっていることが判ります。

pcmk__group_allocate: rg_mariadb allocation score on node1: 100
pcmk__group_allocate: rg_mariadb allocation score on node2: 0

これは初期スコアで設定した値になります。

次のres_ipadrですが、node1で起動しているので、node1の初期スコア100にresource-stickiness=200が加算された値で300になります。node2は0です。

pcmk__group_allocate: res_ipadr allocation score on node1: 300
pcmk__group_allocate: res_ipadr allocation score on node2: 0

rg_mariadb の値は初期スコアで設定した値で変動しませんが、res_ipadr のスコアはPacemakerの状態により変動します。もし、フェールオーバしてnode2でサービスが動いていると、スコアは100と200になります。

そのあとに続くres_fsmntとres_mysqlは初期スコアの影響を受けないので、それぞれ200となります。

5.DRBDのスコア

ms_drbd_r0のスコアは700になっていますが、これはリソースの数にresource-stickiness=200の値を掛け、さらにノードの初期スコアを追加した値です

pcmk__clone_allocate: ms_drbd_r0 allocation score on node1: 700
pcmk__clone_allocate: ms_drbd_r0 allocation score on node2: 0

ちなみに、node2にフェールオーバーするとnode1の初期スコア100が残り、600がnode2の値になります。

pcmk__clone_allocate: ms_drbd_r0 allocation score on node1: 100
pcmk__clone_allocate: ms_drbd_r0 allocation score on node2: 600

続く情報はDRBDリソースのノード毎のスコアです。DRBDのベースのスコアは10000でこれにresource-stickiness=200を追加した10200がスコアになります。res_drbd_r0:0 と res_drbd_r0:1 は、リソース res_drbd_r0 のクローンインスタンスを意味していますが、それぞれのノードでDRBDリソースは起動しているので、どちらかが10200ポイントになり、残りは0、もしくは-INFINITYになります。

INFINITYはPacemakerのスコアとして大きな値を意味していて、-INFINITYはとても小さい値になります。

pcmk__clone_allocate: res_drbd_r0:0 allocation score on node1: 10200
pcmk__clone_allocate: res_drbd_r0:0 allocation score on node2: 0
pcmk__clone_allocate: res_drbd_r0:1 allocation score on node1: 0
pcmk__clone_allocate: res_drbd_r0:1 allocation score on node2: 10200
pcmk__native_allocate: res_drbd_r0:0 allocation score on node1: 10200
pcmk__native_allocate: res_drbd_r0:0 allocation score on node2: 0
pcmk__native_allocate: res_drbd_r0:1 allocation score on node1: -INFINITY
pcmk__native_allocate: res_drbd_r0:1 allocation score on node2: 10200

6.プロモーションスコア(promotion score)

それぞれのノードのスコアの合計は次の値になります。
まずはnode1がプライマリの場合のスコアです。先程のcrm_simulateの結果はnode1がすでにPraimaryになっているので、表示されている値が現在のスコアです。

res_drbd_r0:0 promotion score on node1: 11400
res_drbd_r0:1 promotion score on node2: 10000

フェールオーバーしてnode2がプライマリになっている場合のスコアは次になります。

res_drbd_r0:0 promotion score on node2: 11200
res_drbd_r0:1 promotion score on node1: 10200

このようにnode1のスコアが11400で、node2の11200を上回っているので、この設定ではnode1がPacemakerが起動した直後にアクティブノード(Primary)になります。node1のDRBDがPrimaryになり、Pacemakerの制約条件により、リソースグループが起動し、VIPやファイルシステムマウント、MariaDBの起動が行われます。

このpromotion score の計算は次のようになります。

promotion score = base score (10000)
+ location constraint × 2 (例: +200)
+ resource-stickiness × リソース数 (例: +200×3×2 = +1200)

base score 10000は決まった値です。location constraint はノードごとの点数で今回はnode1が100、node2が0でした。resource-stickinessは200が設定されています。

7.まとめ

このようにPacemakerはノードごとのスコアを計算して、スコアが高いノードでリソースを起動します。この仕組みを使えば、node1が起動している時には、必ずこのノードでサービスを起動するような設定ができます。

location l_mariadb rg_mariadb inf: node1

infはINFINITYの設定での記述方法です。inf:とするとnode1のpromotion scoreはINFINITYになりますので、node1で必ずサービスが起動します。(node1が停止したら、node2へフェールオーバーします。)

逆に-infとすると、そのノードではサービスは動作しなくなります。

運用中のPacemakerクラスターが正しくフェールオーバーしない場合は、まずcrm_simulateで現在のスコアを表示して、設定に誤りがないか確認することを勧めます。