自宅環境ではインターネット接続用のプロキシサーバ兼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の設定方法を記載することにする。
0 件のコメント:
コメントを投稿