Zabbix 6.0のHA機能を触ってみた

## はじめに
先日Zabbix6.0が正式リリースされました。
新しく入ったHA機能やKubernets対応を試してみたかったので、AWS上で構築して触ってみました。
今回の記事はHA編です。Kubernets編は別途。
## 環境
・プラットフォーム：AWS EC2 
・OS:CentOS8
・Zabbix:6.0.0
・DB:RDS(MySQL8.0.27)
## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/a3a6534f-7644-ab63-87d6-b442c9bc73be.png)
## 環境構築
### EC2インスタンス作成
まずはZabbix01分を作る。詳細は割愛。02はあとでAMIから作る。
### SELINUX無効
```bash
# SELINUX無効
vi /etc/selinux/config
------
SELINUX=disabled
------
shutdown -r now
```
### Zabbixインストール
```bash
# リポジトリインストール
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
dnf clean all

# zabbix関連パッケージインストール
dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-　scripts zabbix-selinux-policy zabbix-agent2 zabbix-web-japanese
```

### RDSインスタンス作成
エンジンタイプはMySQLを選択。詳細は割愛。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/889c206b-6541-ade2-d89d-0e5d0cbdbc59.png)

### DBセットアップ
RDSインスタンス作成が完了したら、Zabbix01から以下を実施。
```bash
# セットアップ用にmysqlパッケージインストール
dnf install mysql

# DB接続
mysql -uzabbix -p -h <RDSエンドポイント>
```
```sql
# DB作成 
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;

# ユーザ作成&権限付与(ソースIPは参考)
mysql> create user zabbix@'172.31.0.0/255.255.0.0' identified by '<DBパスワード>';
mysql> grant all privileges on zabbix.* to zabbix@'172.31.0.0/255.255.0.0';
mysql> quit;
```
```bash
# テーブル作成
zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p -h <RDSエンドポイント> zabbix
```
### zabbix server設定
```bash
vi /etc/zabbix/zabbix_server.conf
------
DBHost=<RDSエンドポイント>
DBPassword=<DBパスワード>
------
```
### サービス起動
```bash
systemctl start zabbix-server zabbix-agent2 httpd php-fpm
```

### zabbixセットアップ
ブラウザで、　以下にアクセスしてポチポチ進める
`http://<EC2パブリックIP>/zabbix`
- 日本語を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/092138b0-3cba-cc6d-167f-5767a6f12b33.png)
- 前提条件が全てOKになっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/2c93080e-e170-3952-5e4d-cbfd6d5b9822.png)
- データベースホストにRDSエンドポイント、パスワードをそれぞれ入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/5f822ab9-d2df-fed0-de6f-55927321f3aa.png)
- zabbixサーバー名とタイムゾーンを変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/e1627a3e-75d5-684d-8d25-2c146598c67e.png)
- 確認して進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/c95f485c-8589-843e-4479-b933b5bba0c2.png)
- 終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/1e522075-bf67-686d-12f0-7e5be7a0b903.png)
- Adminでログイン(初期パスワードは[公式](https://www.zabbix.com/documentation/current/en/manual/quickstart/login)に記載あり)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/4756b53c-fd8f-b3aa-e966-d446dd5bc15f.png)
- ダッシュボードが表示される
(個人的には4.0までしか触ったことなかったので、メニューが縦型になったのが新鮮。。汗)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/8a65df84-06b6-6f3f-b471-0a2c3807f44b.png)

## HAクラスタ設定
- Zabbix01からAMI作ってZabbix02を作成
- Zabbix01,02 conf変更
```bash
# Zabbix Server設定 (Zabbix01,02)
vi /etc/zabbix/zabbix_server.conf
---
HANodeName=Zabbix01 #０２はZabbix02
NodeAddress=<IP>:10051
---

# フロントエンド設定（Zabbix02のみ）
vi /etc/zabbix/web/zabbix.conf.php
---
$ZBX_SERVER_NAME = 'Zabbix02';
---

systemctl restart zabbix-server
```
- Target01 conf変更
```bash
# zabbix agent2設定
vi /etc/zabbix/zabbix_agent2.conf
---
Server=<Zabbix01のIP>,<Zabbix02のIP>
ServerActive=<Zabbix01のIP>,<Zabbix02のIP>
---

systemctl restart zabbix-agent2
```
HAクラスタ設定が完了すると、GUIのレポート→システム情報からノード情報が確認できるようになる。便利！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/2e793051-02e9-b19c-3dbe-83920625696f.png)

## HA機能の仕組み
- 以下のZabbix Conference Japan2021での資料を読んだうえで、[公式ドキュメント](https://www.zabbix.com/documentation/6.0/en/manual/concepts/server/ha)を読むと分かりやすかったです。
  - [Zabbix 最新 LTS バージョン 6.0 の新機能解説](https://assets.zabbix.com/img/zabconf2021_jp/presentations/01_3zabconf2021.pdf)
  - [ZabbixサーバーのHAクラスタ構成](https://assets.zabbix.com/img/zabconf2021_jp/presentations/02_6zabconf2021.pdf)
- ポイントだけ書くと以下。
  - Active/Standby構成。
  - 同一DBを共有。
  - クラスタノード全てで起動する HA Managerプロセスが状態管理。
  - 5秒毎に最終アクセス時間を更新。
  - アクティブノードの最終アクセス時間がフェールオーバー遅延時間(デフォルト６０秒,最小10秒)を超過すると、スタンバイノードがアクティブに昇格。

## HA関連コマンド
アクティブノードで実行できる。
```bash
# HAステータス確認
# zabbix_server -R ha_status
Failover delay: 60 seconds
Cluster status:
   #  ID                        Name                      Address                        Status      Last Access
   1. cl03mx3ak00011b43f0hi0a7r Zabbix01                  172.31.9.220:10051             active      2s
   2. cl03n1ky60001225kzt8x8j42 Zabbix02                  172.31.17.234:10051            standby     4s

## スタンバイノードでやると怒られる
# zabbix_server -R ha_status
Runtime commands can be executed only in active mode

# フェールオーバー遅延時間設定(デフォルト60秒)
# zabbix_server -R ha_set_failover_delay=10s
HA failover delay set to 10 seconds
```

## HA実践
- フェールオーバー遅延時間を10秒にした状態で実施。
- Zabbix Serverの設定はここまでで変更した部分以外はデフォルトのまま。
### 計画停止想定: アクティブノードのzabbix-server停止
- アクティブノードのzabbix-server停止したところ、
  1秒以内にスタンバイノードが昇格開始した。
- (アクティブノードのHAmanagerが即pausedになるため、フェールオーバー遅延時間は関係なく昇格が行われている様子)
- 監視間隔１秒で設定していたCPU使用率監視アイテムでも値取得途切れず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/7f6311a6-d82c-9605-744d-075da7c0dbd8.png)
- ※アクティブ昇格してからZabbix Serverの各子プロセスが起動するため、
   子プロセス数を多く設定している環境だと、監視再開にかかる時間はかなり変わるはず。
```bash
# アクティブノードのzabbix-server停止
systemctl stop zabbix-server

# Zabbix01(ACT→STB)のzabbix_server.log ※サーバのタイムゾーンはUTC
  3131:20220227:161749.391 HA manager has been paused
  3193:20220227:161749.391 syncing history data in progress...
  3193:20220227:161749.391 syncing history data done
  3131:20220227:161750.332 HA manager has been stopped
  3129:20220227:161750.336 syncing trend data...
  3129:20220227:161750.345 syncing trend data done
  3129:20220227:161750.345 Zabbix Server stopped. Zabbix 6.0.0 (revision 5203d2ea7d).

# Zabbix02(STB→ACT)のzabbix_server.log ※サーバのタイムゾーンはUTC
  1301:20220227:152041.547 "Zabbix02" node started in "standby" mode
  1301:20220227:161750.499 "Zabbix02" node switched to "active" mode
  1301:20220227:161750.500 server #0 started [main process]
  1656:20220227:161750.501 server #2 started [configuration syncer #1]
  1655:20220227:161750.502 server #1 started [service manager #1]
  1657:20220227:161750.683 server #3 started [alert manager #1]
  1658:20220227:161750.684 server #4 started [alerter #1]
　　　　略
```

### 計画外停止想定: アクティブノードのI/F落とす(DB接続不可)
- アクティブノードのI/F停止したところ、1５秒ほどでスタンバイノードが昇格開始した。
  (５秒毎の最終アクセス時間更新のタイミングによって、フェールオーバー遅延時間＋αはブレると思われる。)
- 監視間隔１秒で設定していたCPU使用率監視アイテムでは16秒ほど値取得途切れた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135733/6113bbc7-d60c-f951-a47e-b0d072e03c70.png)
- zabbix-server停止と同様、子プロセス数を多く設定している環境だと、監視再開にかかる時間はかなり変わるはず。
```bash
# アクティブノードのI/F停止 (16:48:41頃)
ifdown eth0

# Zabbix01(ACT→STB)のzabbix_server.log ※サーバのタイムゾーンはUTC
  3535:20220227:164846.545 [Z3001] connection to database 'zabbix' failed: [2005] Unknown MySQL server host 'zabbix.catoz1y8otuh.ap-northeast-1.rds.amazonaws.com' (-2)
  3535:20220227:164846.545 database connection lost
  3530:20220227:164849.413 "Zabbix01" node switched to "standby" mode
  3546:20220227:164849.413 executing housekeeper
  3546:20220227:164849.414 [Z3001] connection to database 'zabbix' failed: [2005] Unknown MySQL server host 'zabbix.catoz1y8otuh.ap-northeast-1.rds.amazonaws.com' (-2)
  3546:20220227:164849.414 database is down: reconnecting in 10 seconds
  3647:20220227:164849.431 starting HA manager
  3647:20220227:164849.431 HA manager started in standby mode
  3647:20220227:164858.434 [Z3001] connection to database 'zabbix' failed: [2005] Unknown MySQL server host 'zabbix.catoz1y8otuh.ap-northeast-1.rds.amazonaws.com' (-2)
  3647:20220227:164859.434 [Z3001] connection to database 'zabbix' failed: [2005] Unknown MySQL server host 'zabbix.catoz1y8otuh.ap-northeast-1.rds.amazonaws.com' (-2)
  3647:20220227:164900.434 [Z3001] connection to database 'zabbix' failed: [2005] Unknown MySQL server host 'zabbix.catoz1y8otuh.ap-northeast-1.rds.amazonaws.com' (-2)

# Zabbix02(STB→ACT)のzabbix_server.log ※サーバのタイムゾーンはUTC
  1779:20220227:164855.752 "Zabbix02" node switched to "active" mode
  1779:20220227:164855.753 server #0 started [main process]
  1796:20220227:164855.754 server #2 started [configuration syncer #1]
  1795:20220227:164855.754 server #1 started [service manager #1]
  1797:20220227:164855.922 server #3 started [alert manager #1]
  1798:20220227:164855.923 server #4 started [alerter #1]
  1800:20220227:164855.929 server #6 started [alerter #3]
  1799:20220227:164855.930 server #5 started [alerter #2]
  略
```

## おわりに
- pacemaker等サードパーティ製品なしにお手軽にHA組めるようになったのはGood!!
- HA構成が同一DB共有と聞いて、商用だと結局Zabbixとは別でDB冗長化の仕組みを入れないといけないから面倒だなと初めは感じたが、RDSのようなマネージドDBを使うとその点は簡単にクリアでき、今更ですが便利な時代になったなとしみじみ・・。
- ACT/STB構成ならではのフェールオーバー時の監視中断時間があるため、ACT/ACT構成を採用する要件があるシステムは今までどおりサードパーティ製品が必要。

## 参考
- [公式インストール手順](https://www.zabbix.com/download?zabbix=6.0&os_distribution=centos&os_version=8&db=mysql&ws=apache)
- [RDSでzabbixサーバを構築](https://qiita.com/miyuki_samitani/items/adb7595e3b0d03bb5b33)
- [Zabbix6.0のHAを試す](https://www.notr.app/posts/2021/12/zabbix-60-ha/)

## おまけ
- dnfエラー。CentOS8がサポート切れになったのを忘れていました。。
```
# dnf list
CentOS-8 - AppStream                                                                                      127  B/s |  38  B     00:00
Error: Failed to download metadata for repo 'AppStream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
```

https://qiita.com/yamada-hakase/items/cb1b6124e11ca65e2a2b