Pacemakerで負荷分散用途のNginxサーバーを冗長化する(後編)

前編では、負荷分散用途の2台のNginxサーバーをPacemakerで冗長化する設定手順をまとめました。
後編では、とくに運用面の、Packmakerの動作、自動/手動フェイルオーバーなどについて記載します。

1. はじめに
2. サーバー構成
3. 設定手順
 3.1. Nginxの設定
 3.2. Pacemaker+Corosyncの設定
4. 今回の設定におけるPacemakerの動作(今回はここから)
5. 手動フェイルオーバー手順
6. 想定する障害と具体的なPacemakerの動作
7. おわりに

isd4. 今回の設定におけるPacemakerの動作

今回の設定におけるPacemakerの動作について、特に僕が気になった点をまとめておきます。

  • Nginxの制御

Pacemakerの管理下にあります。
このため、スタンバイノードのNginxサービスは停止されています。

  • Nginxの監視

Nginxの監視は、サービスプロセスの監視であり、HTTPのレスポンスやTCPポートの監視ではありません。
このためプロセスが生きていながら、何らかの原因でレスポンス応答がない場合には、フェイルオーバーは発生しないはずです(動作確認は行っていませんが。。)。

  • フェイルオーバー時の動作

監視対象のリソースに何らかの障害が発生したとき、もしくは手動フェイルオーバーを実施したときは、もう1台のノードがアクティブとなります。
いわゆる「切り替わり」ですね。
フェイルオーバーしたサーバーでNginxが起動し、ネットワークインタフェースにVirtual IPアドレスが割り当てられます。

  • 他ノードの監視

各ノードは、ネットワーク経由で相手のノードを監視しており、相手との通信が途絶えたとき、フェイルオーバーを実行し、自らがアクティブとなります。

  • 優先順位と自動フェイルバック

今回の設定では2つのノードに対して優先順位をつけていません。
また、自動フェイルバックはしない設定(デフォルト)となっています。
ノードを2台とも停止したときなど、アクティブなノードが1つもない状態からノードを起動したときは、先にPacemakerを起動したノードがアクティブとなります。
また、自動フェイルオーバーが発生したあとの自動フェイルバック(元のノードへの自動切り戻し)は発生しません。

なお、Pacemakerに関連するログは、以下に出力されますので、より深く調査したいときや、意図した動作をしないときは、確認するとよいでしょう。

  • pcsコマンドのログ: /var/log/pcsd/pcsd.log
  • Corosyncクラスター制御ログ: /var/log/cluster/corosync.log
  • Pacemakerリソース制御ログ: /var/log/pacemaker/pacemaker.log

isd5. 手動フェイルオーバー手順

手動フェイルオーバーにより、アクティブなノードを変更することができます。
手動フェイルオーバーを実施したいケースとしては、以下などが考えられます。

  • フェイルオーバーを試したい
  • サーバーを1台ずつメンテナンスしたい
  • 自動フェイルオーバーした状態からフェイルバック(切り戻し)したい

手動フェイルオーバーするには、以下の3つの方法があります。

  1. pcs resource move コマンドでリソースを移動する
  2. pcs node standby コマンドでアクティブなノードをスタンバイ状態とする
  3. アクティブなノードでpacemakerサービスを停止する

「手動フェイルオーバー」という意味では、1または2が好ましいと思いますが、3は操作がシンプルかつ簡単です。

手動フェイルオーバーを実行する際は、事前に pcs status コマンドを実行し、出力結果の「Node List:」表示が、2ノードとも「Online」となっていることに注意します。

手動フェイルオーバー方法1. pcs resource move コマンドでリソースを移動する

まず、Pacemakerで、pm-test1 がアクティブになっていることを確認します。

(pm-test1)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-12 15:51:17 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 12 12:51:17 2023
  * Last change:  Wed Apr 12 12:50:35 2023 by root via crm_resource on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List:」で、pm-test1, pm-test2 が2台とも Online となっています。
また、「Full List of Resources:」で、pm-test1 がアクティブとなっています。

pcs resource move コマンドで、リソースグループ rg01 を pm-test2 にフェイルオーバーします。

 # pcs resource move rg01 pm-test2

Warning: A move constraint has been created and the resource 'rg01' may or may not move depending on other configuration

↑「A move constraint(制約)」が作成された、というWarningメッセージが出力されました。

数秒で、pm-test2 へのフェイルオーバーが完了します。
このとき、pm-test1 のNginxは停止しました。

 # systemctl status nginx

● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor pres>
   Active: inactive (dead)

Apr 12 15:45:20 pm-test1 systemd[1]: Stopping The nginx HTTP and reverse proxy >
Apr 12 15:45:20 pm-test1 systemd[1]: nginx.service: Succeeded.
Apr 12 15:45:20 pm-test1 systemd[1]: Stopped The nginx HTTP and reverse proxy s>
Apr 12 15:50:11 pm-test1 systemd[1]: Starting Cluster Controlled nginx...
Apr 12 15:50:11 pm-test1 nginx[75851]: nginx: the configuration file /etc/nginx>
Apr 12 15:50:11 pm-test1 nginx[75851]: nginx: configuration file /etc/nginx/ngi>
Apr 12 15:50:11 pm-test1 systemd[1]: Started Cluster Controlled nginx.
Apr 12 15:51:56 pm-test1 systemd[1]: Stopping The nginx HTTP and reverse proxy >
Apr 12 15:51:56 pm-test1 systemd[1]: nginx.service: Succeeded.
Apr 12 15:51:56 pm-test1 systemd[1]: Stopped The nginx HTTP and reverse proxy s

 

pm-test2 で操作してみます。
Pacemakerの状態を確認します。

(pm-test2)

 # pcs status

Cluster name: cluster01

WARNINGS:
Following resources have been moved and their move constraints are still in place: 'rg01'
Run 'pcs constraint location' or 'pcs resource clear <resource id>' to view or remove the constraints, respectively

Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-12 15:53:59 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 12 15:53:59 2023
  * Last change:  Wed Apr 12 15:51:56 2023 by root via crm_resource on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test2
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test2
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑pm-test1 がスタンバイ(standby)、pm-test2 がアクティブとなっていることがわかります。
また、冒頭で「rg01の move constraints(制約)が存在している」というWarningメッセージが出力されています。

Nginxのサービスステータスを確認すると、Nginxが起動しています。

 # systemctl status nginx

● nginx.service - Cluster Controlled nginx
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor pres>
  Drop-In: /run/systemd/system/nginx.service.d
           mq50-pacemaker.conf
   Active: active (running) since Wed 2023-04-26 15:51:58 JST; 3min 29s ago
  Process: 8064 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 8062 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 8060 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status>
 Main PID: 8065 (nginx)
    Tasks: 3 (limit: 4588)
   Memory: 5.6M
   CGroup: /system.slice/nginx.service
           tq8065 nginx: master process /usr/sbin/nginx
           tq8066 nginx: worker process
           mq8067 nginx: worker process

Apr 12 15:51:58 pm-test2 systemd[1]: Starting Cluster Controlled nginx...
Apr 12 15:51:58 pm-test2 nginx[8062]: nginx: the configuration file /etc/nginx/>
Apr 12 15:51:58 pm-test2 nginx[8062]: nginx: configuration file /etc/nginx/ngin>
Apr 12 15:51:58 pm-test2 systemd[1]: Started Cluster Controlled nginx.

 

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test2.
</body>
</html>

↑pm-test2 にアクセスしています。
無事、フェイルオーバーを確認できました。

ここで、pm-test1 にフェイルバックする(切り戻す)には、pcs resource clear コマンドでフェイルオーバー時に作成された制約(constraint)を削除し、pcs resource move を実行します。

まず、制約を確認します。

(pm-test1 or pm-test2)

 # pcs constraint

Location Constraints:
  Resource: rg01
    Enabled on:
      Node: pm-test2 (score:INFINITY) (role:Started)
    Constraint: location-rg01
      Rule: boolean-op=or score=-INFINITY
        Expression: pingd lt 1
        Expression: not_defined pingd
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

↑リソースグループ rg01 の Constraints(制約)が「Enable on」となっています。
「Constraint: location-rg01」は、もともと設定してあった、pingdのロケーションの制約設定です。

pcs resource clear コマンドで、rg01の制約を削除します。

 # pcs resource clear rg01

Removing constraint: cli-prefer-rg01

 

再度、制約を確認します。

 # pcs constraint

Location Constraints:
  Resource: rg01
    Constraint: location-rg01
      Rule: boolean-op=or score=-INFINITY
        Expression: pingd lt 1
        Expression: not_defined pingd
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

↑リソースグループ rg01 の Constraints(制約)「Enable on」がなくなりました。

再度、Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-12 16:02:18 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 12 16:02:19 2023
  * Last change:  Wed Apr 12 15:59:45 2023 by root via crm_resource on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test2
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test2
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑冒頭のWarningメッセージがなくなりました。

pcs resource move コマンドで、リソースグループ rg01 を pm-test1 にフェイルバックします。

 # pcs resource move rg01 pm-test1

Warning: A move constraint has been created and the resource 'rg01' may or may not move depending on other configuration

 

数秒で、pm-test1 へのフェイルオーバーが完了します。
Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01

WARNINGS:
Following resources have been moved and their move constraints are still in place: 'rg01'
Run 'pcs constraint location' or 'pcs resource clear <resource id>' to view or remove the constraints, respectively

Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-12 16:05:32 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 12 16:05:32 2023
  * Last change:  Wed Apr 12 16:05:21 2023 by root via crm_resource on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑pm-test1 がアクティブ、pm-test2 がスタンバイ(standby)となっていることがわかります。
また、先ほどフェイルオーバーしたときと同様に、冒頭で制約に関するWarningメッセージが出力されています。

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test1.
</body>
</html>

↑pm-test2 にアクセスしています。
無事、フェイルオーバーを確認できました。

このとき、pm-test2 のNginxは停止しています。

 # ps aux | grep nginx

root       14037  0.0  0.1 221940  1168 pts/1    S+   16:06   0:00 grep --color=auto nginx

 

制約が存在することを確認し、削除します。

 # pcs constraint

Location Constraints:
  Resource: rg01
    Enabled on:
      Node: pm-test1 (score:INFINITY) (role:Started)
    Constraint: location-rg01
      Rule: boolean-op=or score=-INFINITY
        Expression: pingd lt 1
        Expression: not_defined pingd
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

 # pcs resource clear rg01

Removing constraint: cli-prefer-rg01

 # pcs constraint

Location Constraints:
  Resource: rg01
    Constraint: location-rg01
      Rule: boolean-op=or score=-INFINITY
        Expression: pingd lt 1
        Expression: not_defined pingd
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

 

再度、Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-12 16:09:43 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 12 16:09:43 2023
  * Last change:  Wed Apr 12 16:08:50 2023 by root via crm_resource on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑冒頭のWarningメッセージがなくなりました。
これで、pm-test1 から pm-test2 へのフェイルオーバーと、pm-test2 から pm-test1 へのフェイルバック(切り戻し)は完了です。

手動フェイルオーバー方法2. pcs node standby コマンドでアクティブなノードをスタンバイ状態とする

まず、Pacemakerで、pm-test1 がアクティブになっていることを確認します。

(pm-test1)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-13 17:59:13 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Fri Apr 14 17:59:14 2023
  * Last change:  Thu Apr 13 17:40:33 2023 by hacluster via crmd on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List:」で、pm-test1, pm-test2 が2台とも Online となっています。
また、「Full List of Resources:」で、pm-test1 がアクティブとなっています。

pm-test2 にフェイルオーバーするため、pcs node standby コマンドで、pm-test1 をスタンバイ状態とします。

 # pcs node standby pm-test1

 

数秒で、pm-test2 へのフェイルオーバーが完了します。
このとき、pm-test1 のNginxは停止しました。

 # systemctl status nginx

● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor pres>
   Active: inactive (dead)

Apr 13 17:56:28 pm-test1 systemd[1]: Starting Cluster Controlled nginx...
Apr 13 17:56:28 pm-test1 nginx[3215]: nginx: the configuration file /etc/nginx/>
Apr 13 17:56:28 pm-test1 nginx[3215]: nginx: configuration file /etc/nginx/ngin>
Apr 13 17:56:28 pm-test1 systemd[1]: Started Cluster Controlled nginx.
Apr 13 18:03:18 pm-test1 systemd[1]: Stopping The nginx HTTP and reverse proxy >
Apr 13 18:03:18 pm-test1 systemd[1]: nginx.service: Succeeded.
Apr 13 18:03:18 pm-test1 systemd[1]: Stopped The nginx HTTP and reverse proxy s>

 

pm-test2 で操作してみます。
Pacemakerの状態を確認します。

(pm-test2)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-13 18:03:24 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Thu Apr 13 18:03:25 2023
  * Last change:  Thu Apr 13 18:03:18 2023 by root via cibadmin on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Node pm-test1: standby
  * Online: [ pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test2
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test2
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test2 ]
    * Stopped: [ pm-test1 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑pm-test1 がスタンバイ(standby)、pm-test2 がアクティブとなっていることがわかります。

Nginxのサービスステータスを確認すると、Nginxが起動しています。

 # systemctl status nginx

● nginx.service - Cluster Controlled nginx
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor pres>
  Drop-In: /run/systemd/system/nginx.service.d
           mq50-pacemaker.conf
   Active: active (running) since Fri 2023-04-14 18:03:21 JST; 19min ago
  Process: 5057 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 5055 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 5053 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status>
 Main PID: 5058 (nginx)
    Tasks: 3 (limit: 4588)
   Memory: 11.7M
   CGroup: /system.slice/nginx.service
           tq5058 nginx: master process /usr/sbin/nginx
           tq5059 nginx: worker process
           mq5060 nginx: worker process

Apr 13 18:03:21 pm-test2 systemd[1]: Starting Cluster Controlled nginx...
Apr 13 18:03:21 pm-test2 nginx[5055]: nginx: the configuration file /etc/nginx/>
Apr 13 18:03:21 pm-test2 nginx[5055]: nginx: configuration file /etc/nginx/ngin>
Apr 13 18:03:21 pm-test2 systemd[1]: Started Cluster Controlled nginx.

 

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test2.
</body>
</html>

↑pm-test2 にアクセスしています。
無事、フェイルオーバーを確認できました。

ここで、pm-test1 にフェイルバックする(切り戻す)には、pm-test1 のスタンバイを解除して、pm-test2 をスタンバイ状態とします。

pcs node unstandby コマンドで、pm-test1 のスタンバイを解除します。

(pm-test1 or pm-test2)

 # pcs node unstandby pm-test1

 

Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-13 18:28:18 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Thu Apr 13 18:28:19 2023
  * Last change:  Thu Apr 13 18:27:49 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test2
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test2
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List:」が2台とも Online となりました。

フェイルバックするため、pcs node standby コマンドで、pm-test2 をスタンバイ状態とします。

 # pcs node standby pm-test2

 

数秒で pm-test1 へのフェイルオーバーが完了します。
Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-14 18:29:33 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Thu Apr 13 18:29:34 2023
  * Last change:  Thu Apr 13 18:29:27 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Node pm-test2: standby
  * Online: [ pm-test1 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 ]
    * Stopped: [ pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑pm-test1 がアクティブ、pm-test2 がスタンバイ(standby)となっていることがわかります。

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test1.
</body>
</html>

↑pm-test1 にアクセスしています。

最後に、pcs node unstandby コマンドで、pm-test2 のスタンバイ状態を解除します。

 # pcs node unstandby pm-test2

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-14 18:35:42 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Thu Apr 13 18:35:43 2023
  * Last change:  Thu Apr 13 18:32:17 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List」が2台とも Online となりました。
これで、pm-test1 から pm-test2 へのフェイルオーバーと、pm-test2 から pm-test1 へのフェイルバック(切り戻し)は完了です。

手動フェイルオーバー方法3. アクティブなノードでpacemakerサービスを停止する

まず、Pacemakerで、pm-test1 がアクティブになっていることを確認します。

(pm-test1)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-17 18:04:58 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Mon Apr 17 18:04:59 2023
  * Last change:  Mon Apr 17 18:04:36 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List:」で、pm-test1, pm-test2 が2台とも Online となっています。
また、「Full List of Resources:」で、pm-test1 がアクティブとなっています。

pm-test2 にフェイルオーバーするため、pm-test1 で、pacemakerサービスを停止します。

 # systemctl stop pacemaker

 # systemctl status pacemaker

● pacemaker.service - Pacemaker High Availability Cluster Manager
   Loaded: loaded (/usr/lib/systemd/system/pacemaker.service; enabled; vendor p>
   Active: inactive (dead) since Mon 2023-04-17 18:20:46 JST; 1s ago
     Docs: man:pacemakerd
           https://clusterlabs.org/pacemaker/doc/
  Process: 9855 ExecStart=/usr/sbin/pacemakerd (code=exited, status=0/SUCCESS)
 Main PID: 9855 (code=exited, status=0/SUCCESS)

Apr 17 18:20:46 pm-test1 pacemakerd[9855]:  notice: Stopping pacemaker-execd
Apr 17 18:20:46 pm-test1 pacemakerd[9855]:  notice: Stopping pacemaker-fenced
Apr 17 18:20:46 pm-test1 pacemaker-fenced[9857]:  notice: Caught 'Terminated' s>
Apr 17 18:20:46 pm-test1 pacemakerd[9855]:  notice: Stopping pacemaker-based
Apr 17 18:20:46 pm-test1 pacemaker-based[9856]:  notice: Caught 'Terminated' si>
Apr 17 18:20:46 pm-test1 pacemaker-based[9856]:  notice: Disconnected from Coro>
Apr 17 18:20:46 pm-test1 pacemaker-based[9856]:  notice: Disconnected from Coro>
Apr 17 18:20:46 pm-test1 pacemakerd[9855]:  notice: Shutdown complete
Apr 17 18:20:46 pm-test1 systemd[1]: pacemaker.service: Succeeded.
Apr 17 18:20:46 pm-test1 systemd[1]: Stopped Pacemaker High Availability Cluste>

 

数秒で、pm-test2 へのフェイルオーバーが完了します。

pm-test1 ではPacemakerが起動していないので、pm-test2 でPacemakerの状態を確認します。

(pm-test2)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-17 18:21:31 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Mon Apr 17 18:21:31 2023
  * Last change:  Mon Apr 17 18:04:36 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test2 ]
  * OFFLINE: [ pm-test1 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test2
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test2
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test2 ]
    * Stopped: [ pm-test1 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List:」で pm-test1 が OFFLINE となっています。
また、「Full List of Resources:」で、pm-test2 がアクティブとなっています。

Nginxのサービスステータスを確認すると、Nginxが起動しています。

 # systemctl status nginx

● nginx.service - Cluster Controlled nginx
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor pres>
  Drop-In: /run/systemd/system/nginx.service.d
           mq50-pacemaker.conf
   Active: active (running) since Mon 2023-04-17 18:20:46 JST; 4min 6s ago
  Process: 6697 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 6695 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 6691 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status>
 Main PID: 6698 (nginx)
    Tasks: 3 (limit: 4588)
   Memory: 9.3M
   CGroup: /system.slice/nginx.service
           tq6698 nginx: master process /usr/sbin/nginx
           tq6699 nginx: worker process
           mq6700 nginx: worker process

Apr 17 18:20:46 pm-test2 systemd[1]: Starting Cluster Controlled nginx...
Apr 17 18:20:46 pm-test2 nginx[6695]: nginx: the configuration file /etc/nginx/>
Apr 17 18:20:46 pm-test2 nginx[6695]: nginx: configuration file /etc/nginx/ngin>
Apr 17 18:20:46 pm-test2 systemd[1]: Started Cluster Controlled nginx.

 

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test2.
</body>
</html>

↑pm-test2 にアクセスしています。
無事、フェイルオーバーを確認できました。

ここで、pm-test1 にフェイルバックする(切り戻す)には、

pm-test1 で pacemaker サービスを起動
→ pm-test2 で pacemaker サービスを停止
→ pm-test2 で pacemaker サービスを起動

を順に実施します。

まず、pm-test1 で pacemaker サービスを起動します。

(pm-test1)

 # systemctl start pacemaker

 

Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-17 18:26:46 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Mon Apr 17 18:26:46 2023
  * Last change:  Mon Apr 17 18:04:36 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test2
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test2
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List:」で、pm-test1, pm-test2 が2台とも Online となりました。

※「Failed Resource Actions:」は存在しないので、pcs resource cleanup は不要です。

フェイルバックするため、pm-test2 で pacemaker サービスを停止します。

(pm-test2)

 # systemctl stop pacemaker

 

数秒で pm-test1 へのフェイルオーバーが完了します。
pm-test2 ではPacemakerが起動していないので、pm-test1 でPacemakerの状態を確認します。

(pm-test1)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-17 18:31:40 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Mon Apr 17 18:31:40 2023
  * Last change:  Mon Apr 17 18:04:36 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 ]
  * OFFLINE: [ pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 ]
    * Stopped: [ pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List:」で pm-test2 が OFFLINE となっています。
また、「Full List of Resources:」で、pm-test1 がアクティブとなっています。

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test1.
</body>
</html>

↑pm-test1 にアクセスしています。
無事、フェイルバックを確認できました。

最後に、pm-test2 で、pacemaker サービスを起動します。

(pm-test2)

 # systemctl start pacemaker

 

Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-17 18:35:07 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Mon Apr 17 18:35:08 2023
  * Last change:  Mon Apr 17 18:04:36 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Node List:」で pm-test1, pm-test2 が2台とも Online となりました。


手動フェイルオーバーの3つの方法を試してみましたが、1,2の方法は、フェイルオーバー後に制約の削除やスタンバイ状態の解除が必要です。
3の方法が一番簡単ですね。

isd6. 想定する障害と具体的なPacemakerの動作

Pacemakerによりサービス継続が可能な障害のケースとしては、以下のA~Dが考えられます。

A. Nginxサービス障害
B. ネットワーク切断
C. サーバーOSダウン
D. Pacemakerの不具合発生

A, B, Cのケースでは、
不具合が発生したノードで、不具合が解消したことが確認できたら、そのノードで pcs resource cleanup コマンドによりPacemakerのエラー状態をクリアします。
その後、フェイルバック(切り戻し)が必要であれば、前述の「手動フェイルオーバー手順」に従って、切り戻しの操作を行います。

以下、障害を発生させることが可能であれば、試してみます。

想定する障害A. Nginxサービス障害

(想定する動作)

  • Nginxプロセスが終了した場合、Pacemakerはフェイルオーバーする前にまず、Nginxサービスの起動を試みる。
  • 監視間隔として設定されている、60秒程度でNginxが起動する。
  • Nginxを起動できなければ、自動フェイルオーバーする。

実際に試してみます。
まず、Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-18 18:49:01 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Tue Apr 18 18:49:02 2023
  * Last change:  Tue Apr 18 18:48:56 2023 by hacluster via crmd on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑Virtual IPとNginxリソースが、pm-test1 でアクティブとなっています。

pm-test1で、killallコマンドで、Nginxプロセスを強制終了します。

(pm-test1)

 # date; killall -9 nginx

Tue Apr 18 18:49:59 JST 2023

 # ps aux | grep nginx

root        7286  0.0  0.1 221940  1168 pts/1    S+   18:45   0:00 grep --color=auto nginx

↑nginxプロセスが存在しないことが確認できました。

短時間で定期的に pcs status コマンドを実行し、Pacemaker の状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-18 18:50:10 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Tue Apr 18 18:50:10 2023
  * Last change:  Tue Apr 18 18:48:56 2023 by hacluster via crmd on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-18 18:50:57 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Tue Apr 18 18:50:57 2023
  * Last change:  Tue Apr 18 18:48:56 2023 by hacluster via crmd on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         FAILED pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Failed Resource Actions:
  * rs-systemd-nginx_monitor_60000 on pm-test1 'not running' (7): call=31, status='complete', exitreason='inactive', last-rc-change='Tue Apr 18 18:50:57 2023', queued=0ms, exec=0ms

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-18 18:51:21 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Tue Apr 18 18:51:22 2023
  * Last change:  Tue Apr 18 18:48:56 2023 by hacluster via crmd on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Failed Resource Actions:
  * rs-systemd-nginx_monitor_60000 on pm-test1 'not running' (7): call=31, status='complete', exitreason='inactive', last-rc-change='Tue Apr 18 18:50:57 2023', queued=0ms, exec=0ms

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑リソース rs-systemd-nginx が一時的に「FAILED pm-test1」となりましたが、その後、「Started pm-test1」に戻りました。

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test1.
</body>
</html>

↑変わらず、pm-test1 のほうにアクセスしています。

Nginxのプロセス、サービスを確認してみます。

 # ps aux | grep nginx

root        9576  0.0  0.2 103392  2124 ?        Ss   18:50   0:00 nginx: master process /usr/sbin/nginx
nginx       9577  0.0  0.9 136036  7844 ?        S    18:50   0:00 nginx: worker process
nginx       9578  0.0  0.9 136036  7844 ?        S    18:50   0:00 nginx: worker process
root        9914  0.0  0.1 221940  1204 pts/1    S+   18:51   0:00 grep --color=auto nginx

 # systemctl status nginx

● nginx.service - Cluster Controlled nginx
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset>
  Drop-In: /run/systemd/system/nginx.service.d
           mq50-pacemaker.conf
   Active: active (running) since Wed 2023-04-18 18:51:00 JST; 1min 43s ago
  Process: 9575 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 9573 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 9570 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0>
 Main PID: 9576 (nginx)
    Tasks: 3 (limit: 4588)
   Memory: 5.8M
   CGroup: /system.slice/nginx.service
           tq9576 nginx: master process /usr/sbin/nginx
           tq9577 nginx: worker process
           mq9578 nginx: worker process

Apr 18 18:51:00 pm-test1 systemd[1]: Starting Cluster Controlled nginx...
Apr 18 18:51:00 pm-test1 nginx[9573]: nginx: the configuration file /etc/nginx/ng>
Apr 18 18:51:00 pm-test1 nginx[9573]: nginx: configuration file /etc/nginx/nginx.>
Apr 18 18:51:00 pm-test1 systemd[1]: nginx.service: Failed to parse PID from file>
Apr 18 18:51:00 pm-test1 systemd[1]: Started Cluster Controlled nginx

↑Nginxが、18:51:00 に起動したことがわかります。
プロセスを kill したのは 18:49:59 ですから、1分01秒で復旧しました。
Nginxサービスの監視間隔は60秒ですので、いいところでしょう。

pcs status コマンドの出力結果で
「Failed Resource Actions:」で、リソース稼働エラーの検知が表示されています。

問題なければ、pcs resource cleanup コマンドでリソースの状態を正常に戻します。

 # pcs resource cleanup

Cleaned up all resources on all nodes
Waiting for 1 reply from the controller
... got reply (done)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-18 19:02:12 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Tue Apr 18 19:02:13 2023
  * Last change:  Tue Apr 18 19:02:00 2023 by hacluster via crmd on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑「Failed Resource Actions:」がなくなり、正常な状態となりました。
想定どおりの動作を確認できました。

なお、「Nginxの起動を試みて、起動できなければ、自動フェイルオーバーする」については、Nginxプロセスを強制終了する前に、一時的に nginx.conf をリネームするなどの(イリーガルな)方法で、動作確認できます。

想定する障害B. ネットワーク切断

(想定する動作)

  • Pacemakerは自動フェイルオーバーする。
  • 数秒程度で切り替わる。

実際に試してみます。
まず、Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-19 12:03:20 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 19 12:03:21 2023
  * Last change:  Wed Apr 19 12:02:29 2023 by hacluster via crmd on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑Virtual IPとNginxリソースが、pm-test1 でアクティブとなっています。

pm-test1 で、ネットワークマネージャーのコマンド nmcli でデバイス情報を確認し、ネットワークを切断します。

(pm-test1)

 # nmcli device

DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  System eth0
lo      loopback  unmanaged  --

 # date; nmcli connect down 'System eth0'

Wed Apr 19 12:07:31 JST 2023

 

pm-test1 にSSH接続していれば、この時点で、pm-test1 の接続が切れます。
pm-test2 で、Pacemakerの状態を確認します。

(pm-test2)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-19 12:07:38 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 19 12:07:39 2023
  * Last change:  Wed Apr 19 12:02:29 2023 by hacluster via crmd on pm-test1
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test2 ]
  * OFFLINE: [ pm-test1 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test2
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test2
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test2 ]
    * Stopped: [ pm-test1 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑Virtual IPとNginxが、pm-test2 に切り替わったことがわかります。

pm-test2 のログ /var/log/messages で、時系列で何が起こったかを確認してみます。

 # less /var/log/messages

Apr 19 12:07:33 pm-test2 corosync[966]:  [KNET  ] link: host: 1 link: 0 is down
Apr 19 12:07:33 pm-test2 corosync[966]:  [KNET  ] host: host: 1 (passive) best link: 0 (pri: 1)
Apr 19 12:07:33 pm-test2 corosync[966]:  [KNET  ] host: host: 1 has no active links
Apr 19 12:07:33 pm-test2 corosync[966]:  [TOTEM ] Token has not been received in 2250 ms
Apr 19 12:07:34 pm-test2 corosync[966]:  [TOTEM ] A processor failed, forming new configuration: token timed out (3000ms), waiting 3600ms for consensus.
Apr 19 12:07:38 pm-test2 corosync[966]:  [QUORUM] Sync members[1]: 2
Apr 19 12:07:38 pm-test2 corosync[966]:  [QUORUM] Sync left[1]: 1
Apr 19 12:07:38 pm-test2 corosync[966]:  [TOTEM ] A new membership (2.36) was formed. Members left: 1
Apr 19 12:07:38 pm-test2 corosync[966]:  [TOTEM ] Failed to receive the leave message. failed: 1
Apr 19 12:07:38 pm-test2 corosync[966]:  [QUORUM] Members[1]: 2
Apr 19 12:07:38 pm-test2 corosync[966]:  [MAIN  ] Completed service synchronization, ready to provide service.
Apr 19 12:07:38 pm-test2 pacemaker-fenced[1077]: notice: Node pm-test1 state is now lost
Apr 19 12:07:38 pm-test2 pacemaker-fenced[1077]: notice: Purged 1 peer with id=1 and/or uname=pm-test1 from the membership cache
Apr 19 12:07:38 pm-test2 pacemaker-based[1076]: notice: Node pm-test1 state is now lost
Apr 19 12:07:38 pm-test2 pacemaker-based[1076]: notice: Purged 1 peer with id=1 and/or uname=pm-test1 from the membership cache
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Node pm-test1 state is now lost
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: warning: Our DC node (pm-test1) left the cluster
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: State transition S_NOT_DC -> S_ELECTION
Apr 19 12:07:38 pm-test2 pacemaker-attrd[1079]: notice: Node pm-test1 state is now lost
Apr 19 12:07:38 pm-test2 pacemaker-attrd[1079]: notice: Removing all pm-test1 attributes for peer loss
Apr 19 12:07:38 pm-test2 pacemaker-attrd[1079]: notice: Purged 1 peer with id=1 and/or uname=pm-test1 from the membership cache
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: State transition S_ELECTION -> S_INTEGRATION
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Cluster does not have watchdog fencing device
Apr 19 12:07:38 pm-test2 pacemaker-schedulerd[1080]: notice: On loss of quorum: Ignore
Apr 19 12:07:38 pm-test2 pacemaker-schedulerd[1080]: warning: Blind faith: not fencing unseen nodes
Apr 19 12:07:38 pm-test2 pacemaker-schedulerd[1080]: notice: Actions: Start      rs-vip     ( pm-test2 )
Apr 19 12:07:38 pm-test2 pacemaker-schedulerd[1080]: notice: Actions: Start      rs-systemd-nginx     ( pm-test2 )
Apr 19 12:07:38 pm-test2 pacemaker-schedulerd[1080]: notice: Calculated transition 0, saving inputs in /var/lib/pacemaker/pengine/pe-input-28.bz2
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Initiating start operation rs-vip_start_0 locally on pm-test2
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Requesting local execution of start operation for rs-vip on pm-test2
Apr 19 12:07:38 pm-test2 IPaddr2(rs-vip)[5372]: INFO: Adding inet address 192.168.1.178/24 with broadcast address 192.168.1.255 to device eth0
Apr 19 12:07:38 pm-test2 IPaddr2(rs-vip)[5372]: INFO: Bringing device eth0 up
Apr 19 12:07:38 pm-test2 IPaddr2(rs-vip)[5372]: INFO: /usr/libexec/heartbeat/send_arp  -i 200 -r 5 -p /run/resource-agents/send_arp-192.168.1.178 eth0 192.168.1.178 auto not_used not_used
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Result of start operation for rs-vip on pm-test2: ok
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Initiating monitor operation rs-vip_monitor_10000 locally on pm-test2
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Requesting local execution of monitor operation for rs-vip on pm-test2
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Initiating start operation rs-systemd-nginx_start_0 locally on pm-test2
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Requesting local execution of start operation for rs-systemd-nginx on pm-test2
Apr 19 12:07:38 pm-test2 systemd[1]: Reloading.
Apr 19 12:07:38 pm-test2 pacemaker-controld[1081]: notice: Result of monitor operation for rs-vip on pm-test2: ok
Apr 19 12:07:38 pm-test2 systemd[1]: /usr/lib/systemd/system/irqbalance.service:6: Unknown lvalue 'ConditionCPUs' in section 'Unit'
Apr 19 12:07:38 pm-test2 systemd[1]: Starting Cluster Controlled nginx...
Apr 19 12:07:38 pm-test2 nginx[5520]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Apr 19 12:07:38 pm-test2 nginx[5520]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Apr 19 12:07:38 pm-test2 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Apr 19 12:07:38 pm-test2 systemd[1]: Started Cluster Controlled nginx.
Apr 19 12:07:40 pm-test2 pacemaker-controld[1081]: notice: Result of start operation for rs-systemd-nginx on pm-test2: ok
Apr 19 12:07:40 pm-test2 pacemaker-controld[1081]: notice: Initiating monitor operation rs-systemd-nginx_monitor_60000 locally on pm-test2
Apr 19 12:07:40 pm-test2 pacemaker-controld[1081]: notice: Requesting local execution of monitor operation for rs-systemd-nginx on pm-test2
Apr 19 12:07:40 pm-test2 pacemaker-controld[1081]: notice: Result of monitor operation for rs-systemd-nginx on pm-test2: ok
Apr 19 12:07:40 pm-test2 pacemaker-controld[1081]: notice: Transition 0 (Complete=6, Pending=0, Fired=0, Skipped=0, Incomplete=0, Source=/var/lib/pacemaker/pengine/pe-input-28.bz2): Complete
Apr 19 12:07:40 pm-test2 pacemaker-controld[1081]: notice: State transition S_TRANSITION_ENGINE -> S_IDLE
Apr 19 12:07:42 pm-test2 IPaddr2(rs-vip)[5372]: INFO: ARPING 192.168.1.178 from 192.168.1.178 eth0#012Sent 5 probes (5 broadcast(s))#012Received 0 response(s)

↑12:07:40 までには、pm-test2 でVirtual IPが割り当てられ、Nginxが起動したことがわかります。
12:07:31 にネットワークを切断したので、10秒程度でフェイルオーバーが完了しました。

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test2.
</body>
</html>

↑pm-test2 にアクセスしています。
想定どおりの自動フェイルオーバーを確認できました。

想定する障害C. サーバーOSダウン

(想定する動作)

  • Pacemakerは自動フェイルオーバーする。
  • 数秒程度で切り替わる。

実際に試してみます。
まず、Pacemakerの状態を確認します。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-19 18:48:46 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test1 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 19 18:48:47 2023
  * Last change:  Wed Apr 19 18:04:36 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test1 pm-test2 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test1
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test1
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test1 pm-test2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑Virtual IPとNginxリソースが、pm-test1 でアクティブとなっています。

pm-test1 のOSをシャットダウンします。

(pm-test1)

 # date; shutdown -h now

Wed Apr 19 18:49:41 JST 2023

 

pm-test1 にSSH接続していれば、この時点で、pm-test1 の接続が切れます。
pm-test2 で、Pacemakerの状態を確認します。

(pm-test2)

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-19 18:49:54 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: pm-test2 (version 2.1.4-5.el8_7.2-dc6eb4362e) - partition with quorum
  * Last updated: Wed Apr 19 18:49:54 2023
  * Last change:  Wed Apr 19 18:04:36 2023 by root via cibadmin on pm-test2
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ pm-test2 ]
  * OFFLINE: [ pm-test1 ]

Full List of Resources:
  * Resource Group: rg01:
    * rs-vip    (ocf::heartbeat:IPaddr2):        Started pm-test2
    * rs-systemd-nginx  (systemd:nginx):         Started pm-test2
  * Clone Set: rs-ping-gw-clone [rs-ping-gw]:
    * Started: [ pm-test2 ]
    * Stopped: [ pm-test1 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/enabled
  pcsd: active/enabled

↑Virtual IPとNginxが、pm-test2 に切り替わったことがわかります。

pm-test2 のログ /var/log/messages を確認してみます。

 # less /var/log/messages

Apr 19 18:49:44 pm-test2 systemd[1]: Started Cluster Controlled nginx.
...
Apr 19 18:49:48 pm-test2 IPaddr2(rs-vip)[13491]: INFO: ARPING 192.168.1.178 from 192.168.1.178 eth0#012Sent 5 probes (5 broadcast(s))#012Received 0 response(s)

↑18:49:48 までには、pm-test2 でVirtual IPが割り当てられ、Nginxが起動したことがわかります。
18:49:41 にネットワークを切断したので、7秒程度でフェイルオーバーが完了しました。

Virtual IP で、Webページにアクセスしてみます。

 # curl http://192.168.1.178/test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>

<body>
<h1>Test Page</h1>
test page on pm-test2.
</body>
</html>

↑pm-test2 にアクセスしています。
想定どおりの自動フェイルオーバーを確認できました。

想定する障害D. Pacemakerの不具合発生

(判断は難しいが、Pacemakerの動作がおかしいと判断したら)手作業で対応する。

具体的には、、
いったん2台ともpacemakerサービスを停止する。
各種関連ログを調査し、問題ないようなら、1台ずつPacemakerサービスを起動し、pcs resource cleanup コマンドでエラー状態をクリアする。
それでも解消されない場合は、Pacemakerの設定をいったんクリアして再設定する。

Pacemakerの再設定は、
pcs cluster stop コマンドでクラスターを停止、
pcs cluster destroy コマンドでクラスターの全設定を削除したのち、
一からPacemakerを設定します。

(pm-test1, pm-test2)

 # pcs cluster stop

 # pcs cluster destroy

※ノード間でpcsの通信ができていないかもしれないので、pcs cluster stop, pcs cluster destroy コマンドは、全ノードで実行します。

isd7. おわりに

負荷分散用途のNginxサーバーをPacemakerで冗長化する構築手順と、Packmakerの動作、自動/手動フェイルオーバーなどについて記載しました。

長くなりましたが、今回のような構成、仕様であれば、構築手順や操作は、シンプルでわかりやすいと思います。

AWSなどのパブリッククラウドでは、内部的に冗長化されているELBなどのロードバランサー機能を使用すべきですが、そのような機能がないオンプレミスなどの環境では有用でしょう。

実際に導入する際は、想定する障害に対して、十分な動作確認の実施をおすすめします。

isd(参考記事)

(1) NGINXの負荷分散装置をPacemakerで冗長化する – 技術メモメモ
https://tech-mmmm.blogspot.com/2022/06/nginxpacemaker.html

(2) CentOS 8 + PacemakerでSquidとUnboundを冗長化する – 技術メモメモ
https://tech-mmmm.blogspot.com/2020/07/centos-8-pacemakersquidunbound.html

(3) 技術メモメモ ラベル:Pacemaker – 技術メモメモ
https://tech-mmmm.blogspot.com/search/label/Pacemaker

(4) 高可用性クラスタリングの設定 Oracle Linux Help Center
https://docs.oracle.com/cd/F22978_01/availability/availability-InstallingandConfiguringPacemakerandCorosync.html

(5) 高可用性クラスターの設定および管理 – A Red Hat training course is available for RHEL 8
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_high_availability_clusters/index

(6) 【Pacemaker】HAクラスタの運用で注意すべき「スプリットブレイン」とは? – ラクスエンジニアブログ
https://tech-blog.rakus.co.jp/entry/20220302/pacemaker

(7) pcs Man Page – ManKier
https://www.mankier.com/8/pcs

(8) Pacemakerの概要 – Linux-HA Japan
https://linux-ha.osdn.jp/wp/manual/pacemaker_outline

(9) Pacemaker/Corosync の設定値について – SRA OSS Tech Blog
https://www.sraoss.co.jp/tech-blog/pacemaker/pacemaker-config-values/

(10) Pacemaker Explained 4. Cluster Resources
https://clusterlabs.org/pacemaker/doc/2.1/Pacemaker_Explained/html/resources.html

(11) クラスタ構成ソフトウェア「Pacemaker」と「Heartbeat」「Corosync」の関係性 – ビジネス継続とITについて考える
https://bcblog.sios.jp/drbd-pacemaker-heartbeat-corosync/

 

Follow me!