【実践！Pacemaker + Corosync】Pacemaker + Corosyncを構築してZabbixを冗長化させる

#1. 概要
PacemakerとCorosyncを用いたZabbix Serverの冗長化に成功しました。
エンジニアになりたての頃に一度挑戦失敗して諦めていたのですが、この度リベンジに成功したので備忘録を書きます。
今時Pacemakerを採用しているプロジェクトなんて見たことないですし、これから出会うこともないと思います。
完全に趣味の範囲です。

```
▼ Pacemaker
HAクラスタ構成を形成し、リソース制御(ノード切り離し＋待機系ノードへのリソース引継ぎ)を行うOSS。
▼ Corosync
HAクラスタ構成において、各ノードの死活監視を行うOSS。
▼ Zabbix
統合監視を行うOSS。
```

#2. 前提
##2-1. 論理構成
以下、構築するサーバの論理構成図。
＜正常稼働時＞
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/f8e6fd62-3cff-a740-d9dd-0ff6bcbfda5c.png)
＜フェイルオーバー時＞
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/e6a56c15-9ce7-a779-034b-723bd46e5166.png)

##2-2. 前提条件
・ノードはCent OS7で、VMware Workstation上に構成された2台。
・NICは各ノードに一つ。
・ZabbixはActive-Standby構成。
・MariaDBはMaster-Slave構成。
・Virtual IPにて切り替えを行なう。
・Firewall及びSELinuxは無効。

#3. 初期設定
※仮想マシン及びOSの初期構築はできているものとします。
hostsファイルにホスト名を追記します。
【SV01/SV02で実施】

```hosts
# vi /etc/hosts
----------------------------------------------------------------
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.11.13 SV01  #ノード1のホスト名
192.168.11.14 SV02　#ノード2のホスト名
```

Pacemaker、Corosync、pcsをインストールします。
加えて、pcsサービスを起動させ、自動起動設定にしておきます。
【SV01/SV02で実施】

```
# yum -y install pacemaker corosync pcs
# systemctl start pcsd
# systemctl enable pcsd
```

クラスタ認証用ユーザのパスワードを変更します。
haclusterはCorosyncをインストールした際に自動で追加されるユーザです。
【SV01/SV02で実施】

```
# passwd hacluster
ユーザー hacluster のパスワードを変更。
新しいパスワード: [任意のパスワード]
新しいパスワードを再入力してください: [任意のパスワード]
passwd: すべての認証トークンが正しく更新できました。
```

#4. Zabbixのセットアップ
【SV01/SV02で実施】
Zabbixはログイン画面の表示まで初期構築が完了しているものとします。
※バージョンはZabbix 4.0、DBはmariaDBとする

#5. mariaDBのレプリケーション用DBユーザ設定
mariaDBのレプリケーション用ユーザを作成します。
【SV01/SV02で実施】

```
# systemctl start mariadb
# mysql -uroot
> create user 'repl'@'%' identified by '[任意のパスワード]';
> create user 'repl'@'localhost' identified by '[任意のパスワード]';
> grant replication slave on *.* to 'repl'@'%';
> grant process, super, replication slave, replication client, reload on *.* to 'repl'@'localhost';
> flush privileges;
> quit;
```

mariaDBのレプリケーション機能を利用するための設定を実施します。
【SV01で実施】

```my.cnf
# vi /etc/my.cnf
----------------------------------------------------------------
[mysqld]
log-bin=mariadb-bin　#追記
server-id=1　#追記
log-basename=SV01　#追記
```

【SV02で実施】

```my.cnf
# vi /etc/my.cnf
----------------------------------------------------------------
[mysqld]
log-bin=mariadb-bin　#追記
server-id=2　#追記
log-basename=SV02　#追記
```

Master（SV01）のDBデータをSlave（SV02）に移行します。
初めに、Slave（SV02）のDBデータを削除しておきます。
【SV02で実施】

```
# systemctl stop mariadb
# rm -rf /var/lib/mysql
```

続いて、Master（SV01）のDBデータをSlave（SV02）にSSH接続でファイル転送します。
【SV01で実施】

```
# systemctl stop mariadb
# tar cf - -C /var/lib mysql | ssh 192.168.11.14 tar xpf - -C /var/lib
Are you sure you want to continue connectiong (yes/no)? yes
root@192.168.11.14's password:[SV02のrootユーザのパスワード]
```

#6.クラスタのセットアップ
##6-1. サービスの停止・自動起動無効化
クラスタのセットアップ前にリソースとして追加するサービスを停止・自動起動無効にしておきます。
【SV01/SV02で実施】

```
# systemctl stop zabbix-server
# systemctl stop mariadb
# systemctl stop httpd
# systemctl disable zabbix-server
# systemctl disable mariadb
# systemctl disable httpd
```
##6-2. ホスト認証
クラスタに各ホストを認証させます。
【SV01で実施】

```
# pcs cluster auth SV01 SV02
Username: hacluster
Password: [haclusterのパスワード]
SV01: Authorized
SV02: Authorized
```

##6-3. クラスタの作成
Zabbix用クラスタを作成します。「zabbix_cluster」の箇所は任意です。
【SV01で実施】

```
# pcs cluster setup --name zabbix_cluster SV01 SV02
```

クラスタを起動し、自動起動も設定しておきます。
【SV01で実施】

```
# pcs cluster start --all
# pcs cluster enable --all
```

##6-4. クラスタのプロパティ設定
STONITHを無効化します。
【SV01で実施】

```
# pcs property set stonith-enabled=false
```

クォーラム動作の変更。
【SV01で実施】

```
# pcs property set no-quorum-policy=ignore
```

自動フェールバックを無効とします。（Warningは無視します）
【SV01で実施】

```
# pcs resource defaults resource-stickiness=INFINITY
Warning: Defaults do not apply to resources which override them with their own defined values
```

エラー発生時、即時にフェールオーバするようにします。（Warningは無視します）
【SV01で実施】

```
# pcs resource defaults migration-threshold=1
Warning: Defaults do not apply to resources which override them with their own defined values
```

#7. リソースの設定
##7-1. SV02のStandby移行
SV02のクラスタノード状態を強制的にStandby状態にしておきます。
【SV01で実施】

```
# pcs cluster standby SV02
```

##7-2. mariaDB
mariaDBをリソースに追加します。
【SV01で実施】

```
# pcs resource create mariadb \
> ocf:heartbeat:mysql \
> binary=/usr/bin/mysqld_safe \
> datadir=/var/lib/mysql \
> log=/var/log/mariadb/mariadb.log \
> pid=/run/mariadb/mariadb.pid \
> replication_user=repl \
> replication_passwd=[replユーザのパスワード]  \
> op monitor interval=10s timeout=10s
```

追加したmariaDBのリソースをMaster-Slaveで構成します。
【SV01で実施】

```
# pcs resource master mariadb-clone mariadb \
> master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
```

優先的にSV01がMasterとして起動するようにしておきます。
スコア値が高いほど優先的に起動する模様です。
`-INFINITY<-100<0<100<INFINITY`
【SV01で実施】

```
# pcs constraint location mariadb-clone prefers SV01=100
```

##7-3. Zabbix-server
Zabbix-serverをリソースに追加します。
【SV01で実施】

```
# pcs resource create zabbix-server \
> systemd:zabbix-server \
> op monitor interval=10s timeout=10s
```

##7.4. Apache
Apacheのstatus.confファイルを作成します。
【SV01/SV02で実施】

```status.conf
# vi /etc/httpd/conf.d/status.conf
----------------------------------------------------------------
ExtendedStatus On
 
<Location /server-status>
    SetHandler server-status
    Require local
</Location>
```

Apacheをリソースに追加します。
【SV01で実施】

```
# pcs resource create apache \
> ocf:heartbeat:apache \
> configfile=/etc/httpd/conf/httpd.conf \
> statusurl="http://localhost/server-status" \
> op monitor interval=10s timeout=10s
```

##7-5. Virtual IP
Virtual IPをリソースに追加します。
【SV01で実施】

```
# pcs resource create vip \
> ocf:heartbeat:IPaddr2 \
> ip=192.168.11.200 \
> cidr_netmask=24 \
> nic=eno16777736 \
> op monitor interval=10s timeout=10s
```

##7-6. 起動制約設定
初めに、設定をし易いようにリソースをグループとしてまとめておきます。
【SV01で実施】

```
# pcs resource group add zabbix_group vip apache zabbix-server
```

続いて、各リソースの起動制約を設定します。
【SV01で実施】

```
# pcs constraint order start zabbix_group then promote mariadb-clone
# pcs constraint colocation add zabbix_group with master mariadb-clone INFINITY
# pcs constraint colocation add master mariadb-clone with zabbix_group INFINITY
# pcs constraint colocation add zabbix-server apache INFINITY
# pcs constraint colocation add zabbix-server vip INFINITY
```

この時点で、statusコマンドを実行し、下記結果が出力されていることを確認します。
Faild Resource Action等のエラーが出ていれば、各コンフィグファイルや、設定値の見直しをして下さい。

```
# pcs status
Cluster name: zabbix_cluster
Stack: corosync
Current DC: SV01 (version 1.1.23-1.el7-9acf116022) - partition with quorum
Last updated: Wed Nov 25 18:46:14 2020
Last change: Wed Nov 25 18:35:46 2020 by root via cibadmin on SV01

2 nodes configured
5 resource instances configured

Online: [ SV01 SV02 ]

Full list of resources:

 Master/Slave Set: mariadb-clone [mariadb]
     Masters: [ SV01 ]
     Slaves: [ SV02 ]
 Resource Group: zabbix_group
     vip        (ocf::heartbeat:IPaddr2):       Started SV01
     apache     (ocf::heartbeat:apache):        Started SV01
     zabbix-server      (systemd:zabbix-server):        Started SV01

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

#8. Zabbix Agentのconfファイル編集
zabbix_agentd.confファイルを、下記のように書き換えます。
その後、Zabbix Agentサービスを再起動します。
【SV01/SV02で実施】

```zabbix_agentd.conf
# vi /etc/zabbix/zabbix_agentd.conf
----------------------------------------------------------------
No.|
98 | Server=192.168.11.13, 192.168.11.14, 192.168.11.200
114| ListenIP=0.0.0.0
139| ServerActive=192.168.11.13, 192.168.11.14, 192.168.11.200
150| # Hostname=Zabbix server
----------------------------------------------------------------
# systemctl restart zabbix-agent
```

#9. 疎通確認（Zabbix-Server ⇔ Zabbix-Agent）
Zabbix ServerのWebUIへアクセスします。
ブラウザに「192.168.11.200/zabbix」と入力し、【Sign in】を押下します。
![3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/1489bc10-5144-7f79-f8fb-88aae114176e.jpeg)

【設定】→【ホスト】→【ホストの作成】の順に押下します。
![4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/27b200fb-0589-4ffc-1dff-f26e1adc3d86.jpeg)

「ホスト名」、「表示名」(任意)、「グループ」(任意)、「IPアドレス」の欄に、SV01の情報を入力後、【追加】を押下します。
同様の操作で、SV02も追加しておきます。
![5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/a831d116-6dc5-bda1-f712-7554b9b28fab.jpeg)

この時点では、テンプレートがホストに割り当てられていないため、エージェントの状態はグレーアウトです。
![6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/67df3272-0e42-c13f-faf6-a7cfd8ea344f.jpeg)

適当にテンプレートを作ってあげます。
【設定】→【テンプレート】→【テンプレートの作成】の順に押下します。
![7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/fd8915d5-f41b-d7e0-1cc7-1c61d0efb0dc.jpeg)

今回は、CPU使用率の監視をしてみることにします。
「テンプレート名」、「表示名」、「グループ名」を埋めた後、【追加】を押下します。
![8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/704dfcfd-70a1-72ba-bd48-1bfd21c6983f.jpeg)

「CPU監視」のテンプレートが作成されていることを確認し、【アプリケーション】を押下します。
![9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/5eacab36-977e-8b9a-5fb9-5599335b5541.jpeg)

【アプリケーションの作成】を押下します。
![10.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/b11f351d-95eb-af71-c4ac-20a399cdef1d.jpeg)

「名前」の欄を埋めた後、【追加】を押下します。
![12.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/7bdb5240-3044-c6bb-7303-82c9f4d7fcb3.jpeg)

「アイテム」タブへ移動し、【アイテムの作成】を押下します。
![13.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/0822f07f-ec08-5f2e-21e3-6927a2b9aa1c.jpeg)

次の表のように設定後、【追加】を押下します。

|項目|設定値|
|:--|:--|
|名前|CPU使用率|
|タイプ|Zabbixエージェント|
|キー|system.cpu.util[,idle,avg1]|
|データ型|数値(浮動小数)|
|アプリケーション|CPU|

![14.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/cbfe75c7-0b69-cadb-00b1-cf6c9bdd39df.jpeg)

「トリガー」タブに移動し、【トリガーの作成】を押下します。
![15.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/e10c8785-c1c5-aea3-ff53-dc2194721bdd.jpeg)

次の表のように設定後、【追加】を押下します。

|項目|設定値|
|:--|:--|
|名前|CPU使用率80%超過,{HOST.NAME}|
|深刻度|重度の障害|
|条件式|{Template_CPU:system.cpu.util[,idle,avg1].last()}<20|

![16.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/a761decb-db0f-ceba-aeaf-768c3cae8693.jpeg)

【設定】→【ホスト】→【SV01】の順に押下します。
![17.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/79f9a9f1-0d77-5a36-46f9-830a24ad788d.jpeg)

「テンプレート」タブに移動します。作成した「CPU監視」を追加した後、【追加】→【更新】の順に押下します。
![18.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/743ae56f-ddc8-e520-fb1b-a7ceb12e21f0.jpeg)

ホスト一覧に戻り、エージェント状態の「ZBX」が緑色で表示されていることが確認できます。
![19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1887625/87ea75d7-8982-9f70-4d69-45ff5e8720ca.jpeg)


以上で、PacemakerとCorosyncを用いた冗長化Zabbix Serverの構築が完了です。
久しぶりにゴリゴリにLinuxを触れたのでとても満足しました。