本サイトはプロモーションを含みます。

【Pacemaker+Corosync】Apacheクラスタを組んでフェイルオーバー/フェイルバックテストをおこなう

Pacemaker+CorosyncでApacheクラスタを組み基本的な導入から操作、動きの確認をおこないます。

前提条件

  • Firewalldは停止
  • SELinuxはDisabled
  • Apache導入済み
  • STONITHは無効
  • 3回のリソース障害でフェイルオーバーする
  • 自動フェイルバックしない
  • pcsではなくcrmを利用する

crmを使う理由ですが、業務では未だにcrmを使うことが多いため、あえてcrmを利用しています。

3回のリソース障害でフェイルオーバーさせる理由は、failcountが上がる課程を見るためです。

Pacemakerのインストール

パッケージダウンロード

CentOS 7(RHEL 7)向けのパッケージは以下のサイトからダウンロードします。

参考 Pacemaker-1.1系リポジトリパッケージ News of Linux-HA Japan

インストール前の準備

Linux-HA Japanが提供するPacemakerとOS同梱のPacemakerを分けるためにCentOS-Base.repoのbaseとupdatesにexlude設定を追加します。

修正するファイル

設定ファイル: /etc/yum.repos.d/CentOS-Base.repo

修正内容

[base]に以下の行を追加する

exclude=pacemaker* corosync* resource-agents* crmsh* cluster-glue* libqb* fence-agents* pcs*

[updates]に以下の行を追加する

exclude=pacemaker* corosync* resource-agents* crmsh* cluster-glue* libqb* fence-agents* pcs*

インストール

先ほどダウンロードしたrpmファイルをインストールします。

# yum -y install pacemaker-repo-1.1.21-1.1.el7.x86_64.rpm
# yum -y install pacemaker-all

Pacemaker設定

Corosync設定ファイル作成

設定ファイル: /etc/corosync/corosync.conf

以下のとおり最低限の設定をおこないます。

totem {
        version: 2

        token: 1000
        crypto_cipher: none
        crypto_hash: none

        interface {
                ringnumber: 0
                bindnetaddr: 192.168.0.0
                mcastaddr: 239.255.1.1
                mcastport: 5405
                ttl: 1
        }
}

logging {
        fileline: off
        to_stderr: no
        to_logfile: yes
        logfile: /var/log/cluster/corosync.log
        to_syslog: yes
        debug: off
        timestamp: on
        logger_subsys {
                subsys: QUORUM
                debug: off
        }
}

quorum {
        provider: corosync_votequorum
        expected_votes: 2
        two_node: 1
}

quorumの設定を空にしていたところ、ノード障害を起こして再起動した後にONLINEにならずCorosyncのCPU使用率が100%に張り付く事象が発生しましたので、ご注意ください。

Corosync認証鍵

Corosync認証鍵設定をおこないます。鍵はnode1で作成し、その他のノードへコピーします。

[root@node1 ~]# corosync-keygen -l
[root@node1 ~]# scp /etc/corosync/authkey node2:/etc/corosync/authkey

Pacemaker設定ファイルの修正

Pacemakerの内部プロセス障害もノード障害として扱うように設定します。

設定ファイル: /etc/sysconfig/pacemaker

設定ファイルに以下の1行を追加します。

PCMK_fail_fast=yes

クラスタ起動スクリプトの設定

  • pacemakerサービス停止時にcorosyncサービスも同時に停止させる
  • corosyncプロセス故障時にwatchdog 機能を有効にする
  • corosyncプロセス故障検知を迅速(6秒以内)におこなう

設定ファイルはパッケージ標準ディレクトリからローカル設定ディレクトリにコピーしてからおこないます。

# cp -p /usr/lib/systemd/system/corosync.service /etc/systemd/system/
# vi /etc/systemd/system/corosync.service

viでcorosync.serviceを編集し、以下の3行をアンコメントアウトします。

#Restart=on-failure
#RestartSec=70
#ExecStartPre=/sbin/modprobe softdog

Pacemaker起動

# systemctl start pacemaker

node1とnode2がオンラインになっていることを確認します。

コマンド: crm_mon -1

2 nodes configured
0 resources configured

Online: [ node1 node2 ]

No active resources

Apacheの設定

server-statusを有効化する

新規に設定ファイルを作成します。

ファイル名: /etc/httpd/conf.d/server-status.conf

ExtendedStatus On

<Location /server-status>
SetHandler server-status

Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>

server-statusは自分自身(127.0.0.1)のみ接続できるように制限しています。

PIDファイル指定

httpd.confに「PidFile」がなかったので最終行に以下を追加します。

PidFile /var/run/httpd/httpd.pid

Apacheを再起動します。

# systemctl restart httpd

Pacemaker起動

node1とnode2でPacemakerを起動、併せて自動起動を設定しておきます。

# systemctl start pacemaker
# systemctl enable pacemaker

pacemaker起動後、node1とnode2がオンラインであることを確認します。

# crm_mon -1
0 nodes configured
4 resources configured

Online: [ node1 node2 ]

クラスタ設定

赤色の箇所は環境によって変わるので適宜修正が必要です。

青色の箇所「migration-threshold="3"」は何回障害が発生したら切り替わるか設定している箇所なので必要に応じて変更してください。

crm configure property no-quorum-policy="ignore" stonith-enabled="false"
crm configure rsc_defaults resource-stickiness="INFINITY" migration-threshold="3"
crm configure primitive httpd ocf:heartbeat:apache params configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" op monitor interval="10s"
crm configure primitive vip ocf:heartbeat:IPaddr2 params ip="192.168.0.203" nic="ens33" cidr_netmask="24" op monitor interval="10s"
crm configure group web vip httpd
crm configure primitive ping ocf:pacemaker:ping params name="default_ping_set" host_list="192.168.0.1" multiplier="1000" dampen="5s" op monitor interval="10s"
crm configure clone clone_ping ping
crm configure location web_location web rule -inf: not_defined default_ping_set or default_ping_set lt 1000

上記の内容をnode1で投入しました。すべて投入すると以下のようになるはずです。

# crm_mon -1
2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node1
     httpd      (ocf::heartbeat:apache):        Started node1
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]
#

障害の発生と復旧

現在の状態を確認しておきます。

[root@node1 ~]# crm_mon -Af1
Stack: unknown
Current DC: node1 (version unknown) - partition with quorum
Last updated: Sun May  3 09:42:53 2020
Last change: Sun May  3 09:41:45 2020 by hacluster via crmd on node2

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node1
     httpd      (ocf::heartbeat:apache):        Started node1
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node1:
* Node node2:
[root@node1 ~]#

vipとhttpdはnode1で動いていることが分かります。

「Migration Summary:」の欄には何も表示されていないのでエラーが発生していないことが分かります。

node1で障害発生

ではnode1のhttpdを落としてみます。

[root@node1 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)

node1でhttpdを落とすと「Migration Summary:」欄のnode1で「fail-count=1」となったことが分かります。

そして3回障害が発生しないとnode2にフェイルオーバーしない設定を入れていますから、httpdは再起動してnode1で動いています。

[root@node1 ~]# crm_mon -Af1
Stack: unknown
Current DC: node1 (version unknown) - partition with quorum
Last updated: Sun May  3 09:47:12 2020
Last change: Sun May  3 09:41:45 2020 by hacluster via crmd on node2

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node1
     httpd      (ocf::heartbeat:apache):        Started node1
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node1:
   httpd: migration-threshold=3 fail-count=1 last-failure='Sun May  3 09:46:48 2020'
* Node node2:

Failed Resource Actions:
* httpd_monitor_10000 on node1 'not running' (7): call=110, status=complete, exitreason='',
    last-rc-change='Sun May  3 09:46:48 2020', queued=0ms, exec=0ms
[root@node1 ~]#

それでは更に2回httpdを落としてnode2にフェイルオーバーすることを確認します。

[root@node1 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)
[root@node1 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)

上記のように2回killコマンドを実行したあとのステータス確認結果は以下のとおりです。node1のfailcountは3になり、vipとhttpdがnode2で動いていることがわかります。

[root@node1 ~]# crm_mon -Af1
Stack: unknown
Current DC: node1 (version unknown) - partition with quorum
Last updated: Sun May  3 09:50:40 2020
Last change: Sun May  3 09:41:45 2020 by hacluster via crmd on node2

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node2
     httpd      (ocf::heartbeat:apache):        Started node2
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node1:
   httpd: migration-threshold=3 fail-count=3 last-failure='Sun May  3 09:50:21 2020'
* Node node2:

Failed Resource Actions:
* httpd_monitor_10000 on node1 'not running' (7): call=118, status=complete, exitreason='',
    last-rc-change='Sun May  3 09:50:21 2020', queued=0ms, exec=0ms
[root@node1 ~]#

node2で障害発生

それではnode2で3回httpdをkillするとどうなるのか?やってみます。

[root@node2 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)
[root@node2 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)
[root@node2 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)

node2のfailcountも3に達しました。そしてhttpdは「Stopped」となってしまいました。

[root@node1 ~]# crm_mon -Af1
Stack: unknown
Current DC: node1 (version unknown) - partition with quorum
Last updated: Sun May  3 09:53:38 2020
Last change: Sun May  3 09:41:45 2020 by hacluster via crmd on node2

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node2
     httpd      (ocf::heartbeat:apache):        Stopped
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node1:
   httpd: migration-threshold=3 fail-count=3 last-failure='Sun May  3 09:50:21 2020'
* Node node2:
   httpd: migration-threshold=3 fail-count=3 last-failure='Sun May  3 09:53:26 2020'

Failed Resource Actions:
* httpd_monitor_10000 on node1 'not running' (7): call=118, status=complete, exitreason='',
    last-rc-change='Sun May  3 09:50:21 2020', queued=0ms, exec=0ms
* httpd_monitor_10000 on node2 'not running' (7): call=94, status=complete, exitreason='',
    last-rc-change='Sun May  3 09:53:26 2020', queued=0ms, exec=0ms
[root@node1 ~]#

これはnode1とnode2のfailcoutが共に3に達してしまっているためです。この状態を復旧させるにはfailcoutをクリアしてやる必要があります。

復旧テスト

それではnode2のfailcountをクリアします。これはnode1とnode2のどちらで実行しても構いません。

[root@node1 ~]# crm resource cleanup httpd node2
Cleaned up vip on node2
Cleaned up httpd on node2
Waiting for 2 replies from the CRMd.. OK
[root@node1 ~]#

failcountをクリアしたあと、node2でふたたびhttpdが動き出したことが分かります。

[root@node1 ~]# crm_mon -Af1
Stack: unknown
Current DC: node1 (version unknown) - partition with quorum
Last updated: Sun May  3 09:58:42 2020
Last change: Sun May  3 09:58:17 2020 by hacluster via crmd on node2

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node2
     httpd      (ocf::heartbeat:apache):        Started node2
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node1:
   httpd: migration-threshold=3 fail-count=3 last-failure='Sun May  3 09:50:21 2020'
* Node node2:

Failed Resource Actions:
* httpd_monitor_10000 on node1 'not running' (7): call=118, status=complete, exitreason='',
    last-rc-change='Sun May  3 09:50:21 2020', queued=0ms, exec=0ms
[root@node1 ~]#

この状態でnode2に障害が発生するとnode1のfailcoutは3のままのためフェイルオーバーしません。そのためnode1のfailcountもクリアしましょう。

[root@node1 ~]# crm resource cleanup httpd node1
Cleaned up vip on node1
.Cleaned up httpd on node1
Waiting for 1 reply from the CRMd. OK
[root@node1 ~]#

node1でfailcountをクリアすると「Migration Summary:」の欄がきれいになりました。

[root@node1 ~]# crm_mon -Af1
Stack: unknown
Current DC: node1 (version unknown) - partition with quorum
Last updated: Sun May  3 10:00:47 2020
Last change: Sun May  3 10:00:25 2020 by hacluster via crmd on node1

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node2
     httpd      (ocf::heartbeat:apache):        Started node2
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node1:
* Node node2:
[root@node1 ~]#

フェイルバックさせる

個人的にはnode1とnode2のどちらでvipとhttpdが動いていても良いのでは?と思いますが、業務ではフェイルバックを求められることがあります。

そのためnode1でvipとhttpdが動くようにリソースを移動させましょう。

リソースを移動するには crm resource move コマンドを実行します。このコマンドもnode1とnode2のどちらで実行しても構いません。

今回は「force」オプションを付けています。理由は後述しますが、強制的にリソースを移動させると以下のようにWARNINGが表示されます。

[root@node1 ~]# crm resource move web node1 force
WARNING: Creating rsc_location constraint 'cli-ban-web-on-node2' with a score of -INFINITY for resource web on node2.
        This will prevent web from running on node2 until the constraint is removed using the clear option or by editing the CIB with an appropriate tool
        This will be the case even if node2 is the last node in the cluster
[root@node1 ~]#

ステータスは以下のようになります。

[root@node1 ~]# crm_mon -Af1
Stack: corosync
Current DC: node1 (version 1.1.21-1.el7-f14e36f) - partition with quorum
Last updated: Sun May  3 11:14:59 2020
Last change: Sun May  3 11:14:10 2020 by root via crm_resource on node1

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node1
     httpd      (ocf::heartbeat:apache):        Started node1
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node2:
* Node node1:
[root@node1 ~]#

これでリソース移動はできたのですが、さきほどのWARNINGで表示されたようにnode1で障害が発生した際にnode2へフェイルオーバーしなくなります。やってみましょう。

[root@node1 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)
[root@node1 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)
[root@node1 ~]# kill -9 $(cat /etc/httpd/run/httpd.pid)

以下のようにhttpdがStoppoedとなってしまいます。

[root@node1 ~]# crm_mon -Af1
Stack: corosync
Current DC: node1 (version 1.1.21-1.el7-f14e36f) - partition with quorum
Last updated: Sun May  3 11:17:11 2020
Last change: Sun May  3 11:14:10 2020 by root via crm_resource on node1

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node1
     httpd      (ocf::heartbeat:apache):        Stopped
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node2:
* Node node1:
   httpd: migration-threshold=3 fail-count=3 last-failure='Sun May  3 11:16:55 2020'

Failed Resource Actions:
* httpd_monitor_10000 on node1 'not running' (7): call=36, status=complete, exitreason='',
    last-rc-change='Sun May  3 11:16:55 2020', queued=0ms, exec=0ms
[root@node1 ~]#

この原因はcrm configure showでわかります。

[root@node1 ~]# crm configure show
node 3232235721: node1 \
        attributes standby=off
node 3232235722: node2 \
        attributes standby=off
primitive httpd apache \
        params configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" \
        op monitor interval=10s
primitive ping ocf:pacemaker:ping \
        params name=default_ping_set host_list=192.168.0.1 multiplier=1000 dampen=5s \
        op monitor interval=10s
primitive vip IPaddr2 \
        params ip=192.168.0.203 nic=ens33 cidr_netmask=24 \
        op monitor interval=10s
group web vip httpd
clone clone_ping ping
location cli-ban-web-on-node2 web role=Started -inf: node2 ★これが原因
location cli-prefer-httpd httpd role=Started inf: node2
location cli-prefer-web web role=Started inf: node1
location web_location web \
        rule -inf: not_defined default_ping_set or default_ping_set lt 1000
property cib-bootstrap-options: \
        no-quorum-policy=ignore \
        stonith-enabled=false \
        last-lrm-refresh=1588469590 \
        have-watchdog=false \
        dc-version=1.1.21-1.el7-f14e36f \
        cluster-infrastructure=corosync
rsc_defaults rsc-options: \
        resource-stickiness=INFINITY \
        migration-threshold=3
[root@node1 ~]#

上記の★を付けたところが原因です(「-inf」はここでは動かないという意味)。

これはクラスタ設定で「resource-stickiness=”INFINITY”」としていることが原因です。「resource-stickiness=”INFINITY”」を設定していると「force」オプションを使って強制しないとリソース移動ができないのですが、強制的にリソースを移動するとリソース移動禁止設定が入ってしまいます。

「resource-stickiness=”0″」にすればforceオプションは不要ですしリソース移動禁止設定が入ることもないのですが、そうすると自動フェイルバックしてしまうため「resource-stickiness=”INFINITY”」と設定しています。

そのため crm resource move コマンドでリソースを強制移動した後は以下のようにしてリソース移動禁止設定を削除してやります。

[root@node1 ~]# crm resource unmove web

上記のコマンドを投入するとリソース移動禁止設定が消えてnode2にフェイルオーバーします。

[root@node1 ~]# crm_mon -Af1
Stack: corosync
Current DC: node1 (version 1.1.21-1.el7-f14e36f) - partition with quorum
Last updated: Sun May  3 11:58:36 2020
Last change: Sun May  3 11:56:25 2020 by root via crm_resource on node1

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Active resources:

 Resource Group: web
     vip        (ocf::heartbeat:IPaddr2):       Started node2
     httpd      (ocf::heartbeat:apache):        Started node2
 Clone Set: clone_ping [ping]
     Started: [ node1 node2 ]

Node Attributes:
* Node node1:
    + default_ping_set                  : 1000
* Node node2:
    + default_ping_set                  : 1000

Migration Summary:
* Node node2:
* Node node1:
   httpd: migration-threshold=3 fail-count=3 last-failure='Sun May  3 11:58:05 2020'

Failed Resource Actions:
* httpd_monitor_10000 on node1 'not running' (7): call=118, status=complete, exitreason='',
    last-rc-change='Sun May  3 11:58:05 2020', queued=0ms, exec=0ms
[root@node1 ~]#

クラスタ操作コマンド

ノード操作

ノードをオフラインにする

crm node standby node2
crm node standby node1

ノードをオンラインにする

crm node standby node1
crm node standby node2

設定関連

設定表示

crm configure show

設定編集

crm configure edit

設定削除

①各ノードをオフラインにする

crm node standby node2
crm node standby node1

②設定削除する

crm configure erase

③各ノードをオンラインに戻す

crm node standby node1
crm node standby node2

リソース操作

リソース移動

crm resource move web node2

Failcountクリア

crm resource cleanup web node1

ステータス確認

「-f」オプションを付けるとfailcountを確認できる。

リアルタイムで更新したい場合

crm_mon -Af

1回だけ表示させておわり

crm_mon -Af1

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)