🪔

Zabbix6.0をRockyLinux9にTimescaleDBとNginxで構築

2023/04/29に公開

はじめに

ここではZabbix6.0を構築する手順を記録します。
サーバのサイジングについてと、Linuxサーバの構築からZabbixの初期設定が完了することろまでを記載します。
それ以外の部分(仮想マシンの起動方法や監視対象の設定方法など)については記載しません。

環境

サーバはハイパーバイザ上の仮想マシンとして構築します。
仮想マシンのOSはRockyLinux9を使用します。zabbix6.0に必要なPHP8があらかじめ入っていて、サポート期間も長いためです。
PostgreSQL-14に拡張機能TimescaleDBを使用します。理由は次のようなものです。
・housekeeperによる削除処理の負荷を軽減
・不要領域の発生を抑制
・圧縮によるディスク領域の節約
・書き込み性能の向上
WebサーバにはNginxを選択します。Apacheと比較してメモリ使用量が少なく軽量なためです。

監視の計画

まずサーバに必要なリソースを見積もるために、監視対象の機器が何台あるのか、それぞれの機器に対して何項目の情報を取得するのかの見積もりを立てます。(ガバガバだと思いますが一旦気にしないでください)

監視間隔

今回、監視間隔は5分として以降の計画を進めます。

監視データ保存期間

障害発生時に確認する詳細データの保存期間を3ヶ月、
システム稼働傾向を確認するグラフ用データの保存期間を1年とします。

リソース監視の監視項目数

デフォルトで登録されている監視テンプレートの監視項目数は次のようになっています。
Linux: アイテム32項目、アイテムのプロトタイプ7項目
Windows: アイテム19項目、アイテムのプロトタイプ7項目
今回はLinuxサーバ10台、Windowsサーバ10台の仮定で39*10+26*10=650として、650項目の監視を想定します。

アプリケーション監視の監視項目数

アプリケーションの実際のプロセス数がわからないので、各アプリケーションごとに10項目を監視するものと仮定します。
主なアプリケーションは10個で各2個(冗長構成)なので10*10*2=1000として1000個を想定します。

SNMP機器の監視項目数

コアスイッチ1台48ポート、スイッチ40台は各24ポート、無線アクセスポイント100台、それぞれ機器のステータスは10項目を監視すると仮定します。
(48+40*24)+{(1+40+100)*10}=2418として2418項目を想定します。

監視項目数の合計

ここまでに見積もった監視項目数を合計して、650+1000+2418=4068として、4068項目を監視するものと想定します。ここでは更に余裕をもって5000項目と考えます。
独自のOSやアプリケーション等、独自の監視テンプレートやスクリプトを必要とする監視項目は考えないものとします。

リソースの計画

これまでに見積もった監視項目数をもとに、Zabbixサーバに必要なリソースを計画します。

監視設定の容量

設定ファイルの容量は10MB程度と仮定します。

ヒストリデータの容量

ヒストリデータがどのくらいの容量になるかは、以下の計算式で算出できます。
(監視項目数*監視データあたりの容量B) / 平均監視間隔秒 * (3600秒*24時間*保存期間)
監視データあたりの容量は、平均して120Bとして考えます。
(5,000*120)/300*(3600*24*90) = (600,000/300)*7,776,000 = 15,552,000,000
となるので、15.552GBの容量が必要なことがわかります。
Zabbix公式FAQを参考にして、余裕を持って18GBとしておきます。

トレンドデータの容量

トレンドデータの容量の計算は以下の計算式です。
(監視項目数*トレンドデータあたりの容量B) * 24時間 * 保存期間日
ここではトレンドデータあたりの容量は概算値120Bとします。
(5,000*120)*24*365 = 600,000*8,760 = 5,256,000,000
となり、5.256GBの容量が必要となります。
こちらもZabbix公式FAQを参考に、余裕を持って7.2GBと見積もります。

イベントデータの容量

イベントデータの容量は以下の計算式で求められます。
1日あたりに発生する障害の数 * 1イベント当たりの容量B * 保存期間日
1イベント当たりの容量を概算値200Bとすると
100*200*365 = 7,300,000になるので、7.3MBとなります。

必要なディスク容量の合計

ここまでの計算をもとに、Zabbixサーバに必要なディスク容量は以下のよう計算できます。
10,000,000 + 18,000,000,000 + 7,200,000,000 + 7,300,000 = 25,217,300,000
監視データの保存に必要なディスク容量は25.217GBということがわかりました。

CPUコア

ここでは4コアとします。

メモリ

ここでは以下のように見積もって、余裕をもって16GBとします。
zabbixサーバが使用するメモリ: 3GB (zabbix-server.confで調整可能)
データベースが使用するメモリ: 6GB
WEBインターフェースが使用するメモリ: 1GB
OSが使用するメモリ: 1GB

RockyLinux9

下記の公式サイトでx86_64 minimalのISOファイルを選択し、作業PCのローカル環境にダウンロードします。
https://rockylinux.org/ja/download

NutanixAHV(ハイパーバイザ)にISOイメージをアップロードし、これまでに決めたサイジングで仮想マシンを作成して、起動させたらコンソールを立ち上げて仮想マシンに接続します。

インストール

インストールウィザードが開始されますので、各設定を行います。
インストールウィザードでの設定
全て完了したらインストールを完了させて、再起動が終わったら再度ハイパーバイザ上のコンソールから仮想マシンに接続します。

初期設定

ルートユーザでログインしてから、一般ユーザとして作成したzabbixusersudoersに追加します。

# usermod --append -G wheel zabbixuser

ここで一旦ログアウトして、コンソール接続を終了します。
以降はローカルPC上のSSHクライアントで仮想マシンにSSH接続して、ログを記録しながら作業を行います。

一般ユーザでログインしてから、作業前にアップデートをしておきます。

$ sudo dnf update -y

今回はSELinuxを無効化します。

$ sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
$ sudo setenforce 0

次にfirewalldでポートを開放します。
まずHTTPとHTTPSのポートを開放します。

$ sudo firewall-cmd --add-port=80/tcp --permanent
$ sudo firewall-cmd --add-port=443/tcp --permanent

Zabbix Trapのポートを開放します。

$ sudo firewall-cmd --add-port=10051/tcp --permanent

SNMP Trapのポートを開放します。

$ sudo firewall-cmd --add-port=162/udp --permanent

最後にfirewalldのリロードを行います。

$ sudo firewall-cmd --reload

構築作業で使用するtarwgetをインストールします。

$ sudo dnf install -y tar wget

ローカルタイム設定を日本に変更します。

$ sudo rm -r /etc/localtime
$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime

PostgreSQL-14

PostgreSQL-14をインストールします。
https://yum.postgresql.org/repopackages/

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm

設定を投入します。

$ sudo tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL

ここでアップデートをしておきます。

$ sudo dnf update -y

TimescaleDB

TimescaleDBをインストールします。

$ sudo dnf install -y timescaledb-2-postgresql-14

データベースを初期化します。一時的にルートユーザに昇格します。

$ su -
# /usr/pgsql-14/bin/postgresql-14-setup initdb
# exit

PostgreSQLの起動と、自動起動の設定を行います。

$ sudo systemctl enable --now postgresql-14

あわせてsystemctl status postgresql-14で起動の確認をしておきます。

初期設定

次にデータベースのチューニングを行います。

$ sudo timescaledb-tune --pg-config=/usr/pgsql-14/bin/pg_config --quiet --yes

PostgreSQLを再起動します。

$ sudo systemctl restart postgresql-14

データベースのユーザを作成します。ルートユーザに切り替えます。

$ su -
# sudo -i -u postgres createuser --pwprompt zabbix

Enter password for new role:というプロンプトが表示されるので、パスワードを設定します。
最後にTimescaleDBを有効化します。

# echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -i -u postgres psql zabbix

Welcome To TimescaleDBというアスキーアートが表示され、TimescaleDBが有効化されます。
PostgreSQLを再起動して、データベースの設定を終了します。

# systemctl restart postgresql-14
# exit

Zabbix6.0

Zabbix RPMパッケージをインストールします。

$ sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/9/x86_64/zabbix-release-6.0-4.el9.noarch.rpm

ここでキャッシュを削除しておきます。

$ sudo dnf clean all

Zabbixに必要なパッケージをインストールします。

$ sudo dnf install -y zabbix-server-pgsql zabbix-web-pgsql zabbix-web-japanese zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent jq

初期設定

タイムゾーン設定を行います。

$ sudo sed -i.org '$a php_value[date.timezone] = Asia/Tokyo' /etc/php-fpm.d/zabbix.conf

データベースに初期データを流し込みます。

$ zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix

zabbix_server.confにデータベース認証情報を設定します。(下記の方法はパスワードがコマンド履歴に平文で残ってしまうので非推奨です)

$ sudo sed -i.org 's/# DBPassword=/DBPassword={YOUR DATABASE PASSWORD}/g' /etc/zabbix/zabbix_server.conf

IPv6を無効化しておきます。

$ sudo sed -i.org 's/::1/#::1/g' /etc/hosts

Nginx

Nginxを起動します。

$ sudo systemctl start nginx

初期設定を行います。

$ sudo sed -i.org 's/#        listen          8080;/        listen          80;/g' /etc/nginx/conf.d/zabbix.conf
$ sudo sed -i 's/#        server_name     example.com;/        server_name     localhost;/g' /etc/nginx/conf.d/zabbix.conf

データベース接続設定

SQLの認証方法を設定します。
まずオリジナルファイルを退避させます。

$ sudo cp -p /var/lib/pgsql/14/data/pg_hba.conf /var/lib/pgsql/14/data/pg_hba.conf.org

認証方法を変更します。今回はTrustにしましたが非推奨です。

$ sudo vi /var/lib/pgsql/14/data/pg_hba.conf
host    all             all             127.0.0.1/32            trust

SQLについての設定を記述します。
これらの設定をしないとZabbixサーバが起動しません。

$ sudo sed -i.org "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /var/lib/pgsql/14/data/postgresql.conf
$ sudo sed -i 's/#port = 5432/port = 5432/g' /var/lib/pgsql/14/data/postgresql.conf

こちらも初期値だと起動しなかったので、最大コネクション数を引き上げます。

$ sudo sed -i 's/max_connections = 25/max_connections = 100/g' /var/lib/pgsql/14/data/postgresql.conf

各サービスを起動します。

$ sudo systemctl enable --now zabbix-server zabbix-agent nginx php-fpm

最後に再起動をかけます。

$ sudo reboot

GUI設定

ブラウザでhttp://{YOUR IP ADDRESS}/setup.phpにアクセスすると初期画面が表示されます。
ZabbixGUI
日本語パッケージにより日本語が選択できるようになっていますので選択して進みます。
次に表示される「前提条件のチェック」にて、すべての項目が「OK」になっていることを確認します。
次に「データベース接続設定」を行います。
データベースがlocalhostの場合はTLS化できないのでチェックを外しておきます。
ZabbixGUI
以降、最後まで設定を進めると「おめでとうございます!Webインターフェースのインストールが終了しました。」と表示されるので「終了」を選択します。
ログイン画面に遷移するので、初期パスワード「Admin」「zabbix」を入力してログインします。
ZabbixGUI
Zabbixダッシュボードが表示されたら、「zabbixサーバーの起動」 が 「はい」になっていることを確認します。
Zabbixダッシュボード
以上でZabbixサーバの構築は終了です。

構築後の調整

構築後、実際に稼働させてから発生したエラーに対して、設定の調整を行いました。

Zabbixサーバーが動作していません

まずZabbixサーバのログを確認します。

$ less /var/log/zabbix/zabbix_server.log

以下のエラーが出てプロセスが停止していました。

124917:20230420:104512.855 [file:dbconfig.c,line:86] __zbx_mem_malloc(): out of memory (requested 16 bytes)
124917:20230420:104512.855 [file:dbconfig.c,line:86] __zbx_mem_malloc(): please increase CacheSize configuration parameter
124905:20230420:104512.858 One child process died (PID:124917,exitcode/signal:1). Exiting ...
124914:20230420:104513.563 HA manager has been paused
124914:20230420:104513.568 HA manager has been stopped
124905:20230420:104513.569 Zabbix Server stopped. Zabbix 6.0.16 (revision a90e18c0b6e).

メモリの状況を確認します。

$ free
               total        used        free      shared  buff/cache   available
Mem:        16048968     4934828    10750636      283644      928944    11114140
Swap:        8224764           0     8224764
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 10761688   3748 925232    0    0     2     7   92  128  1  0 99  0  0

メモリには問題がないので、設定値に問題があると考えられます。
Zabbixサーバの設定ファイル内でCacheSize=の記述を探して編集します。

$ sudo vi /etc/zabbix/zabbix_server.conf
~snip~
### Option: CacheSize
#       Size of configuration cache, in bytes.
#       Shared memory size for storing host, item and trigger data.
#
# Mandatory: no
# Range: 128K-64G
# Default:
CacheSize=64M
~snip~

当該箇所をコメントインして64Mとして書き換えました。
Zabbixサーバを再起動させると「zabbixサーバーの起動」 が 「はい」になっていることを確認できました。

Utilization of discoverer processes over 75%

ZabbixサーバホストのトリガーでUtilization of discoverer processes over 75%という障害が記録されることがあります。
こちらもZabbixサーバの設定ファイルを編集します。
StartDiscoverers=の記述を探します。

$ sudo vi /etc/zabbix/zabbix_server.conf
~snip~
### Option: StartDiscoverers
#       Number of pre-forked instances of discoverers.
#
# Mandatory: no
# Range: 0-250
# Default:
StartDiscoverers=3
~snip~

StartDiscoverers=をコメントインして、値を3に増やすと障害が発生しなくなりました。

参考サイト

https://www.zabbix.com/download?zabbix=6.0&os_distribution=rocky_linux&os_version=9&components=server_frontend_agent&db=pgsql&ws=nginx
https://www.zabbix.com/documentation/6.0/jp/manual/appendix/install/timescaledb
https://www.zabbix.com/documentation/current/en/manual/appendix/install/db_encrypt/postgres
https://cloud.tencent.com/developer/article/1941527
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-rocky-linux-9
https://www.sworditsys.com/share/zabbix/zabbix-6-0-lts-timescaledb-13-install.html
https://www.sraoss.co.jp/tech-blog/zabbix/zabbix60-install/
https://www.sraoss.co.jp/tech-blog/zabbix/zabbix-timescaledb/
https://ja.linux-console.net/?p=2521#gsc.tab=0
https://blog.n-z.jp/blog/2022-11-05-install-zabbix-6-with-timescaledb.html
https://stackoverflow.com/questions/57554370/how-to-get-timescaledb-version-of-the-database
https://www.opensourcetech.tokyo/entry/20190510/1557476447

Discussion