7 TimescaleDBのセットアップ
概要
ZabbixはTimescaleDBをサポートしています。TimescaleDBはPostgreSQLベースのデータベースソリューションであり、データを時間ベースのチャンクに自動的に分割することで、大規模環境での高速なパフォーマンスを実現します。
現在、TimescaleDBはZabbixプロキシではサポートされていません。
このページの手順は、以下のシナリオで使用できます。
- TimescaleDBデータベースを作成する場合、または既存のPostgreSQLテーブルからTimescaleDBへ移行する場合(設定を参照)。
- Zabbixのアップグレード時に既存のTimescaleDBデータベーススキーマをアップグレードする場合(TimescaleDBスキーマのアップグレードを参照)。
設定
前提条件: データベースサーバーに、サポート対象バージョンのTimescaleDB拡張機能がインストールされていること。 インストール手順については、TimescaleDB documentationを参照してください。
TimescaleDBをインストールする前に、official PostgreSQLリポジトリからサポート対象のPostgreSQLリリースをインストールしてください。
次を実行して、特定のデータベースでTimescaleDB拡張機能を有効にします。
echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix
このコマンドの実行には、データベース管理者権限が必要です。
'public' 以外のデータベーススキーマを使用している場合は、上記のコマンドに SCHEMA 句を追加する必要があります。
例:
echo "CREATE EXTENSION IF NOT EXISTS timescaledb SCHEMA yourschema CASCADE;" | sudo -u postgres psql zabbix
次に、postgresql/timescaledb/schema.sql スクリプトを実行します。
新規インストールの場合、このスクリプトは通常のPostgreSQLデータベースが初期スキーマ/データ付きで作成された後に実行する必要があります(database creationを参照)。
cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql zabbix
TimescaleDBバージョン2.9.0以降で schema.sql スクリプトを実行する際に、ベストプラクティスに従っていないことを示す警告メッセージが表示されても無視してください。
この警告にかかわらず、設定は正常に完了します。
既存の履歴、トレンド、および監査ログデータの移行には、かなりの時間がかかる場合があります。 移行期間中は、ZabbixサーバーおよびWebインターフェースを停止しておく必要があります。
schema.sql スクリプトは、次のハウスキーピングパラメータを設定します。
- アイテムの履歴保存期間を上書き
- アイテムのトレンド保存期間を上書き
履歴およびトレンドに対してパーティション化されたハウスキーピングを使用するには、これら両方のオプションを有効にする必要があります。 また、履歴のみ、またはトレンドのみのいずれか一方について個別に上書きを有効にすることも可能です。
PostgreSQLおよびTimescaleDBでは、postgresql/timescaledb/schema.sql スクリプトにより、追加で次の2つのパラメータが設定されます。
- 圧縮を有効化
- 7日より古いレコードを圧縮
housekeeper が圧縮データを正常に削除するには、Override item history period オプションと Override item trend period オプションの両方を有効にする必要があります。
override が無効で、テーブルに圧縮チャンクがある場合、housekeeper はこれらのテーブルからデータを削除せず、設定が正しくないことを示す警告が Housekeeping セクションおよび System information セクションに表示されます。
これらのパラメータはすべて、インストール後に Administration > Housekeeping で変更できます。
postgresql.conf 内の PostgreSQL 設定パラメータを最適化するために、TimescaleDB が提供する timescaledb-tune ツールを実行することをお勧めします。
TimescaleDBスキーマのアップグレード
新しいTimescaleDBハイパーテーブルを含むバージョンにZabbixをアップグレードする場合、Zabbixサーバーはそれらのハイパーテーブルを自動的には設定しません(例えば、Zabbix 6.4から7.4へアップグレードする場合、バージョン7.0.0および7.0.2で新しいハイパーテーブルが導入されています)。
新しいTimescaleDBハイパーテーブルを設定するには、次の手順に従ってください。
- Zabbixサーバーを起動します。これにより既存のデータベースがアップグレードされます。
- データベースのアップグレードが完了したことをサーバーのログファイルで確認し、完了後にZabbixサーバーを停止します。 テーブルがハイパーテーブルではない場合に圧縮を有効化しようとすると、サーバーは警告をログに記録することに注意してください。
postgresql/timescaledb/schema.sqlスクリプトを実行します。これにより、新しいTimescaleDBハイパーテーブルが設定されます。 なお、Zabbix 7.0.0以降、スクリプトの場所と名前はpostgresql/timescaledb.sqlからpostgresql/timescaledb/schema.sqlに変更されています。
TimescaleDBバージョン2.9.0以降で schema.sql スクリプトを実行する際に、ベストプラクティスに従っていないことを示す警告メッセージは無視してください。
この警告にかかわらず、設定は正常に完了します。
TimescaleDB圧縮
TimescaleDBハイパーテーブルであるすべてのZabbixテーブルで、TimescaleDBネイティブ圧縮がサポートされています。 TimescaleDBへのアップグレードまたは移行時には、大きなテーブルの初回圧縮にかなり時間がかかる場合があります。
圧縮は "timescale" Timescale Communityライセンスでサポートされており、"apache" Apache 2.0ライセンスではサポートされていないことに注意してください。 Zabbixが圧縮をサポートしていないことを検出した場合、警告メッセージがZabbixサーバーログに書き込まれ、ユーザーはWebインターフェースで圧縮を有効にできません。
圧縮を使用する前に、TimescaleDB documentation で圧縮について理解しておくことをお勧めします。
圧縮には、特に次のようないくつかの制限があることに注意してください。
- 圧縮済みチャンクの変更(挿入、削除、更新)はできません
- 圧縮済みテーブルのスキーマ変更はできません
圧縮設定は、Zabbix Webインターフェースの Administration > Housekeeping セクションにある History, trends and audit log compression ブロックで変更できます。
| Parameter | Default | Comments |
|---|---|---|
| Enable compression | Enabled | チェックボックスをオンまたはオフにしても、圧縮はすぐには有効化/無効化されません。圧縮はHousekeeperによって処理されるため、変更が反映されるまで最大で HousekeepingFrequency 時間の2倍かかります(zabbix_server.conf で設定)圧縮を無効にした後、圧縮期間に該当する新しいチャンクは圧縮されません。ただし、以前に圧縮されたすべてのデータは圧縮されたまま残ります。以前に圧縮されたチャンクを非圧縮に戻すには、TimescaleDB documentation の手順に従ってください。 TimescaleDBサポート付きの古いバージョンのZabbixからアップグレードする場合、圧縮はデフォルトでは有効になりません。 |
| Compress records older than | 7d | このパラメータは7日未満にはできません。 圧縮済みチャンクは不変であるため、この値より古い遅延データ(例: プロキシによって遅延したデータ)はすべて破棄されます。 |
:::note
トレンド更新のパフォーマンスを向上させるには、trends および trends_uint テーブルの "chunk_time_interval" を30日から7日以下に下げることを検討してください。値は、トレンドを使用するアイテム数に応じて調整します。
この設定の目的は、TimescaleDBのベストプラクティスに従い、チャンクサイズがシステムで利用可能なリソース内に収まるようにすることです。
:::