はじめに
当社では、OpenStackを用いたプライベートクラウド環境の展開を2016年から開始しています。2019年には新たな環境を追加し、さらに利用規模を拡大しました。
その際、OpenStackプライベートクラウド環境の可用性を確保するために、Zabbixによる監視を導入しました。当時はZabbix 4.4+CentOS 7.5+PostgreSQL+Apacheという構成で運用を開始しました。OpenStackサーバーからはSNMP trapをZabbix Serverに向けて通知を行い、監視を行っています。
今回、OpenStackプライベートクラウド環境のサーバー更改に合わせてZabbix Serverを新たに構築しました。 この構築にあたっては、Zabbix 6.4+Ubuntu 22.04 LTS+PostgreSQL+TimescaleDB+nginxという構成を選定しました。
Zabbix 6.4を選んだ理由
Zabbixはサポート期間とリリースポリシー ⧉を定めており、LTSバージョン(長期サポートバージョン)は1年半ごとのリリースとなっています。
執筆時点の最新のLTSバージョンはZabbix 6.0になります。
今回Zabbix 6.4を選んだ理由はZabbix 6.2で導入された以下の機能を使いたかったためです。
- Zabbix Proxyの設定の再読み込み
当社のOpenStack環境は社内ネットワークに直接接続している管理用サーバーと、管理用サーバーからのみ接続可能なプライベートネットワークで接続しているサーバー群があります。Zabbix Serverは社内ネットワークにのみ接続しているため、Zabbix Proxyを中継してプライベートネットワークのサーバー群を監視しています。
監視対象サーバーの比率としてはプライベートネットワークに接続するサーバーの方が多いのですが、Zabbix Proxy配下の監視設定はWEB-GUI上で設定の変更を行っても即時反映できませんでした。
反映を早めるには設定ファイルで同期間隔を変更し、Zabbix Proxyサービスを再起動する必要がありました。
この新たな機能は、WEB-GUI上からZabbix Proxy配下の設定を即時反映させる機能となります。柔軟な監視設定の変更を行い、監視を最適化していく段階においては非常に便利な機能です。
なお、Zabbix 6.4はLTSバージョンではないため、Zabbix 7.0 LTSが正式にリリースされたらアップグレードを行う予定です。
TimescaleDBを選んだ理由
TimescaleDBは時系列データベースと呼ばれる機能をPostgreSQLに追加する拡張モジュールです。
TimescaleDBでは、ハイパーテーブルという特別なテーブルを作成します。ハイパーテーブルを使用すると内部的にチャンクと呼ばれる時間範囲ごとに分割したテーブルにデータが格納されます。
Zabbixで採用するメリットとしては、Housekeeping処理能力の向上とデータ圧縮によるディスク領域の節約があげられます。
HousekeepingとはZabbix Serverが収集した監視データから、設定した保存期間を超過したデータを削除する機能です。当社で現在運用しているZabbix 4.4環境では、Housekeepingによる処理で大きな負荷がかかっていました。こちらの負荷を低減させるためにTimescaleDBを選びました。
また、当社の運用では監視データがディスク領域を圧迫するようなことはありませんが、TimescaleDBの公式ドキュメント ⧉によるとチャンクサイズを圧縮により90%以上削減することが可能だと紹介されています。Zabbixを運用していてサイズが肥大化するテーブルは、トレンドとヒストリーに関連するテーブルです。ZabbixにTimescaleDBを採用する場合、これらのテーブルのデータがチャンクに格納されることになりますので、高い圧縮効果を期待できます。
構築手順
今回は以下の構成で構築を行いました。
-
ハードウェア:OpenStack上の仮想マシン
- vCPU: 4
- RAM: 4GB
- DISK: 100GB
-
OS: Ubuntu 22.04 LTS
-
Web Server: nginx 1.18
-
DB: PostgreSQL 14.10+TimescaleDB 2.8.1
-
Zabbix Server: 6.4.8
-
Zabbix Agent: 6.4.8
-
SNMP trap監視: 有(SNMPTT)
Zabbixパッケージのインストール
公式サイトのDownload and install Zabbix ⧉を参考に必要なパッケージのインストールを進めます。
- Zabbixのリポジトリを登録
# wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
# dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
# apt update
- ZabbixのServer、フロントエンド、Agentをインストール
# apt install zabbix-server-pgsql zabbix-frontend-php php8.1-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-agent
データベースのインストール
TimescaleDBの公式サイトのインストール手順 ⧉を参考に進めます。
PostgreSQLやTimescaleDBの最新バージョンは、Zabbixサポート外のバージョンの可能性があるため注意してください。
対応しているバージョンは公式サイトのインストール要件 ⧉に記載されています。
- PostgreSQLとTimescaleDBをバージョン指定でインストール
# apt install gnupg postgresql-common apt-transport-https lsb-release wget
# /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
# echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
# wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo apt-key add -
# apt update
# apt install timescaledb-2-postgresql-14=2.8.1~ubuntu22.04 timescaledb-2-loader-postgresql-14=2.8.1~ubuntu22.04
timescaledb-2-postgresql-14
のインストール時に依存関係によってPostgreSQL 14がインストールされます。
- PostgreSQLの再起動
# systemctl restart postgresql
- PostgreSQLの初期化(パスワードを入力して設定)
# sudo -u postgres createuser --pwprompt zabbix
# sudo -u postgres createdb -O zabbix zabbix
ここで設定したパスワードはzabbix_server.conf
に設定する必要があります。
- 初期スキーマをインポート
# zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix
- TimescaleDBの設定
# echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix
# cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb.sql | sudo -u zabbix psql zabbix
- Zabbix Serverの設定ファイルを編集
- /etc/zabbix/zabbix_server.conf
DBPassword=<3.で設定したパスワード>
- /etc/zabbix/nginx.conf
以下の項目についてご利用の環境に合わせて設定してください。
listen 8080;
server_name example.com;
- Zabbix ServerとAgentを再起動し、自動起動を有効化
# systemctl restart zabbix-server zabbix-agent nginx php8.1-fpm
# systemctl enable zabbix-server zabbix-agent nginx php8.1-fpm
これでZabbix ServerのWEB-GUIにアクセスできます。接続URLは環境により変わります。
snmptrapd・snmpttのインストール
公式サイトのSNMP trapの設定 ⧉を参考に進めます。
- SNMP trap監視に必要なパッケージをインストール
# apt install snmp snmptrapd snmptt libconfig-inifiles-perl libsnmp-perl libnet-ip-perl
- 各種設定ファイルの編集
- /etc/zabbix/zabbix_server.conf
StartSNMPTrapper
を1
に設定することでZabbixのSNMPTrapperが有効になります。
SNMPTrapperFile
にSNMPTrapperが参照するログファイルパスを設定します。
StartSNMPTrapper=1
SNMPTrapperFile=/var/log/snmptt/snmptt.log
- /etc/snmp/snmptt.ini
mode
にdaemon
と設定することでスタンドアローンではなくデーモンとしてsnmpttを実行します。
net_snmp_perl_enable
を1
に設定することでNET-SNMPパッケージのPerlモジュールを有効化します。
date_time_format
で日付フォーマットを設定します。
mode = daemon
net_snmp_perl_enable = 1
date_time_format = %Y/%m/%d %H:%M:%S
- /etc/snmp/snmptrapd.conf
snmptrapd起動時にsnmptthandler-embeddedを読み込ませることで処理を高速化させます。
perl do "/usr/lib/snmptt/snmptthandler-embedded"
- /etc/snmp/snmptt.conf
当社ではサーバーのベンダーのMIB情報をすべて認識させるために、snmpttconvertmib
コマンドでベンダー公式のMIBファイルを変換することで運用しています。
動作確認をするだけであれば以下の設定だけでも確認は可能です。
EVENT general .* "General event" Normal
FORMAT ZBXTRAP $aA $*
- snmptrapdの実行ユーザーをrootユーザーに変更
編集用のユニットファイルを準備します。
# cp /lib/systemd/system/snmptrapd.service /etc/systemd/system/snmptrapd.service
# vi /etc/systemd/system/snmptrapd.service
以下のように設定します。
[Service]
Type=notify
#User=Debian-snmp
User=root
ユニットファイルを読み込みなおし、再起動します。
# systemctl daemon-reload
# systemctl restart snmptrapd.service
- snmpttを再起動
# systemctl restart snmptt.service
- Zabbix Serverを再起動
# systemctl restart zabbix-server
構築で少し苦戦したところ
データベースのバージョン
最初、深く考えずに最新のPostgreSQLとTimescaleDBを導入したところ、バージョンが対応していないというログが出力され、Zabbix Serverを起動できませんでした。
この時、zabbix_server.log
に以下のようなメッセージが出力されます。
Unsupported DB! timescaledb version 21202 is newer than maximum allowed 21199
Recommended version should not be higher than TimescaleDB Community Edition 2.11.
Zabbix Server stopped. Zabbix 6.4.8 (revision ecda9311a92).
「利用するデータベースのバージョンはサポートしていない」という内容になります。
構築手順の通り、対応しているバージョンに落として構築することで正常にZabbix Serverを起動できるようになります。
なお、zabbix_server.conf
のAllowUnsupportedDBVersions
オプションに1
を設定することで、このDBバージョンのチェックを回避することも可能ですが、サポート対象外での動作になるため、インストール要件に従ってバージョンの選定を行いましょう。
SNMP trap監視の準備
各サーバーからのSNMP trap監視は従来を踏襲し、snmptrapd+snmpttで運用することにしました。 私はCentOSなどのRed Hat系OSでのZabbix構築には慣れていたのですが、Ubuntuで構築するにあたり違いがあり若干苦戦してしまいました。
Zabbixでのsnmpttを用いたTrap監視は以下のような流れで処理を行っています。
- サーバーなどの機器からSNMP trapを送信
- ZabbixをインストールしているOS上のsnmptrapdが受信
- snmptrapdがspoolファイルを作成
- snmpttがspoolファイルを読み取り、Zabbixが理解できる形式に変換
- snmpttが変換したtrapの内容をlogファイルに出力
- Zabbix Serverがlogファイルを読み取りTrap監視を実施
SNMP trapの設定を行いテストを行いましたが検知されませんでした。 snmpttのlogファイルには何も出力されません。
通常通りsnmptrapdをインストールして起動すると、
Ubuntu 22.04 LTSではsnmptrapdプロセスがDebian-snmpというユーザーで実行されていました。
spoolファイルはデフォルトだと/var/spool/
配下に作成されるのですが、このディレクトリがrootユーザー権限以外書き込みできないためエラーになってしまいます。
このときsyslog
には以下のログが出力されます。
Could not write to file /var/spool/snmptt/#snmptt-trap-1700033611990678! Trap will be lost!
「/var/spool/
配下にsnmpttのspoolファイルを書き込めない」という内容になります。
私たちはsnmptrapdをrootユーザーで実行するような対応にしました。
以下のファイルを更新することで変更できます。
/lib/systemd/system/snmptrapd.service
しかし、このファイルを変更するとsnmptrapdのパッケージを更新した場合に上書きされてしまうため、
構築手順に記載したとおり、/etc/systemd/system/snmptrapd.service
にコピーして編集する必要があります。
変更後は設定を反映させるため以下を実行して再起動してください。
systemctl daemon-reload
systemctl restart snmptrapd.service
/etc/systemd/
配下にユニットファイルが配置されていれば優先的に参照されます。パッケージが更新されてもこちらのユニットファイルは更新されません。
監視テンプレートの移行
当社がZabbix 4.4で監視していたOpenStack環境では、独自の監視テンプレートを作成して運用していました。 今回新たに構築したZabbix 6.4の環境でも独自の監視テンプレートを転用するためにエクスポート・インポートで投入しようと考えました。
しかし、インポートを実行したところで、以下のエラーメッセージがZabbix ServerのWEB-GUI上に出力されました。
パラメータ "/9/key_"が正しくありません:少なくとも1つのLLDマクロを含めることが必要です。
このメッセージについて、Zabbixの公式フォーラムで調べたところ、以下のスレッドが見つかりました。
当社の監視テンプレートに含まれるディスカバリルールの中に、LLDマクロを含んでいない監視キーが設定されていたことが原因でした。
LLDマクロというのは、例えば公式の監視テンプレートの中でも使われているブロックデバイスのディスカバリルールで設定されている監視キーvfs.dev.write[{#DEVNAME}]
の{#DEVNAME}
を指します。
エクスポートしたファイルから該当する部分を削除してインポートすることで無事に転用することが出来ました。
終わりに
今回はZabbix 6.4+Ubuntu 22.04 LTSの組み合わせでの構築と問題対応について解説しました。この記事が同構成で構築する方に向けてお役に立てば幸いです。