Zabbix6.0をRockyLinux9にTimescaleDBとNginxで構築
はじめに
ここでは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のローカル環境にダウンロードします。
NutanixAHV(ハイパーバイザ)にISOイメージをアップロードし、これまでに決めたサイジングで仮想マシンを作成して、起動させたらコンソールを立ち上げて仮想マシンに接続します。
インストール
インストールウィザードが開始されますので、各設定を行います。
全て完了したらインストールを完了させて、再起動が終わったら再度ハイパーバイザ上のコンソールから仮想マシンに接続します。
初期設定
ルートユーザでログインしてから、一般ユーザとして作成したzabbixuser
をsudoers
に追加します。
# 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
構築作業で使用するtar
とwget
をインストールします。
$ sudo dnf install -y tar wget
ローカルタイム設定を日本に変更します。
$ sudo rm -r /etc/localtime
$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime
PostgreSQL-14
PostgreSQL-14をインストールします。
$ 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
にアクセスすると初期画面が表示されます。
日本語パッケージにより日本語が選択できるようになっていますので選択して進みます。
次に表示される「前提条件のチェック」にて、すべての項目が「OK」になっていることを確認します。
次に「データベース接続設定」を行います。
データベースがlocalhostの場合はTLS化できないのでチェックを外しておきます。
以降、最後まで設定を進めると「おめでとうございます!Webインターフェースのインストールが終了しました。」と表示されるので「終了」を選択します。
ログイン画面に遷移するので、初期パスワード「Admin」「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
に増やすと障害が発生しなくなりました。
参考サイト
Discussion