前回、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が発生することがある。クラスタの構築中は、メンテナンスモードにするなどして運用するほうが効率的な場合もあるだろう。
0 件のコメント:
コメントを投稿