ラベル Pacemaker の投稿を表示しています。 すべての投稿を表示
ラベル Pacemaker の投稿を表示しています。 すべての投稿を表示
2023年10月28日土曜日

Pacemaker+Corosyncのハートビートのタイムアウト値を変更する

以前の記事にて、Pacemaker+Corosyncにてクラスターを構成し、NGINXなどを冗長化する手順を記載した。

今までは細かいチューニングはしてこなかったが、先日検証環境にて仮想マシンを3台同時にOSインストールを行ったところ、負荷上昇に伴い、Corosyncにて以下のようなハートビートの閾値超過の警告メッセージが表示された。

Error in corosync.log : Aug 05 07:42:28 [2474] t3046ngnx 
corosync warning [MAIN  ] 
Corosync main process was not scheduled (@1691188948066) 
for 2737.8225 ms (threshold is 2400.0000 ms). 
Consider token timeout increase.

要約すると、「Corosyncのハートビート(token)がタイムアウト値の閾値に近づいていることから、タイムアウト値の増加を検討せよ」、というメッセージとなる。

本記事では、Pacemaker+Corosyncのハートビートのタイムアウト値を変更する手順を記載する。

環境

今回検証した環境は以下の通り。

  • OS : AlmaLinux release 9.2
  • Pacemaker : version 2.1.5
  • Corosync : Corosync Cluster Engine, version ‘3.1.7’

念のため、Pacemaker+Corosyncのクラスター構成図を以下に記載する。

Corosyncのハートビートのタイムアウト値を変更する手順 (pcsコマンドで設定する場合)

pcsコマンドで以下の通り実行すれば、corosync.confへの設定追記から各ノードへの同期・反映まで、必要な作業はすべて実施してくれる。

最も簡単な手順となるため、通常はpcsコマンドで設定すれば問題ないだろう。

# pcs cluster config update totem token=5000
Sending updated corosync.conf to nodes...
t3045ngnx: Succeeded
t3046ngnx: Succeeded
t3045ngnx: Corosync configuration reloaded

Corosyncのハートビートのタイムアウト値を変更する手順 (手動で設定する場合)

もし、pcsコマンドではなく手動で実施したい場合は本手順で実施する。

1. 設定前確認

Corosyncのハートビート間隔は、tokenという値で設定されている。現在の設定はcorosync-cmapctlコマンドで確認できる。現在は、3000ミリ秒(3秒)で設定されていることがわかる。

# corosync-cmapctl | egrep 'token|consensus'
runtime.config.totem.cancel_token_hold_on_retransmit (u32) = 0
runtime.config.totem.consensus (u32) = 3600
runtime.config.totem.token (u32) = 3000 # <-★3000ミリ秒で設定(デフォルト)
runtime.config.totem.token_retransmit (u32) = 714
runtime.config.totem.token_retransmits_before_loss_const (u32) = 4
runtime.config.totem.token_warning (u32) = 75

タイムアウト値の修正は基本的にtokenのみで問題ないが、関連して自動計算されるconsensusという値もある。他にもtokenの値などから自動計算されるパラメータがあるが、本記事では設定しないので説明は割愛する。

設定項目 内容
token ハートビート間隔(ミリ秒)。こちらの間隔の80%を超えると警告メッセージが表示される(そのため、前述したメッセージでは閾値が2400.0000 msと表示されている)。
consensus 新しいメンバーシップの設定を開始する前に合意が得られるまでの待ち時間。自動的にtoken * 1.2倍で設定される値ため、原則個別設定は不要。

2. corosync.confを修正

/etc/corosync/corosync.confに対して、以下設定を追加する。

# vi /etc/corosync/corosync.conf
totem {
    version: 2
    cluster_name: clst-01
    transport: knet
    crypto_cipher: aes256
    crypto_hash: sha256
    cluster_uuid: 956d398413b349219b60cef218e681f9
    token: 5000 # <-★追加
}

3. クラスター間で設定を同期

設定したcorosync.confの内容をクラスターに所属する全ノードに同期させる。

# pcs cluster sync
t3045ngnx: Succeeded
t3046ngnx: Succeeded
Warning: Corosync configuration has been synchronized, please reload corosync daemon using 'pcs cluster reload corosync' command.

4. クラスターに設定を反映

同期した設定を反映させる。

# pcs cluster reload corosync
Corosync reloaded

5. 設定後確認

再度Corosyncの設定状況を確認すると、以下の通りtokenの設定が更新されていることがわかる。

# corosync-cmapctl | egrep 'token|consensus'
runtime.config.totem.cancel_token_hold_on_retransmit (u32) = 0
runtime.config.totem.consensus (u32) = 6000
runtime.config.totem.token (u32) = 5000 # <-★更新されている
runtime.config.totem.token_retransmit (u32) = 1190
runtime.config.totem.token_retransmits_before_loss_const (u32) = 4
runtime.config.totem.token_warning (u32) = 75
totem.token (u32) = 5000

以上で、Pacemaker+Corosyncのハートビートのタイムアウト値を変更する手順は完了となる。

参考

2020年9月19日土曜日

Pacemakerにて「リソース単位」でメンテナンスモードに変更する手順

Pacmekaerのクラスタ環境にてクラスタリソースの監視を抑止する「メンテナンスモード」について、以前以下記事にて記載した。

上記記事では、「クラスタ全体」及び「ノード単位」を対象としたメンテナンスモードへの変更方法を記載している。しかし、状況によっては個々の「リソース単位」でメンテナンスモードことが必要な場合もあるだろう。

そのような場合を想定して、Pacmekaerでは特定リソースをメンテナンスモードにするコマンドが用意されている。今回は個々のリソース単位でのメンテナンスモードへの変更方法を記載する。

特定リソースをメンテナンスモードにするコマンド

特定のリソースをメンテナンスモードへ変更するには、pcs resource unmanageコマンドで実行可能となる。

# pcs resource unmanage <リソース名>

メンテナンスモードを解除するには、pcs resource manageコマンドとなる。

# pcs resource manage <リソース名>

実際にリソースをメンテナンスモードにしてみた

実際に実行した結果を以下に記載する。★箇所の特定のリソースのみ「unmanaged」ステータスになっていることがわかる。

# pcs resource unmanage rs-systemd-postfix
# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3022cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Sat Aug 22 22:56:09 2020
  * Last change:  Sat Aug 22 22:56:06 2020 by root via cibadmin on t3021cent
  * 2 nodes configured
  * 9 resource instances configured

Node List:
  * Online: [ t3021cent t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent
    * rs-systemd-squid  (systemd:squid):        Started t3021cent
    * rs-systemd-postfix        (systemd:postfix):      Started t3021cent (unmanaged) ★
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * Started: [ t3021cent t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3021cent t3022cent ]
  * rs-stonith-01       (stonith:fence_ESXi):   Started t3021cent
  * rs-stonith-02       (stonith:fence_ESXi):   Started t3022cent

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled
2020年8月2日日曜日

Pacemakerでメンテナンスモードを使って、クラスタリソースのフェイルオーバーを抑止する

Pacmekaerでは、Pacmekaer自身の計画的なバージョンアップやリソースの設定変更時などにおいて、予期せぬリソースのフェイルオーバーやSTONITH発動を抑止することを目的として「メンテナンスモード」という機能が用意されている。

メンテナンスモード実行方法

クラスタ全体をメンテナンスモードにする場合

クラスタ全体をメンテナンスモードにする場合は、以下を実行する。「maintenance」のスペルが長くて面倒くさいが、頑張って入力する

# pcs node maintenance --all

クラスタ全体をメンテナンスモードから通常状態に戻すには、以下を実行する。

# pcs node unmaintenance --all

各ノード単位でメンテナンスモードにする場合

ノード単位でメンテナンスモードにする場合は、以下を実行する。対象ノード名を省略した場合は、コマンドを実行したノードがメンテナンスモードになる。

# pcs node maintenance <対象ノード名>

ノード単位でメンテナンスモードから通常状態に戻すには、以下を実行する。対象ノード名を省略した場合は、コマンドを実行したノードが通常状態に戻る。

# pcs node unmaintenance <対象ノード名>

実際にメンテナンスモードを試してみた

実際にクラスタをメンテナンスモードにした際の動作を確認してみよう。

ノード#1 (t3021cent) をメンテナンスモードにした状態で、手動でSquidのサービスを停止しても、リソースのフェイルオーバーが発生しないことを確認する。

まずは、ノード#1をメンテナンスモードにする。ノードのステータスが「maintenance」となり(★1箇所)、各リソースは「unmanaged」と表示される(★2箇所)。

# pcs node maintenance t3021cent
# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Wed Jul 29 08:50:02 2020
  * Last change:  Wed Jul 29 08:49:57 2020 by root via cibadmin on t3021cent
  * 2 nodes configured
  * 8 resource instances configured

Node List:
  * Node t3021cent: maintenance ★1
  * Online: [ t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent (unmanaged) ★2
    * rs-systemd-squid  (systemd:squid):        Started t3021cent (unmanaged) ★2
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * rs-systemd-unbound        (systemd:unbound):      Started t3021cent (unmanaged) ★2
    * Started: [ t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * rs-ping-33        (ocf::pacemaker:ping):  Started t3021cent (unmanaged) ★2
    * Started: [ t3022cent ]
  * rs-stonith-01       (stonith:fence_ESXi):   Started t3021cent (unmanaged) ★2
  * rs-stonith-02       (stonith:fence_ESXi):   Started t3022cent

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

この状態でsquidを手動で停止させてみる。

# systemctl status squid | grep Active
   Active: active (running) since Sat 2020-07-25 15:45:49 JST; 3 days ago
# systemctl stop squid
# systemctl status squid | grep Active
   Active: inactive (dead)

Squidを停止させても、Squidのリソースである「rs-systemd-squid」のステータスは「Started t3021cent (unmanaged)」となっており(★箇所)、フェイルオーバーが発生しないことがわかる。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Wed Jul 29 08:55:31 2020
  * Last change:  Wed Jul 29 08:49:57 2020 by root via cibadmin on t3021cent
  * 2 nodes configured
  * 8 resource instances configured

Node List:
  * Node t3021cent: maintenance
  * Online: [ t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent (unmanaged)
    * rs-systemd-squid  (systemd:squid):        Started t3021cent (unmanaged) ★
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * rs-systemd-unbound        (systemd:unbound):      Started t3021cent (unmanaged)
    * Started: [ t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * rs-ping-33        (ocf::pacemaker:ping):  Started t3021cent (unmanaged)
    * Started: [ t3022cent ]
  * rs-stonith-01       (stonith:fence_ESXi):   Started t3021cent (unmanaged)
  * rs-stonith-02       (stonith:fence_ESXi):   Started t3022cent

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

Squidを停止したままメンテナンスモードを解除するとフェイルオーバーしてしまうので、Squidを起動した後、メンテナンスモード解除を行う。

# systemctl start squid
# pcs node unmaintenance t3021cent
# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Wed Jul 29 08:56:52 2020
  * Last change:  Wed Jul 29 08:56:48 2020 by root via cibadmin on t3021cent
  * 2 nodes configured
  * 8 resource instances configured

Node List:
  * Online: [ t3021cent t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent
    * rs-systemd-squid  (systemd:squid):        Started t3021cent
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * Started: [ t3021cent t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3021cent t3022cent ]
  * rs-stonith-01       (stonith:fence_ESXi):   Started t3021cent
  * rs-stonith-02       (stonith:fence_ESXi):   Started t3022cent

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

以上でメンテナンスモードの動作確認は完了となる。

2020年7月30日木曜日

無償版ESXiでPacemakerのSTONITHを実装する

前回、CentOS 8にPacemakerを導入し、Squidをクラスタ構成にて構築した。

★前回の記事はこちら↓

今回はPacemakerの2ノードクラスタ構成で必要な設定となるSTONITHについて記載する。

STONITHとは

Pacemakerでは、2台のノードでクラスタを構成する場合は、STONITHの設定が必須となる。STONITHとは、「Shoot-The-Other-Node-In-The-Head」の略称であり、OSやクラスタリソースがハングアップした際に、強制的にノードの電源を停止させることで、ハングアップを解消させる機能となる。

STONITHは物理サーバであれば、商用向けのサーバに標準で搭載されているIPMI (例えばHPE製サーバであればiLO) の機能を利用して物理サーバ自体の電源をOFFにする。

仮想マシンであれば、仮想化ハイパーバイザ (ESXiやHyper-V) や仮想環境の統合管理機能 (vCenter ServerやSystem Center) に対して仮想マシンの電源をOFFにする指示を行うことでSTONITHを実現する。

VMware仮想環境におけるSTONITH実装方法

VMware仮想環境の場合、Pacemakerに標準で含まれるSTONITHエージェントとしてfence_vmware_soapがあり、ESXiに対してもサポートはしているのだが、前提としてvSphere APIを利用してESXiに対して仮想マシンの電源操作ができる必要がある。

しかし、無償版ESXiではvSphere APIが利用できないことからfence_vmware_soapは動作させることができない。そこで、GitHubで公開されているjosenk氏作成のfence_ESXiのスクリプトを利用してSTONITHの実装を行ってみた。なお、ライセンス形態はGPL (GNU General Public License) となる。

環境

今回fence_ESXiにてSTONITHの設定を行うクラスタの構成図は以下の通りとなる。2台の以下のノードでクラスタを構成する。それぞれのノードとなる仮想マシンは別のESXiで稼働しており、ESXiは無償版ライセンスで稼働している。

  • ノード#1 : t3021cent
  • ノード#2 : t3022cent

fence_ESXiのスクリプトをCentOS 8で動作するよう改修

ダウンロードしたfence_ESXiは「/usr/sbin」配下に配置し、実行権限を付与する。

# chown root:root /usr/sbin/fence_ESXi
# chmod 755 /usr/sbin/fence_ESXi
# ls -l /usr/sbin/fence_ESXi
-rwxr-xr-x 1 root root  3049  7月 23 20:19 /usr/sbin/fence_ESXi

fence_ESXiはPythonでコーディングされている。しかし、そのまま実行するとPythonのバージョン差異などによってCentOS 8では動作しない。fence_ESXiを動作させるためには、以下4点の修正が必要となる

  • 1行目の/usr/bin/python/usr/bin/python3に修正
  • インデントがタブではなくスペース x 8になっている箇所があるため修正
  • exceptionsモジュールはPython3では標準モジュールとして組み込まれたため不要となることから、importの対象から削除
  • conn.log_expect関数は引数が3つに変更されたため、先頭のoptionsの引数を削除

上記変更をsedで記載すると以下のようになる。

sed -i -e 's#/usr/bin/python#/usr/bin/python3#g' \
    -e 's/^        /\t/g' \
    -e 's/, exceptions//g' \
    -e 's/conn.log_expect(options, /conn.log_expect(/g' \
    /usr/sbin/fence_ESXi

fence_ESXiの動作確認

fence_ESXi実行時のオプションは以下の通り。

オプション 説明
--ip=<IP or Hostname> ESXiのIPアドレスまたはホスト名を指定。
--username=<Username> ESXiのSSH接続可能なユーザを指定。通常はrootになると思われる。
--password=<Password> usernameで指定したユーザのパスワードを指定。
-o <Action> ESXiに実行するアクションを指定する。仮想マシン一覧表示 (list)、ステータス表示 (status)、電源ON (on)、電源OFF (off)のアクションを選択可能。

コマンド実行例は以下の通り。Pacemakerのノードとなる仮想マシンがリストに含まれていれば問題ない。

# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o list
~(中略)~
t3022cent,14
~(以下略)~

電源ON (on)、電源OFF (off)の動作も試してみよう。エラーが表示されず、「Success」と表示されればOKとなる。

# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o off -n t3022cent
Success: Powered OFF
# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o status -n t3022cent
Status: OFF
# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o on -n t3022cent
Success: Powered ON
# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o status -n t3022cent
Status: ON

Pacemakerへfence_ESXiを使ったSTONITHデバイスを作成

スクリプトが正常に動作することを確認できたら、実際にfence_ESXiを使ってSTONITHデバイスを作成してみよう。作成するSTONITHデバイスの設定は以下の通りとなる。

STONITHデバイス名 実行ノード 電源操作対象ノード 電源操作対象ESXi
rs-stonith-01 ノード#1 (t3021cent) ノード#2 (t3022cent) 192.168.33.10
rs-stonith-02 ノード#2 (t3022cent) ノード#1 (t3021cent) 192.168.33.12

STONITHデバイスの作成はpcs stonith createコマンドにて行う。

# pcs stonith create rs-stonith-01 fence_ESXi ipaddr=192.168.33.10 login=root passwd="XXXXXXXX"
# pcs stonith create rs-stonith-02 fence_ESXi ipaddr=192.168.33.12 login=root passwd="XXXXXXXX"

STONITHデバイスは、実行ノード以外で起動させる必要はないため、実行ノード以外のノードで起動しないようロケーション制約を設定する。

# pcs constraint location rs-stonith-01 avoids t3022cent
# pcs constraint location rs-stonith-02 avoids t3021cent
# pcs constraint
Location Constraints:
  Resource: rg-01
    Constraint: location-rg-01
      Rule: boolean-op=or score=-INFINITY
        Expression: pingd lt 1
        Expression: not_defined pingd
  Resource: rs-stonith-01
    Disabled on:
      Node: t3022cent (score:-INFINITY)
  Resource: rs-stonith-02
    Disabled on:
      Node: t3021cent (score:-INFINITY)
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

STONITHデバイス作成直後は、エラーが表示されることがあるようなので、一度エラーをpcs stonith cleanupコマンドでクリーンアップしておく。

# pcs stonith cleanup
Cleaned up all resources on all nodes

最終的に、クラスタの構成は以下の通り。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Thu Jul 23 22:57:43 2020
  * Last change:  Thu Jul 23 22:57:26 2020 by hacluster via crmd on t3022cent
  * 2 nodes configured
  * 8 resource instances configured

Node List:
  * Online: [ t3021cent t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent
    * rs-systemd-squid  (systemd:squid):        Started t3021cent
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * Started: [ t3021cent t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3021cent t3022cent ]
  * rs-stonith-01       (stonith:fence_ESXi):   Started t3021cent
  * rs-stonith-02       (stonith:fence_ESXi):   Started t3022cent

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

STONITHの動作確認

STONITHを発生させるには、クラスタ間通信を行うネットワークをすべて切断すればよいが、今回は手軽にコマンドにてSTONITHを実行してみることにする。STONITHの手動実行はpcs stonith fence <電源操作対象ノード>にて行う。

# pcs stonith fence t3022cent
Node: t3022cent fenced

STONITHが実行され、ノード#2 (t3022cent) がOFFLINEになっていることがわかる。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Thu Jul 23 23:08:47 2020
  * Last change:  Thu Jul 23 23:03:04 2020 by root via cibadmin on t3022cent
  * 2 nodes configured
  * 8 resource instances configured

Node List:
  * Online: [ t3021cent ]
  * OFFLINE: [ t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent
    * rs-systemd-squid  (systemd:squid):        Started t3021cent
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * Started: [ t3021cent ]
    * Stopped: [ t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3021cent ]
    * Stopped: [ t3022cent ]
  * rs-stonith-01       (stonith:fence_ESXi):   Started t3021cent
  * rs-stonith-02       (stonith:fence_ESXi):   Stopped

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

ESXiのVMware Host Clientでも、Power Off VMが実行されたのちPower On VMが実行されている。これは、STONITHのデフォルト動作がノードの再起動であるためであり、電源OFFしたのち電源ONが実行される正常な動作となる

まとめ

STONITHはクラスタリソースを正常に稼働させるうえで必要な機能であるが、クラスタの構築中などでは予期せぬタイミングでノードの電源OFFが発生することがある。クラスタの構築中は、メンテナンスモードにするなどして運用するほうが効率的な場合もあるだろう。

2020年7月25日土曜日

CentOS 8 + PacemakerでSquidとUnboundを冗長化する

自宅環境ではインターネット接続用のプロキシサーバ兼DNSサーバとしてSquidとUnboundの仮想マシンを稼働させている。このサーバが停止すると、インターネット接続ができなくなるため、ESXiのメンテナンスなどでサーバ停止が必要となる場合は、誰も利用していない時間帯を選ぶなどの考慮が必要だった。

先日、自作PCを構築して検証用PCが2台になったことから、それぞれのESXi上にCentOSの仮想マシンを構築し、SquidとUnboundをPacemakerでクラスタに組み込みを行い冗長化することにした。

また、RHEL7/CentOS 7のPacemakerと比べると、一部コマンドに差異があることが確認できたので、その点についても記載する。

環境

クラスタの構成図は以下の通りとなる。2台の以下のノードでクラスタを構成する。

  • ノード#1 : t3021cent
  • ノード#2 : t3022cent

なお、上記図ではSTONITH用のリソース (青色箇所) が設定されているが、説明が長くなるため、今回はSTONITHは無効として設定する。STONITHの有効化とSTONITH動作用のリソース(フェンスデバイス)の作成方法は、別記事にて記載することにする。

Pacemakerインストール

1. firewalldとSELinuxを停止

firewalldとSELinuxが動作しているといろいろ面倒なので停止しておく。

# systemctl stop firewalld
# systemctl disable firewalld
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
# reboot

2. Pacemaker + Corosyncインストール

PacemakerはCentOSの標準のレポジトリには登録されていないので、dnfコマンドを実行してもインストールに失敗する。

# dnf install pacemaker pcs fence-agents-all pcp-zerocon
メタデータの期限切れの最終確認: 0:19:53 時間前の 2020年07月18日 21時36分40秒 に 実施しました。
No match for argument: pacemaker
No match for argument: pcs
エラー: 一致するものが見つかりません: pacemaker pcs

dnf repolist allにてレポジトリを確認すると、「HighAvailability」のレポジトリが存在することがわかる。こちらを有効にすることでインストールが可能となる。

# dnf repolist all
repo id              repo の名前                                          状態
AppStream            CentOS-8 - AppStream                                 有効化
AppStream-source     CentOS-8 - AppStream Sources                         無効化
BaseOS               CentOS-8 - Base                                      有効化
BaseOS-source        CentOS-8 - BaseOS Sources                            無効化
Devel                CentOS-8 - Devel WARNING! FOR BUILDROOT USE ONLY!    無効化
HighAvailability     CentOS-8 - HA                                        無効化
PowerTools           CentOS-8 - PowerTools                                無効化
base-debuginfo       CentOS-8 - Debuginfo                                 無効化
c8-media-AppStream   CentOS-AppStream-8 - Media                           無効化
c8-media-BaseOS      CentOS-BaseOS-8 - Media                              無効化
centosplus           CentOS-8 - Plus                                      無効化
centosplus-source    CentOS-8 - Plus Sources                              無効化
cr                   CentOS-8 - cr                                        無効化
extras               CentOS-8 - Extras                                    有効化
extras-source        CentOS-8 - Extras Sources                            無効化
fasttrack            CentOS-8 - fasttrack                                 無効化

dnfのオプションに--enablerepo=HighAvailabilityを付与してインストールを実行すればよい。

# dnf --enablerepo=HighAvailability install pacemaker pcs fence-agents-all pcp-zeroconf -y

なお、pcp-zeroconfは以下RHEL 8のマニュアルにてインストールが推奨とされているのでインストールしているが、トラブルシュート時に利用するツールのようで、Pacemakerの動作に必須となるパッケージではない。

3. haclusterユーザのパスワード設定

Pacemakerをインストールすると、「hacluster」というユーザが自動で作成される。この「hacluster」ユーザに対して、クラスタの参加ノード全台で共通パスワードを設定しておく。

# cat /etc/passwd | tail
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
rngd:x:994:991:Random Number Generator Daemon:/var/lib/rngd:/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
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin ←★自動で追加されたクラスタ管理用ユーザ
# passwd hacluster
ユーザー hacluster のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

4. hosts設定

hostsファイルにはクラスタで利用するIPアドレスをすべて登録しておく。

# vi /etc/hosts
192.168.33.21    t3021cent
192.168.22.21    t3021cent-22
192.168.33.22    t3022cent
192.168.22.22    t3022cent-22

5. クラスタサービス起動

クラスタのサービスである「pcsd」を起動させる。

# systemctl start pcsd.service
# systemctl enable pcsd.service

ここまでで、インストール作業は完了となる。次に、クラスタの初期設定を行っていく。

Pacemaker初期設定

1. クラスタ認証設定

クラスタに参加させるノードを認証させる。CentOS 8より前のバージョンでは、pcs cluster authコマンドで実施していたが、以下の通りエラーとなってしまう。

# pcs cluster auth -u hacluster -p 'XXXXXXXX' t3021cent t3022cent

Usage: pcs cluster auth...
    auth [-u <username>] [-p <password>]
        Authenticate pcs/pcsd to pcsd on nodes configured in the local cluster.

Hint: Syntax has changed from previous version. See 'man pcs' -> Changes in pcs-0.10.

pcs host authコマンドに変更されたようなので、コマンドを修正して再度実行する。構文は以下の通り。

pcs host auth <Node#1名> <Node#2名> -u hacluster -p '<haclusterのパスワード>'

コマンドを実行し、参加対象のノードが「Authorized」となれば成功となる。

# pcs host auth t3021cent t3022cent -u hacluster -p 'XXXXXXXX'
t3022cent: Authorized
t3021cent: Authorized

2. クラスタの初期セットアップ

次にクラスタの初期セットアップをする。CentOS 8より前のバージョンでは各ノードのIPアドレスをカンマ区切りで記述することで登録することができていたが、エラーになってしまった。これもどうやら構文が変わったようだ。

# pcs cluster setup --start --name clst-01 t3021cent,t3021cent-22 t3022cent,t3022cent-22
Error: Specified option '--name' is not supported in this command
Hint: Syntax has changed from previous version. See 'man pcs' -> Changes in pcs-0.10.

CentOS 8ではpcs cluster setupの構文は以下となる。

pcs cluster setup <クラスタ名> --start <Node#1名> addr=<Node#1 IPアドレス1> addr=<Node#1 IPアドレス2> <Node#2名> addr=<Node#2 IPアドレス1> addr=<Node#2 IPアドレス2>

コマンドを実行し、「Cluster has been successfully set up.」と表示されれば成功となる。

# pcs cluster setup clst-01 --start t3021cent addr=192.168.33.21 addr=192.168.22.21 t3022cent addr=192.168.33.22 addr=192.168.22.22
Destroying cluster on hosts: 't3021cent', 't3022cent'...
t3022cent: Successfully destroyed cluster
t3021cent: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 't3021cent', 't3022cent'
t3021cent: successful removal of the file 'pcsd settings'
t3022cent: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 't3021cent', 't3022cent'
t3021cent: successful distribution of the file 'corosync authkey'
t3021cent: successful distribution of the file 'pacemaker authkey'
t3022cent: successful distribution of the file 'corosync authkey'
t3022cent: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 't3021cent', 't3022cent'
t3021cent: successful distribution of the file 'corosync.conf'
t3022cent: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.
Starting cluster on hosts: 't3021cent', 't3022cent'...

初期状態でのクラスタの状態も見ておこう。「Online: [ t3021cent t3022cent ]」と表示されていれば、ひとまずOKである。

# pcs status
Cluster name: clst-01

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

Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Sun Jul 19 00:47:54 2020
  * Last change:  Sun Jul 19 00:46:52 2020 by hacluster via crmd on t3021cent
  * 2 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ t3021cent t3022cent ]

Full List of Resources:
  * No resources

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

クラスタの管理通信 (Corosyncの通信) も2つのネットワークで冗長化されていることをcorosync-cfgtool -sコマンドで確認する。以下コマンドで「LINK ID 0」と「LINK ID 1」の2つが表示されればOKとなる。

# corosync-cfgtool -s
Printing link status.
Local node ID 2
LINK ID 0
        addr    = 192.168.33.22
        status:
                nodeid  1:      link enabled:1  link connected:1
                nodeid  2:      link enabled:1  link connected:1
LINK ID 1
        addr    = 192.168.22.22
        status:
                nodeid  1:      link enabled:1  link connected:1
                nodeid  2:      link enabled:0  link connected:1

3. STONITH無効化

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

  • クォーラム設定を「ignore」に設定 (no-quorum-policy=ignore)
  • STONITHを設定 (stonith-enabled=true ※デフォルト)

ただし、説明が長くなるため、今回はSTONITHは無効として設定する。設定は以下のようにpcs propertyコマンドにて実施する。

# pcs property
Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: clst-01
 dc-version: 2.0.3-5.el8_2.1-4b1f869f0f
 have-watchdog: false
# pcs property set no-quorum-policy=ignore
# pcs property set stonith-enabled=false
# pcs property
Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: clst-01
 dc-version: 2.0.3-5.el8_2.1-4b1f869f0f
 have-watchdog: false
 no-quorum-policy: ignore
 stonith-enabled: false

以上で、クラスタの初期セットアップは終了となる。次にクラスタのリソースを作成していく。

Squid用のリソースおよびVIP作成

SquidはActive/Standby構成とする。VIPとともにフェイルオーバーさせるため、リソースグループ「rg-01」を作成して、SquidとVIPのリソースを所属させる。リソースグループに所属させるため--groupオプションを付与する。リソースグループ内のリソースは上位から起動するため、--before--afterオプションを使って、適切な順序でリソースの起動・停止をできるように構成する。

# pcs resource create rs-systemd-squid systemd:squid --group rg-01
# pcs resource create rs-vip-33 ocf:heartbeat:IPaddr2 ip=192.168.33.23 cidr_netmask=24 nic=ens192 --group rg-01 --before rs-systemd-squid

Unbound用のリソース作成 (Cloneリソース)

Unboundは2台のノードでActive/Activeで稼働させて問題ないため、Cloneリソースとして構成する。

# pcs resource create rs-systemd-unbound systemd:unbound --group rg-01
# pcs resource clone rs-systemd-unbound

ネットワーク監視用のPingリソース作成 (Cloneリソース)

Pingによるネットワーク監視は2台のノードでActive/Activeで稼働させ、常に両方のノードにてネットワークの正常性を確認させておく。

# pcs resource create rs-ping-33 ocf:pacemaker:ping dampen=5s multiplier=1000 host_list=192.168.33.31
# pcs resource clone rs-ping-33

Pingによるネットワーク監視を行う場合、ロケーションの制約も設定する。Pingリソースは、「pingd」という名称のパラメータを持っており、Ping成功時は1000、失敗時は0の値を返す。pingdの値が未定義または1より小さい場合は、Squidのリソースグループを起動させないというロケーション制約を定義する。

# pcs constraint location rg-01 rule score=-INFINITY pingd lt 1 or not_defined pingd
# pcs constraint
Location Constraints:
  Resource: rg-01
    Constraint: location-rg-01
      Rule: boolean-op=or score=-INFINITY
        Expression: pingd lt 1
        Expression: not_defined pingd
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

最終的にクラスタの状態は以下のようになる。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Sun Jul 19 15:04:46 2020
  * Last change:  Sun Jul 19 15:01:26 2020 by root via cibadmin on t3021cent
  * 2 nodes configured
  * 6 resource instances configured

Node List:
  * Online: [ t3021cent t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent
    * rs-systemd-squid  (systemd:squid):        Started t3021cent
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * Started: [ t3021cent t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3021cent t3022cent ]

以上でクラスタの設定は完了となる。

動作確認

実際に疑似障害を発生させて、クラスタのリソースが正常にフェイルオーバーすることを確認してみよう。

1. 手動フェイルオーバー

リソースが稼働しているノードをスタンバイにすることで、リソースがもう一方のノードにフェイルオーバーすることを確認する。

ノードをスタンバイにするにはpcs node standbyにて行う。

# pcs node standby t3021cent

クラスタのリソースを確認すると、ノード#1 (t3021cent) からノード#2 (t3022cent) にフェイルオーバーしていることがわかる。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Sun Jul 19 15:06:23 2020
  * Last change:  Sun Jul 19 15:05:59 2020 by root via cibadmin on t3021cent
  * 2 nodes configured
  * 6 resource instances configured

Node List:
  * Node t3021cent: standby
  * Online: [ t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3022cent
    * rs-systemd-squid  (systemd:squid):        Started t3022cent
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * Started: [ t3022cent ]
    * Stopped: [ t3021cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3022cent ]
    * Stopped: [ t3021cent ]

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

リソースをノード#1に戻すには、ノード#2側でpcs node standbyを行う。

# pcs node unstandby t3021cent
# pcs node standby t3022cent
# pcs node unstandby t3022cent

2. NIC障害時のフェイルオーバー

次にネットワーク障害時にフェイルオーバーすることを確認する。

ノード#1 (t3021cent) のNICを切断すると、pingdの値が1000から0に変化し、ロケーション制約によってリソースがフェイルオーバーする

# pcs status --full
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (1) (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Sun Jul 19 15:18:18 2020
  * Last change:  Sun Jul 19 15:11:24 2020 by root via cibadmin on t3021cent
  * 2 nodes configured
  * 6 resource instances configured

Node List:
  * Online: [ t3021cent (1) t3022cent (2) ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3022cent
    * rs-systemd-squid  (systemd:squid):        Started t3022cent
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * rs-systemd-unbound        (systemd:unbound):      Started t3022cent
    * rs-systemd-unbound        (systemd:unbound):      Started t3021cent
    * Started: [ t3021cent t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * rs-ping-33        (ocf::pacemaker:ping):  Started t3022cent
    * rs-ping-33        (ocf::pacemaker:ping):  Started t3021cent
    * Started: [ t3021cent t3022cent ]

Node Attributes:
  * Node: t3021cent (1):
    * pingd                             : 0   ←★pingdの値が0になる
  * Node: t3022cent (2):
    * pingd                             : 1000

Migration Summary:
  * Node: t3021cent (1):
    * rs-vip-33: migration-threshold=1000000 fail-count=1 last-failure=Sun Jul 19 15:17:08 2020:

Failed Resource Actions:
  * rs-vip-33_monitor_10000 on t3021cent 'not running' (7): call=45, status='complete', exitreason='', last-rc-change='2020-07-19 15:17:07 +09:00', queued=0ms, exec=0ms

Tickets:

PCSD Status:
  t3021cent: Offline
  t3022cent: Online

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

リソースをノード#1に戻すには、pcs resource cleanupにてリソースの状態を正常に戻したうえで、先ほどと同様にノード#2側をスタンバイにすることにて行う。

# pcs resource cleanup
Cleaned up all resources on all nodes
Waiting for 1 reply from the controller. OK
# pcs node standby t3022cent
# pcs node unstandby t3022cent

まとめ

以上でシングルポイントとなっていたプロキシサーバをクラスタにて冗長化することができた。前述したが、Pacemakerを利用して2台のクラスタを構成する場合は、STONITHの設定が推奨されるので、次回はESXi環境におけるSTONITHの設定方法を記載することにする。

参照

2018年12月3日月曜日

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する③ (障害試験編)

PacemakerとCorosyncで構築するクラスターの記事も今回で最後となる。

★前回の記事はこちら↓

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する① (準備・インストール編)
https://tech-mmmm.blogspot.com/2018/11/centos-7-pacemaker-corosyncmariadb.html

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する② (クラスター・リソース構成編)

3回目となる最後は、実際に前回までに設定したクラスターで疑似障害を発生させ、その際のリソースのフェイルオーバーの動きを見ることにする。


障害発生のパターンは複数考えられるが、今回は、手動でのフェイルオーバー手順と、サーバー障害とNIC障害を代表的な障害として、動作確認を行う。

手動フェイルオーバー① (コマンドでリソースグループを移動)

手動でフェイルオーバーさせるために、わざわざサーバーを再起動したりするのは面倒なので、コマンドでリソースグループをフェイルオーバーさせてみる。

# pcs resource show
------------------------------
 Resource Group: rg01
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started t1113cent
     ShareDir   (ocf::heartbeat:Filesystem):    Started t1113cent
     MariaDB    (systemd:mariadb):      Starting t1113cent
------------------------------

以下コマンドでリソースグループrg01をノードt1114centに移動させる。

# pcs resource move rg01 t1114cent

確認してみると、確かにリソースグループがt1114centに移動していることがわかる。

# pcs resource show
------------------------------
 Resource Group: rg01
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started t1114cent
     ShareDir   (ocf::heartbeat:Filesystem):    Started t1114cent
     MariaDB    (systemd:mariadb):      Starting t1114cent
------------------------------

リソースグループをフェイルバックさせる場合は、以下の通りもともと起動していたノードにリソースグループを移動しなおすことで対応する。

# pcs resource move rg01 t1113cent

手動でフェイルオーバー② (ノードをスタンバイにする)

コマンドでフェイルオーバーさせる手順以外にも、ノードをスタンバイにすることで強制的にリソースグループを移動させることもできるので、手順を紹介しておこう。

# pcs status
------------------------------
Cluster name: cluster2
Stack: corosync
Current DC: t1114cent (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Sat Nov 24 15:00:47 2018
Last change: Sat Nov 24 15:00:44 2018 by root via cibadmin on t1114cent

2 nodes configured
3 resources configured

Online: [ t1113cent t1114cent ]

Full list of resources:

 Resource Group: rg01
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started t1113cent
     ShareDir   (ocf::heartbeat:Filesystem):    Started t1113cent
     MariaDB    (systemd:mariadb):      Started t1113cent

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

現在リソースグループが起動しているt1113centをスタンバイにする。

# pcs cluster standby t1113cent

再度クラスターの状態を確認する。

# pcs status
------------------------------
Cluster name: cluster2
Stack: corosync
Current DC: t1114cent (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Sat Nov 24 15:03:50 2018
Last change: Sat Nov 24 15:03:42 2018 by root via cibadmin on t1113cent

2 nodes configured
3 resources configured

Node t1113cent: standby   ←★standbyになっている
Online: [ t1114cent ]

Full list of resources:

 Resource Group: rg01   ←★リソースがすべてt1114centに移動している
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started t1114cent
     ShareDir   (ocf::heartbeat:Filesystem):    Started t1114cent
     MariaDB    (systemd:mariadb):      Starting t1114cent

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

リソースグループをフェイルバックさせる場合は、以下のとおり実施する。

# pcs cluster unstandby t1113cent ←★t1113centのスタンバイを解除
# pcs cluster standby t1114cent  ←★t1114centをスタンバイ
# pcs cluster unstandby t1113cent ←★t1114centのスタンバイを解除

サーバーダウン障害

サーバーの突発停止や再起動が発生した場合を想定して、クラスターの動作を検証する。


VMware Host Clientにて、仮想マシンの再起動を実施する。


リソースグループは正常に切り替わっていることを確認できる。

# pcs status
------------------------------
Cluster name: cluster2
Stack: corosync
Current DC: t1114cent (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Sun Nov 25 06:33:04 2018
Last change: Sun Nov 25 06:25:18 2018 by root via crm_resource on t1113cent

2 nodes configured
3 resources configured

Online: [ t1114cent ]
OFFLINE: [ t1113cent ]   ←★OFFLINEになる

Full list of resources:

 Resource Group: rg01
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started t1114cent
     ShareDir   (ocf::heartbeat:Filesystem):    Started t1114cent
     MariaDB    (systemd:mariadb):      Started t1114cent
↑★t1114centに切り替わっている

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

NIC障害

サービス用のNICが切断され、VIPが消えた場合のクラスターの動作を検証する。


本記事では割愛するが、VIPの監視にon-fail=standbyのオプションを指定しないとうまく切り替わらないので、あらかじめ設定しておくことにする。

# pcs resource update VirtualIP op monitor on-fail=standby
# pcs resource show --full
------------------------------
 Group: rg01
  Resource: VirtualIP (class=ocf provider=heartbeat type=IPaddr2)
   Attributes: cidr_netmask=24 ip=192.168.11.115 nic=ens192
   Operations: monitor interval=60s on-fail=standby (VirtualIP-monitor-interval-60s)
               start interval=0s timeout=20s (VirtualIP-start-interval-0s)
               stop interval=0s timeout=20s (VirtualIP-stop-interval-0s)
  Resource: ShareDir (class=ocf provider=heartbeat type=Filesystem)
   Attributes: device=/dev/sharevg/lv001 directory=/share fstype=xfs
   Operations: monitor interval=20 timeout=40 (ShareDir-monitor-interval-20)
               notify interval=0s timeout=60 (ShareDir-notify-interval-0s)
               start interval=0s timeout=60 (ShareDir-start-interval-0s)
               stop interval=0s timeout=60 (ShareDir-stop-interval-0s)
  Resource: MariaDB (class=systemd type=mariadb)
   Operations: monitor interval=60 timeout=100 (MariaDB-monitor-interval-60)
               start interval=0s timeout=100 (MariaDB-start-interval-0s)
               stop interval=0s timeout=100 (MariaDB-stop-interval-0s)
------------------------------

疑似障害を起こすため、仮想マシンのNICを切断する。


1分程度でリソースVirtualIPがFAILEDステータスになり、リソースグループがフェイルオーバーされる。

# pcs status
------------------------------
Cluster name: cluster2
Stack: corosync
Current DC: t1114cent (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Sun Nov 25 06:03:12 2018
Last change: Sat Nov 24 15:16:21 2018 by root via crm_resource on t1113cent

2 nodes configured
3 resources configured

Node t1113cent: standby (on-fail)   ←★standby (on-fail)になる
Online: [ t1114cent ]

Full list of resources:

 Resource Group: rg01
     VirtualIP  (ocf::heartbeat:IPaddr2):       FAILED t1113cent ←★FAILEDになる
     ShareDir   (ocf::heartbeat:Filesystem):    Started t1113cent
     MariaDB    (systemd:mariadb):      Stopping t1113cent

Failed Actions:
* VirtualIP_monitor_60000 on t1113cent 'not running' (7): call=51, status=complete, exitreason='',
    last-rc-change='Sun Nov 25 06:03:09 2018', queued=0ms, exec=0ms
↑★VirtualIPに関するログが表示される

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

障害ノードが復旧し、クラスターの状態を戻す場合は、以下コマンドを実行する。

# pcs resource cleanup
------------------------------
Cleaned up all resources on all nodes
Waiting for 1 replies from the CRMd. OK
------------------------------

上記コマンドでクラスターを復旧させると、リソースグループが元のノードにフェイルバックするので注意。どうやらもともと稼働していたノードのスコアがINFINITYのままになるため、フェイルバックするようだ。この辺りをきちんと制御する意味でも、STONITHの設定を有効にし、障害が発生したノードは強制停止する設定をした方がよいかもしれない。

まとめ

以上で、全3回にわたって説明してきたPacemaker + Corosyncの設定手順と動作検証の記事は終了となる。
設定手順自体が多く複雑ではあるが、設定はすべてコマンドで実施できるよう構成されており、複雑な設定ファイルを作成する必要がない分、慣れれば構成しやすいソフトウェアではないかと感じた。
今回は実施していないが、本来はスプリットブレイン対策としてSTONITHの設定が推奨されることから、別途STONITHの設定手順なども検証して記載したいと考えている。

2018年11月25日日曜日

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する② (クラスター・リソース構成編)

前回はPacemakerとCorosyncを使用する準備まで実施したので、クラスターとしての設定を行っていく。


★前回の記事はこちら↓

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する① (準備・インストール編)
https://tech-mmmm.blogspot.com/2018/11/centos-7-pacemaker-corosyncmariadb.html

Pacemaker・Corosyncのクラスターを作成

1. クラスターを作成

スプリットブレイン発生を防止する観点から、クラスター間のハートビートをやり取りするネットワークは2本以上の冗長構成とするのが望ましい。

クラスター作成の際に、ノード名をIPアドレスごとにカンマ区切りで指定することで、複数のIPアドレスでクラスターに登録がされる。

※片方のノードで実施
# pcs cluster setup --start --name cluster2 t1113cent,t1113cent-55 t1114cent,t1114cent-55
------------------------------
Destroying cluster on nodes: t1113cent, t1114cent...
t1113cent: Stopping Cluster (pacemaker)...
t1114cent: Stopping Cluster (pacemaker)...
t1113cent: Successfully destroyed cluster
t1114cent: Successfully destroyed cluster

Sending 'pacemaker_remote authkey' to 't1113cent', 't1114cent'
t1113cent: successful distribution of the file 'pacemaker_remote authkey'
t1114cent: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes...
t1113cent: Succeeded
t1114cent: Succeeded

Starting cluster on nodes: t1113cent, t1114cent...
t1113cent: Starting Cluster...
t1114cent: Starting Cluster...

Synchronizing pcsd certificates on nodes t1113cent, t1114cent...
t1114cent: Success
t1113cent: Success
Restarting pcsd on the nodes in order to reload the certificates...
t1114cent: Success
t1113cent: Success
------------------------------

設定確認は以下コマンドで実施する。RING ID 0とRING ID 1で2つのIPアドレスが設定されていることがわかる。

# corosync-cfgtool -s
------------------------------
Printing ring status.
Local node ID 1
RING ID 0
        id      = 192.168.11.113
        status  = ring 0 active with no faults
RING ID 1
        id      = 192.168.55.113
        status  = ring 1 active with no faults
------------------------------

2. クラスターのプロパティを設定

クラスターの設定として、STONITHの無効化を行い、no-quorum-policyをignoreに設定する。今回はあくまで検証目的なのでSTONITHは無効化するが、本来はスプリットブレイン時の対策として、STONITHは有効化するべきである。

no-quorum-policyについて、通常クォーラムは多数決の原理でアクティブなノードを決定する仕組みとなるのだが、2台構成のクラスターの場合は多数決による決定ができないため、クォーラム設定は「ignore」に設定するのがセオリーのようだ。この場合スプリットブレインが発生したとしても、各ノードのリソースは特に何も制御されないという設定となるため、STONITHによって片方のノードを強制的に電源を落として対応することになる。

それでは設定をしていこう。まず、現状のプロパティを確認する。

※片方のノードで実施
# pcs property
------------------------------
Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: cluster2
 dc-version: 1.1.18-11.el7_5.3-2b07d5c5a9
 have-watchdog: false
------------------------------

設定を変更する。

※片方のノードで実施
# pcs property set stonith-enabled=false
# pcs property set no-quorum-policy=ignore
# pcs property
------------------------------
Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: cluster2
 dc-version: 1.1.18-11.el7_5.3-2b07d5c5a9
 have-watchdog: false
 no-quorum-policy: ignore   ←★クォーラムをignoreに設定
 stonith-enabled: false     ←★STONITHを無効化
------------------------------

リソースエージェントを使ってリソースを構成する

1. リソースを構成

リソースを制御するために、リソースエージェントを利用する。リソースエージェントとは、クラスターソフトで用意されているリソースの起動・監視・停止を制御するためのスクリプトとなる。

今回の構成では以下リソースエージェントを利用する。
  • ocf:heartbeat:IPaddr2 : 仮想IPアドレスを制御
  • ocf:heartbeat:Filesystem  : ファイルシステムのマウントを制御
  • systemd:mariadb : MariaDBを制御
各リソースエージェントの使用方法は、以下コマンドで確認できる。

# pcs resource describe <リソースエージェント>

まずは仮想IPアドレスの設定を行う。付与するipアドレス・サブネットマスク・NICを指定している。また、interval=30sとして監視間隔を30秒に変更している。

※片方のノードで実施
# pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.11.115 cidr_netmask=24 nic=ens192 op monitor interval=30s

次に共有ディスクとして作成したファイルシステム「/dev/sharevg/lv001」のマウントの設定を行う。マウントするデバイス・マウントポイント・ファイルシステムタイプを指定している。

※片方のノードで実施
# pcs resource create ShareDir ocf:heartbeat:Filesystem device=/dev/sharevg/lv001 directory=/share fstype=xfs

最後にMariaDBの設定となる。こちらはシンプルに以下コマンドで設定するだけでよい。

※片方のノードで実施
# pcs resource create MariaDB systemd:mariadb

上記3つのリソースは起動・停止の順番を考慮する必要がある。
  • 起動:「仮想IPアドレス」→「ファイルシステム」→「MariaDB」
  • 停止:「MariaDB」→「ファイルシステム」→「仮想IPアドレス」
この順序を制御するために、リソースの順序を付けてグループ化した「リソースグループ」を作成する。

※片方のノードで実施
# pcs resource group add rg01 VirtualIP ShareDir MariaDB

以上でリソース設定が完了となるので、クラスターの設定を確認してみる。

※片方のノードで実施
# pcs status
------------------------------
Cluster name: cluster2
WARNING: no stonith devices and stonith-enabled is not false
Stack: corosync
Current DC: t1114cent (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Thu Aug 30 23:36:40 2018
Last change: Thu Aug 30 23:36:39 2018 by root via cibadmin on t1113cent

2 nodes configured
3 resources configured

Online: [ t1113cent t1114cent ]

Full list of resources:

 Resource Group: rg01
     VirtualIP  (ocf::heartbeat:IPaddr2):       Stopped
     ShareDir   (ocf::heartbeat:Filesystem):    Stopped
     MariaDB    (systemd:mariadb):      Stopped

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

2. クラスター起動

設定が完了したので、クラスターの起動を行う。各リソースが「Started」となっていれば問題ない。

※片方のノードで実施
# pcs cluster start --all
------------------------------
t1114cent: Starting Cluster...
t1113cent: Starting Cluster...
------------------------------

起動後のステータスを確認。

※片方のノードで実施
# pcs status
------------------------------
Cluster name: cluster2
Stack: corosync
Current DC: t1114cent (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Thu Aug 30 23:40:06 2018
Last change: Thu Aug 30 23:38:42 2018 by root via cibadmin on t1113cent

2 nodes configured
3 resources configured

Online: [ t1113cent t1114cent ]

Full list of resources:

 Resource Group: rg01
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started t1113cent
     ShareDir   (ocf::heartbeat:Filesystem):    Started t1113cent
     MariaDB    (systemd:mariadb):      Started t1113cent

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

クラスターのハートビートが二重化されていることも確認しておこう。今回の場合、192.168.11.113と192.168.55.113の2つのIPアドレスが登録されており、「no faults (エラーなし)」となっていることが確認できる。

※片方のノードで実施
# corosync-cfgtool -s
------------------------------
Printing ring status.
Local node ID 1
RING ID 0
        id      = 192.168.11.113
        status  = ring 0 active with no faults
RING ID 1
        id      = 192.168.55.113
        status  = ring 1 active with no faults
------------------------------

次回予告

これでクラスターの作成が完了した。次回は実際に疑似障害を発生させてクラスターのフェイルオーバーの動きを確認することにする。

★次回はこちら↓

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する③ (障害試験編)
https://tech-mmmm.blogspot.com/2018/12/centos-7-pacemaker-corosyncmariadb.html

2018年11月19日月曜日

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する① (準備・インストール編)

RHEL 7やCentOS 7では、サーバークラスターを実装するソフトウェアとして、Pacemaker + Corosyncによる実装が標準となっている。これらの機能は、CentOSでは当然無償で利用することができるが、RHELでは「High Availability Add-On」のサブスクリプション購入が必要となる。

Red Hat Enterprise Linux 7 向け High Availability Add-On のリファレンスドキュメント

Linux環境でクラスターを組んだことがなかったので、勉強がてらCentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化してみた。

実施内容がそこそこ多いので、今回含めて、全3回で記載することにする。
  1. 準備・インストール編
    Pacemaker・CorosyncおよびMariaDBをインストールし初期設定を行う。
  2. クラスター・リソース構成編
    クラスターを作成し、リソースの構成を行う。
  3. 障害試験編
    疑似障害を発生させて、フェイルオーバーの動作確認を行う。
それでは、まずは今回構成する環境からみていこう。

環境および用語

今回はESXi上に仮想マシンを2台作成し、クラスター構成にする。

  • ノード#1 ホスト名:t1113cent
  • ノード#2 ホスト名:t1114cent



PacemakerとCorosyncがクラスターの機能を提供する。それぞれの役割については、以下に他の用語と合わせて記載をする。
  • Pacemaker (ペースメーカー):クラスターのリソース制御(リソースの起動・監視・停止、フェイルオーバー等)を行う
  • Corosync (コロシンク):クラスターノード間の死活監視を行う。後述するSTONITHもCorosyncの機能
  • STONITH (ストニス):Shoot The Other Node In The Headの略。スプリットブレイン時に、複数ノードがActiveになることを防止する機能
  • スプリットブレイン:ネットワーク断によりクラスター間で相互に監視ができなくなり、どのノードがActiveで動作しているか不明となっている状況
  • リソース:クラスターが起動・監視・停止を制御する対象。たとえば、仮想IPアドレス、ディスクマウント、DBサービスなど多岐にわたる
  • リソースエージェント:起動・監視・停止を制御するためのスクリプト。クラスター管理ソフトウェアで用意されている
  • リソースグループ:複数のリソースエージェントをグループ化し、同一ノードで複数のリソースの起動・監視・停止を制御するためのもの
クラスター監視用のネットワークは、すべて切断されるとスプリットブレインとなってしまうため、2本の冗長構成とする。

共有ディスクはSCSIバスの共有を行い、同一のvmdkファイルを2台の仮想マシンからマウントできるように構成し、本ディスクにMariaDBのデータベースを配置する構成とする。

ESXi環境でSCSIバスの共有を行い、共有ディスクを作成

1. ノード#1側にSCSIコントローラーを追加

ESXiにてノード#1の仮想マシンの「設定の編集」を開き、「SCSIコントローラー」を追加する。


「SCSIバスの共有」で仮想または物理を選ぶ。同一のESXiに存在する仮想マシン間でディスクを共有したい場合は「仮想」を選び、複数のESXiをまたいでディスクを共有したい場合は「物理」を選べばよい。今回は、同一ESXiだったので「仮想」で設定した。


2. ノード#1側にディスクを追加

SCSIコントローラーを追加したら、続けて新規ハードディスクを作成する。ディスクを共有する場合は「シック プロビジョニング (Eager Zerod)」を選択する必要がある。「コントローラーの場所」は、先ほど作成した「SCSI コントローラ 1」を選択する。


3. ノード#2側にSCSIコントローラーを追加

もう一台のノード#2側に対しても、同様にSCSIコントローラーを追加する。「SCSIバスの共有」はノード#1と同様「仮想」を選択する。


4. ノード#2側にディスクを追加

新規ではなく「既存のハードディスク」にてディスクを追加する。


ディスク選択画面が表示されるので、ノード#1に作成した共有ディスクとして利用するvmdkファイルを選択する。


最後に、SCSIコントローラーを「SCSI コントローラ 1」に設定すれば完了。


以上で、共有ディスクの作成が完了となる。OS側でも確認すると、以下の通り両ノードでディスクのデバイスが見えていることがわかる。

※ノード#1で実施
# fdisk -l /dev/sdb
------------------------------
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
------------------------------

※ノード#2で実施
# fdisk -l /dev/sdb
------------------------------
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
------------------------------

今回は本題から外れるので詳細な手順は割愛するが、上記領域に適当にファイルシステムを作成し、ノード#1の/shareにマウントしておこう。

MariaDBのインストール・初期設定

1. MariaDBをインストール

yumでインストールするのが手っ取り早い。

※両ノードで実施
# yum install mariadb
# yum install mariadb-server

インストール後、状態を確認する。最終的にクラスターで起動・停止が制御されるため、現時点ではinactive / disabledになっていればよい。

※両ノードで実施
# systemctl status mariadb
------------------------------
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
------------------------------

2. 初期設定

MariaDBのデータベース保存先を/share/mysqlに変更するため、/etc/my.cnfに変更と追記を行う。

※両ノードで実施
# vi /etc/my.cnf
------------------------------
[mysqld]
#datadir=/var/lib/mysql           ←★コメントアウト
datadir=/share/mysql              ←★追加
#socket=/var/lib/mysql/mysql.sock ←★コメントアウト
socket=/share/mysql/mysql.sock    ←★追加

[client]                          ←★追加
socket=/share/mysql/mysql.sock    ←★追加
------------------------------

3. MariaDBを起動

設定完了後MariaDBを起動すると、以下の通りエラーとなった。

※ノード#1で実施
# systemctl start mariadb
------------------------------
Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.
------------------------------

SELinuxが悪さするようなので止めておく。

※両ノードで実施
# setenforce 0

再度起動させると、今度は成功するはず。

※ノード#1で実施
# systemctl start mariadb

4. データベース・テーブル作成

MariaDBの動作確認ができるようにデータベースとテーブルを作っておく。mysqlコマンドを用いて、rootユーザーでMariaDBにログインする。

※ノード#1で実施
# mysql -u root

データベースを作成する。

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> create database cluster_test;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cluster_test       | ←★作成された
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

続けてテーブルを作成する。

MariaDB [(none)]> use cluster_test;
Database changed

MariaDB [cluster_test]> show tables;
Empty set (0.00 sec)

MariaDB [cluster_test]> create table test_table(name varchar(20));
Query OK, 0 rows affected (0.00 sec)

MariaDB [cluster_test]> show tables;
+------------------------+
| Tables_in_cluster_test |
+------------------------+
| test_table             | ←★作成された
+------------------------+
1 row in set (0.00 sec)

作成したテーブルに1行追加してみる。

MariaDB [cluster_test]> insert into test_table value('hoge');
Query OK, 1 row affected (0.00 sec)

MariaDB [cluster_test]> select * from test_table;
+------+
| name |
+------+
| hoge | ←★追加された
+------+
1 row in set (0.00 sec)

以上でMariaDBの準備が整った。

Pacemaker・Corosyncのインストール・初期設定

1. Pacemaker・Corosyncをインストール

yumでインストールする。

※両ノードで実施
# yum install pacemaker
# yum install pcs
# yum install fence-agents-all


2. 初期設定

クラスター用ユーザーを設定する。yumでインストールすると、「hacluster」ユーザーが作成されているはずなので確認する。

※両ノードで実施
# cat /etc/passwd | tail
------------------------------
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/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
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin ←★クラスター用ユーザー
unbound:x:997:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
------------------------------

パスワードを設定しておく。当然、両ノードで同一のパスワードで設定しておくこと。

※両ノードで実施
# passwd hacluster
------------------------------
ユーザー hacluster のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
------------------------------

ここで、Pacemakerのサービスを起動させる。

※両ノードで実施
# systemctl start pcsd.service
# systemctl enable pcsd.service

起動後の状態を確認し、エラーなくacitive / enabledとなっていればOK。

※両ノードで実施
# systemctl status pcsd.service
------------------------------
● pcsd.service - PCS GUI and remote configuration interface
   Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled)
   Active: active (running) since 木 2018-08-30 10:28:07 JST; 2min 13s ago
     Docs: man:pcsd(8)
           man:pcs(8)
 Main PID: 2004 (pcsd)
   CGroup: /system.slice/pcsd.service
           mq2004 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &

 8月 30 10:28:01 t1113cent systemd[1]: Starting PCS GUI and remote configur....
 8月 30 10:28:07 t1113cent systemd[1]: Started PCS GUI and remote configura....
Hint: Some lines were ellipsized, use -l to show in full.
------------------------------

クラスターを組む際に名前解決できるように、hostsにお互いのIPアドレスを登録しておく。

※両ノードで実施
# vi /etc/hosts
------------------------------
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.11.113  t1113cent    ←★追加
192.168.55.113  t1113cent-55 ←★追加
192.168.11.114  t1114cent    ←★追加
192.168.55.114  t1114cent-55 ←★追加
------------------------------

クラスターに参加するノードの認証を行う。。。が、失敗してしまった。

※片方のノードで実施
# pcs cluster auth t1113cent t1114cent
------------------------------
Username: hacluster
Password:
Error: Unable to communicate with t1114cent ←★失敗。。。
t1113cent: Authorized
------------------------------

どうやらfirewalldが原因のようなので止めておく。

※両ノードで実施
# systemctl stop firewalld
# systemctl disable firewalld

再度ノードの認証を行うと成功した。

※片方のノードで実施
# pcs cluster auth t1113cent t1114cent
------------------------------
Username: hacluster
Password:
t1114cent: Authorized
t1113cent: Authorized
------------------------------

次回予告

これで準備がようやく終わり、次から本題のクラスター構成作業に進むのだが、長くなってしまったので続きは次回とする。

★次回はこちら↓

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する② (クラスター・リソース構成編)

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する③ (障害試験編)
https://tech-mmmm.blogspot.com/2018/12/centos-7-pacemaker-corosyncmariadb.html

人気の投稿