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で現在のスコアを表示して、設定に誤りがないか確認することを勧めます。