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