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

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

isd1. はじめに

少し前に「負荷分散用途のNginxサーバーをPacemakerで冗長化する」サーバー構成を構築する機会がありました。

構築手順は、ほぼ、以下の記事のとおりです。
ありがとうございます!

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

ここでは、構築の手順と、Pacemakerのリソース設定についての僕なりの解釈や、フェイルオーバーなど運用の注意点をまとめます。
長いので、前後編に分けました。

構築、操作手順は2023年4月時点のものです。

以下、2台のサーバーで、NginxやVirtual IPアドレスが稼働している状態を「アクティブ」、稼働していない待機状態を「スタンバイ」といいます。

isd2. サーバー構成

サーバーは2台で、基本情報は以下のとおりです。

  • OS: Rocky Linux 8.7
  • サーバー1のホスト名とIPアドレス: pm-test1, 192.168.1.101
  • サーバー2のホスト名とIPアドレス: pm-test2, 192.168.1.102
  • Virtual IPアドレス (VIP): 192.168.1.178

VIPが、外部へのサービス公開用IPアドレスとなります。

pm-test1 がアクティブな場合の構成図は以下のとおりです。

Webアクセスは、ここでは、シンプルにVirutal IPアドレス直打ちのHTTPで、http://192.168.1.178/ でアクセスできればOKとします。

本番運用では https://example.jp/ のように、FQDNのホスト名かつHTTPSでアクセスするよう設定してください。

isd3. 構築手順

3.1. Nginxの設定

Rocky Linux 8のリポジトリから、Nginxをインストールします。

 # dnf install nginx

 

より新しいバージョンを使用したい場合は、Nginx公式サイトからソースをダウンロードしてビルドするか、Nginx公式リポジトリを設定し、インストールするとよいでしょう。

・nginx: Linux packages
http://nginx.org/en/linux_packages.html#RHEL

※ここでは、Nginxの設定はデフォルトままとします。本番稼働するWebサーバーでは、VirtualHostやSSLの設定などを行ってください。

ドキュメントルートにテスト用HTMLを設置します。
Virtual IPアドレスに対してWebアクセスしたときに、実際にはどちらのサーバーにアクセスしたかが確認できるよう、pm-test1, pm-test2 でそれぞれのホスト名を表示するようにします。

pm-test1の /usr/share/nginx/html/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の /usr/share/nginx/html/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>

なお、Nginxサービスの起動・停止は、PacemakerがSystemdを介して制御してくれるので、自動起動設定(systemctl enable nginx)は不要です。

※仮に自動起動設定をしていていも、「スタンバイ」のほうのNginxはPacemakerにより強制的に停止されます。

3.2. Pacemaker+Corosyncの設定

3.2.1. PacemakerとCorosyncのインストール
3.2.2. ファイアウォール設定
3.2.3. Pacemakerの初期設定
3.2.4. Pacemakerのクラスターリソース設定
3.2.5. Pacemakerの自動起動設定

ソフトウェアPacemakerとCorosyncをインストール、設定します。
設定の前に、以下のとおり、補足します。

  • pcsコマンド

Pacemakerの設定、状態確認、制御は、pcsコマンドで行います。
pcsコマンドによる制御は、冗長構成のクラスターを構成する全サーバー間で通信されるため、基本的には、Pacemakerが稼働しているいずれか1台のサーバーで実行すればよいです。
pcsコマンドの実行には、pcsdサービスが稼働している必要があります。

  • ノードとリソース

Pacemakerでは、冗長構成に含まれるサーバーOSのことを、「ノード(Node)」と呼びます。
また、冗長化の制御・監視対象を「リソース(Resource)」と呼びます。

  • PacemakerとCorosyncの役割

Pacemakerはクラスター制御、リソース監視および障害検出とリカバリーを担当し、Corosyncはクラスター通信層の制御、ノード死活監視を担当する。(と、僕は理解しました。)

  • アクティブとスタンバイ

ここではこれ以降、Virtual IPアドレスを付与し、Nginxを起動してWebサービスを稼働させるノードの状態を「アクティブ」と呼ぶことにします。
また、アクティブではないもう1台のノードの状態を「スタンバイ」と呼ぶことにします。

3.2.1. PacemakerとCorosyncのインストール

PacemakerとCorosyncをインストールします。
pcp-zeroconf は、トラブルシュートで使用するとのこと。

Rocky Linuxでは、HighAvailability(ha)リポジトリに存在しますが、デフォルトでは無効となっているので、--enablerepo=ha で一時的に有効にして、インストールします。

 # dnf --enablerepo=ha \
    install pcs pacemaker resource-agents fence-agents-all pcp-zeroconf

 

haclusterユーザーが自動作成されたことを確認します。

 # id hacluster

uid=189(hacluster) gid=189(haclient) groups=189(haclient)

 # tail /etc/passwd

sssd:x:996:993:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
version2:x:2000:2000::/home/version2:/bin/bash
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
nginx:x:497:497::/var/cache/nginx:/sbin/nologin
pesign:x:496:496:Group for the pesign signing daemon:/run/pesign:/sbin/nologin
pcp:x:495:495:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

 

Pacemakerの設定用pcsコマンドを使用するための、pcsdサービスを起動します。
あわせて、自動起動設定も行います。

 # systemctl enable --now pcsd

Created symlink /etc/systemd/system/multi-user.target.wants/pcsd.service → /usr/lib/systemd/system/pcsd.service.

 # systemctl status pcsd

● pcsd.service - PCS GUI and remote configuration interface
   Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset>
   Active: active (running) since Tue 2023-04-11 06:34:41 UTC; 4s ago
     Docs: man:pcsd(8)
           man:pcs(8)
 Main PID: 22079 (pcsd)
    Tasks: 1 (limit: 4588)
   Memory: 28.1M
   CGroup: /system.slice/pcsd.service
           mq22079 /usr/libexec/platform-python -Es /usr/sbin/pcsd

Apr 11 06:34:40 pm-test1 systemd[1]: Starting PCS GUI and remote configuration >
Apr 11 06:34:41 pm-test1 systemd[1]: Started PCS GUI and remote configuration i>

3.2.2. ファイアウォール設定

2台のサーバー間で、firewalldやnftablesなど、ファイアウォールによるアクセス制御を設定している場合は、相手サーバーからの以下のポートのInbound通信を許可します。

TCP/2224 (pcsデーモンで使用)
TCP/3121 (Pacemaker Remoteノード用)
TCP/21064 (DLMリソース用)
UDP/5405 (Corosyncクラスタリング用)
UDP/5404 (Corosyncマルチキャスト用(構成されている場合))

※今回の構成では、Pacemaker Remoteノード、DLMリソース、Corosyncマルチキャストは使用していないので、TCP/3121, TCP/21064, UDP/5404は不要と思われます。

3.2.3. Pacemakerの初期設定

pcsコマンドによる設定は、2台でpcsdを起動し、ファイアウォールでアクセス許可ルールがあれば、どちらか1台で実行すればよいです。
2台のサーバーで通信して、設定をもう1台に反映してくれます。

  • /etc/hosts設定

Pacemakerのクラスター設定で使用するホスト名を設定する。

 # vim /etc/hosts

192.168.1.101	pm-test1
192.168.1.102	pm-test2

 

  • haclusterユーザーのパスワード設定

haclusterユーザーのパスワードを設定します。
このユーザー、パスワードは、のちにクラスターの認証設定で使用します。

 # passwd hacluster

<パスワード文字列を入力>

 

  • クラスターの認証設定

クラスターに参加させるノードを認証させる。

 # pcs host auth pm-test1 pm-test2 -u hacluster

Password: // 先ほど設定した haclusterユーザーのパスワード文字列を入力

pm-test1: Authorized
pm-test2: Authorized

 

  • クラスターの作成

pcs cluster setup コマンドで、クラスター名と、クラスター構成に組み込むノード(=サーバー)と、リンクアドレスを指定します。

なお、Pacemaker, Corosyncのドキュメントを読むと、「リンク(link)」という用語がたくさん出てきます。
具体的に説明している箇所は見つけられませんでしたが、僕は「クラスターを構成するネットワーク」と理解しました。
「リンクアドレス」は、「ノード間監視の通信で使用するIPアドレス」と考えればよいでしょうか。
リンクアドレスは、サービス用のIPアドレスとは別の監視用IPアドレス(ネットワーク)でも構いませんし、サービス用のIPアドレスと監視用IPアドレスの複数を指定しても構いません。

クラスター名は cluster01 とします。
--startオプションをつけて、設定と同時に、pacemakerサービスを起動します。

 # pcs cluster setup cluster01 --start \
    pm-test1 addr=192.168.1.101 \
    pm-test2 addr=192.168.1.102

 

※リンクアドレスを複数指定する場合は、ノード名の次に、addr= を複数指定します。

 # pcs cluster setup cluster01 --start \
    pm-test1 addr=192.168.1.101 addr=172.16.1.101 \
    pm-test2 addr=192.168.1.102 addr=172.16.1.102

Destroying cluster on hosts: 'pm-test1', 'pm-test2'...
pm-test2: Successfully destroyed cluster
pm-test1: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 'pm-test1', 'pm-test2'
pm-test1: successful removal of the file 'pcsd settings'
pm-test2: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 'pm-test1', 'pm-test2'
pm-test1: successful distribution of the file 'corosync authkey'
pm-test1: successful distribution of the file 'pacemaker authkey'
pm-test2: successful distribution of the file 'corosync authkey'
pm-test2: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 'pm-test1', 'pm-test2'
pm-test1: successful distribution of the file 'corosync.conf'
pm-test2: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.
Starting cluster on hosts: 'pm-test1', 'pm-test2'...

↑「Cluster has been successfully set up.」と表示されればOKです。

この初期状態で、pcs status コマンドでクラスターの状態を確認します。

 # pcs status

Cluster name: cluster01

WARNINGS:
No stonith devices and stonith-enabled is not false

Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-11 16:06:02 +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 11 16:06:02 2023
  * Last change:  Tue Apr 11 16:03:42 2023 by hacluster via crmd on pm-test2
  * 2 nodes configured
  * 0 resource instances configured

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

Full List of Resources:
  * No resources

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

↑「Node List:」で、「Online: [ pm-test1 pm-test2 ]」のように、ノードが Online となっていればOKです。

クラスターの管理通信(Colosyncの通信)を確認します。
「LINK ID 0」で、監視用のIPアドレス 192.168.1.x が表示されればOKです。

 # corosync-cfgtool -s

-- pm-test1
Local node ID 1, transport knet
LINK ID 0 udp
        addr    = 192.168.1.101
        status:
                nodeid:          1:     localhost
                nodeid:          2:     connected
--

-- pm-test2
Local node ID 2, transport knet
LINK ID 0 udp
        addr    = 192.168.1.102
        status:
                nodeid:          1:     connected
                nodeid:          2:     localhost
--

 

  • クラスターパラメータの設定

Pacemakerは複数のクラスタからアクティブなノードを選出する際に、多数決によって決定します。
しかし、ノードが2台の場合は多数決による決定ができないため、以下2点の設定を行います。

現在の設定を確認します。

 # pcs property

Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: cluster01
 dc-version: 2.1.4-5.el8_7.2-dc6eb4362e
 have-watchdog: false

 

クォーラムの状態を無視する(ignore)設定をします。

 # pcs property set no-quorum-policy=ignore

 

STONITHを無効とする設定をします。

 # pcs property set stonith-enabled=false

 

再度、現在の設定を確認します。

 # pcs property

Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: cluster01
 dc-version: 2.1.4-5.el8_7.2-dc6eb4362e
 have-watchdog: false
 no-quorum-policy: ignore
 stonith-enabled: false

 

クォーラムやSTONITHについて補足します。
set stonith-enabled= で、クラスターがクォーラムを持っていないときの動作を定義します。
2台構成の場合は、片方が停止しても動作を続行できるよう、ignoreを指定するのが望ましいそうです。

STONITHの機能により、強制的に相手のノードを再起動(フェンシング)することで、複数のサーバーがアクティブになり、サービスが競合する不具合を防ぐことができます。
STONITH機能を使用するには、物理サーバーのハードウェアもしくは仮想マシンの管理ソフトウェアが外部からの電源ON/OFFに対応している必要があります。
今回のサーバーは対応していないため、STONITHは無効とします。

これらの設定については、末尾に記載した参考記事(6)の説明がわかりやすいです。

3.2.4. Pacemakerのクラスターリソース設定

Pacemakerによるクラスター動作の要件として、以下を考えます。

  • 2台のサーバーのうちどちらかに、Virtual IPを付与し、Nginxを起動する。
  • Nginxプロセスとネットワーク疎通を監視し、不具合があればもう1台のサーバーにフェイルオーバーし、Virtual IPを付与し、Nginxを起動する。

上記の要件を満たすため、以下の3つのリソース設定を行います。

1. VIP制御リソース

リソース名: rs-vip
リソースエージェント: ocf:heartbeat:IPaddr2
eth0 のインタフェースに対して、Virtual IP 192.168.1.178/24 を割り当てる。

2. Nginx制御リソース

リソース名: rs-systemd-nginx
リソースエージェント: systemd:nginx
systemdを使用してNginxサービスを起動・停止する。

3. ネットワーク監視用Pingリソース

リソース名: rs-ping-gw
リソースエージェント: ocf:pacemaker:ping
ゲートウェイに対して各サーバからPingを実行し、Ping疎通ができないサーバーではリソースを起動できないよう制約 (constraint) を設定する。

ひとつずつ設定していきます。
NginxをVirtual IPとともにフェイルオーバーさせるためのリソースグループ rg01 を作成し、--groupオプションでリソースを所属させます。

「1. VIP制御リソース」を作成します。

 # pcs resource create rs-vip ocf:heartbeat:IPaddr2 \
    ip=192.168.1.178 cidr_netmask=24 nic=eth0 --group rg01

 

「2. Nginx制御リソース」を作成します。

 # pcs resource create rs-systemd-nginx systemd:nginx --group rg01

 

「3. ネットワーク監視用Pingリソース」を作成します。

まず、デフォルトゲートウェイを確認します。

 # ip r

default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.101 metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.101 metric 100

↑デフォルトゲートウェイは 192.168.1.1 とわかります。

ネットワーク監視は2台のノードでアクティブ/アクティブで稼働させ、常に両方のノードにてネットワークの正常性を確認させておくため、Cloneリソースとします。

 # pcs resource create rs-ping-gw ocf:pacemaker:ping \
    dampen=5s multiplier=1000 host_list=192.168.1.1

 # pcs resource clone rs-ping-gw

 

ロケーションの制約設定を追加します。
Pingリソースは、「pingd」という名称のパラメータを持っており、Ping成功時は1000、失敗時は0の値を返します。
pingdの値が未定義または1より小さい場合は、NginxとVirtual IPのリソースグループを起動させないというロケーション制約を定義します。

 # pcs constraint location rg01 rule score=-INFINITY \
    pingd lt 1 or not_defined pingd

 

ロケーションの制約設定を確認します。

 # 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:

 

リソース設定を確認します。

 # pcs resource config

Group: rg01
  Resource: rs-vip (class=ocf provider=heartbeat type=IPaddr2)
    Attributes: rs-vip-instance_attributes
      cidr_netmask=24
      ip=192.168.1.178
      nic=eth0
    Operations:
      monitor: rs-vip-monitor-interval-10s
        interval=10s
        timeout=20s
      start: rs-vip-start-interval-0s
        interval=0s
        timeout=20s
      stop: rs-vip-stop-interval-0s
        interval=0s
        timeout=20s
  Resource: rs-systemd-nginx (class=systemd type=nginx)
    Operations:
      monitor: rs-systemd-nginx-monitor-interval-60
        interval=60
        timeout=100
      start: rs-systemd-nginx-start-interval-0s
        interval=0s
        timeout=100
      stop: rs-systemd-nginx-stop-interval-0s
        interval=0s
        timeout=100
Clone: rs-ping-gw-clone
  Resource: rs-ping-gw (class=ocf provider=pacemaker type=ping)
    Attributes: rs-ping-gw-instance_attributes
      dampen=5s
      host_list=192.168.1.1
      multiplier=1000
    Operations:
      monitor: rs-ping-gw-monitor-interval-10s
        interval=10s
        timeout=60s
      reload-agent: rs-ping-gw-reload-agent-interval-0s
        interval=0s
        timeout=20s
      start: rs-ping-gw-start-interval-0s
        interval=0s
        timeout=60s
      stop: rs-ping-gw-stop-interval-0s
        interval=0s
        timeout=20s

↑ここで、、

  Resource: rs-systemd-nginx (class=systemd type=nginx)
    Operations:
      monitor: rs-systemd-nginx-monitor-interval-60
        interval=60
        timeout=100

とあるので、Nginxサービスの監視は60秒間隔ですね。

pcs status コマンドでPacemakerの状態を確認します。
「Full List of Resources:」で、アクティブなノードを確認できます。

 # pcs status

Cluster name: cluster01
Status of pacemakerd: 'Pacemaker is running' (last updated 2023-04-11 16:16: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 11 16:16:11 2023
  * Last change:  Tue Apr 11 16:15:42 2023 by root via cibadmin 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/disabled
  pcsd: active/enabled

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

pm-test1 のNginxサービスのステータスや、/var/log/messages を確認します。

(pm-test1)

 # 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 Tue 2023-04-11 16:13:32 JST; 3min 52s ago
  Process: 3759 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 3756 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 3754 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status>
 Main PID: 3760 (nginx)
    Tasks: 3 (limit: 4588)
   Memory: 13.4M
   CGroup: /system.slice/nginx.service
           tq3760 nginx: master process /usr/sbin/nginx
           tq3761 nginx: worker process
           mq3762 nginx: worker process

Apr 11 16:13:31 pm-test1 systemd[1]: Starting Cluster Controlled nginx...
Apr 11 16:13:32 pm-test1 nginx[3756]: nginx: the configuration file /etc/nginx/>
Apr 11 16:13:32 pm-test1 nginx[3756]: nginx: configuration file /etc/nginx/ngin>
Apr 11 16:13:32 pm-test1 systemd[1]: Started Cluster Controlled nginx.

 # less /var/log/messages

Apr 11 16:13:31 pm-test1 pacemaker-controld[3370]: notice: Requesting local exec
ution of probe operation for rs-systemd-nginx on pm-test1
Apr 11 16:13:31 pm-test1 pacemaker-controld[3370]: notice: Result of probe opera
tion for rs-systemd-nginx on pm-test1: not running (inactive)
Apr 11 16:13:31 pm-test1 pacemaker-controld[3370]: notice: Requesting local exec
ution of start operation for rs-systemd-nginx on pm-test1
Apr 11 16:13:31 pm-test1 systemd[1]: Reloading.
Apr 11 16:13:31 pm-test1 systemd[1]: /usr/lib/systemd/system/irqbalance.service:
6: Unknown lvalue 'ConditionCPUs' in section 'Unit'
Apr 11 16:13:31 pm-test1 systemd[1]: Starting Cluster Controlled nginx...
Apr 11 16:13:32 pm-test1 nginx[3756]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Apr 11 16:13:32 pm-test1 nginx[3756]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Apr 11 16:13:32 pm-test1 systemd[1]: Started Cluster Controlled nginx.
Apr 11 16:13:33 pm-test1 pacemaker-controld[3370]: notice: Result of start operation for rs-systemd-nginx on pm-test1: ok
Apr 11 16:13:33 pm-test1 pacemaker-controld[3370]: notice: Requesting local execution of monitor operation for rs-systemd-nginx on pm-test1
Apr 11 16:13:33 pm-test1 pacemaker-controld[3370]: notice: Result of monitor operation for rs-systemd-nginx on pm-test1: ok

↑「Starting Cluster Controlled nginx…」や、/var/log/messages のログの流れから、Nginx がPacemakerにより制御されていることがわかります。

pm-test2 では、Nginx が起動していないことを確認します。

(pm-test2)

 # 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)

 # less /var/log/messages

Apr 11 16:13:31 pm-test2 pacemaker-schedulerd[3373]: notice: Actions: Start
 rs-systemd-nginx     ( pm-test1 )
Apr 11 16:13:31 pm-test2 pacemaker-schedulerd[3373]: notice: Calculated transiti
on 4, saving inputs in /var/lib/pacemaker/pengine/pe-input-6.bz2
Apr 11 16:13:31 pm-test2 pacemaker-controld[3374]: notice: Initiating monitor op
eration rs-systemd-nginx_monitor_0 locally on pm-test2
Apr 11 16:13:31 pm-test2 pacemaker-controld[3374]: notice: Requesting local exec
ution of probe operation for rs-systemd-nginx on pm-test2
Apr 11 16:13:31 pm-test2 pacemaker-controld[3374]: notice: Initiating monitor op
eration rs-systemd-nginx_monitor_0 on pm-test1
Apr 11 16:13:31 pm-test2 pacemaker-controld[3374]: notice: Result of probe opera
tion for rs-systemd-nginx on pm-test2: not running (inactive)
Apr 11 16:13:31 pm-test2 pacemaker-controld[3374]: notice: Initiating start oper
ation rs-systemd-nginx_start_0 on pm-test1
Apr 11 16:13:33 pm-test2 pacemaker-controld[3374]: notice: Initiating monitor op
eration rs-systemd-nginx_monitor_60000 on pm-test1
Apr 11 16:13:33 pm-test2 pacemaker-controld[3374]: notice: Transition 4 (Complet
e=6, Pending=0, Fired=0, Skipped=0, Incomplete=0, Source=/var/lib/pacemaker/peng
ine/pe-input-6.bz2): Complete
Apr 11 16:13:33 pm-test2 pacemaker-controld[3374]: notice: State transition S_TR
ANSITION_ENGINE -> S_IDL

 

pm-test1 側で、ネットワークインタフェース eth0 に Virtual IP 192.168.1.178 が割り当てられたことを確認します。

(pm-test1)

 # ip a show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 0a:e6:c5:85:39:03 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 192.168.1.101/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
       valid_lft 2238sec preferred_lft 2238sec
    inet 192.168.1.178/24 brd 192.168.1.255 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::8e6:c5ff:fe85:3903/64 scope link
       valid_lft forever preferred_lft forever

 

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 のほうにアクセスしていることがわかります。

※AWS EC2の場合、Virtual IPのようなエイリアスアドレスは、ENIにもIPアドレスを設定しないと、他のサーバーからはアクセスできません。他のIaaSクラウドサーバーでも同様かもしれません。ご注意ください。

念のため、アクセスログを確認します。

(pm-test1)

 # less /var/log/nginx/access.log

192.168.1.217 - - [11/Apr/2023:16:31:03 +0900] "GET /test.html HTTP/1.1" 200 155 "-" "curl/7.61.1" "-"

 

3.2.5. Pacemakerの自動起動設定

pm-test1, pm-test2 の両サーバーで設定します。

(pm-test1, pm-test2)

 # systemctl enable pacemaker

Created symlink /etc/systemd/system/multi-user.target.wants/pacemaker.service → /usr/lib/systemd/system/pacemaker.service.

 # systemctl status pacemaker

● pacemaker.service - Pacemaker High Availability Cluster Manager
   Loaded: loaded (/usr/lib/systemd/system/pacemaker.service; enabled; vendor p>
   Active: active (running) since Wed 2023-04-11 18:35:00 JST; 3min 27s ago
     Docs: man:pacemakerd
           https://clusterlabs.org/pacemaker/doc/
 Main PID: 1052 (pacemakerd)
    Tasks: 10
   Memory: 39.0M
   CGroup: /system.slice/pacemaker.service
           tq1052 /usr/sbin/pacemakerd
           tq1080 /usr/libexec/pacemaker/pacemaker-based
           tq1081 /usr/libexec/pacemaker/pacemaker-fenced
           tq1082 /usr/libexec/pacemaker/pacemaker-execd
           tq1083 /usr/libexec/pacemaker/pacemaker-attrd
           tq1084 /usr/libexec/pacemaker/pacemaker-schedulerd
           tq1085 /usr/libexec/pacemaker/pacemaker-controld
           tq4478 /bin/sh /usr/lib/ocf/resource.d/pacemaker/ping monitor
           tq4495 /bin/sh /usr/lib/ocf/resource.d/pacemaker/ping monitor
           mq4496 ping -n -q -W 18 -c 3 192.168.1.1

Apr 11 18:35:26 pm-test1 pacemaker-controld[1085]:  notice: Requesting local ex>
Apr 11 18:35:28 pm-test1 pacemaker-controld[1085]:  notice: Result of monitor o>
Apr 11 18:35:31 pm-test1 pacemaker-controld[1085]:  notice: Requesting local ex>
Apr 11 18:35:31 pm-test1 pacemaker-controld[1085]:  notice: Result of start ope>
Apr 11 18:35:31 pm-test1 pacemaker-controld[1085]:  notice: Requesting local ex>
Apr 11 18:35:31 pm-test1 pacemaker-controld[1085]:  notice: Requesting local ex>
Apr 11 18:35:31 pm-test1 pacemaker-controld[1085]:  notice: Result of monitor o>
Apr 11 18:35:33 pm-test1 pacemaker-controld[1085]:  notice: Result of start ope>
Apr 11 18:35:33 pm-test1 pacemaker-controld[1085]:  notice: Requesting local ex>
Apr 11 18:35:33 pm-test1 pacemaker-controld[1085]:  notice: Result of monitor o

 


前編の、Pacemakerの設定と、正常系の動作確認としては、ここまでで完了です。
後編では、とくに運用面の、Packmakerの動作や自動/手動フェイルオーバーなどについて記載します。

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!