Zabbix Server 構築時に気をつけるべき点（AlmaLinux 9 & PostgreSQL）

## この記事について
これは2025年1月に AlmaLinux 9 で zabbix サーバを立てたとき悩んだポイントをまとめた備忘録である。
この記事は試行錯誤してなんとか動かした記録であり、ハマらないように構築するならおそらく（すべての組み合わせを試したわけではないため、おそらく）「<a href="#まとめ">まとめ</a>」の構成にするのが早い。
ただし2025年3月にまとめたものなので、将来においてはこの記事に書かれている問題が解決している可能性がある。

## サーバ構成
サーバ OS は AlmaLinux OS 9.5
ウェブサーバは nginx
データベースには PostgreSQL を使うことにした。
また、PostgreSQL の TimescaleDB extension なるものが高速処理に適しているそうなので、これも使ってみることにした。

## 悩んだポイント

どこからパッケージを入れ、どのバージョンにするか決めなければならない。

### zabbix-server
どこから入れるかは、2つの選択肢がある
- EPEL リポジトリ
- zabbix リポジトリ

リポジトリにより、入れられる zabbix-server のバージョンが異なる
- [EPEL リポジトリ](https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/Packages/z/)
  - zabbix (6.0) from epel
  - zabbix7 (7.0) from epel
- [zabbix リポジトリ](https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/Packages/z/)（https://www.zabbix.com/download 2025年3月時点の選択肢）
  - zabbix (7.2) from zabbix
  - zabbix (7.0 LTS) from zabbix
  - zabbix (6.0 LTS) from zabbix
  - zabbix (5.0 LTS) from zabbix
  - （選択したバージョンのリポジトリが入るが、どれを入れてもリポジトリ名は同じになる）

### zabbix-server の DB に使う PostgreSQL Server
どこから入れるかは、2つの選択肢がある
- AlmaLinux OS の appstream リポジトリ
- PGDG リポジトリ

リポジトリにより、入れられる PostgreSQL Server のバージョンが異なる
- AlmaLinux OS の appstream リポジトリ（[9.0](https://repo.almalinux.org/vault/9.0/AppStream/x86_64/os/Packages/), [9.2](https://repo.almalinux.org/vault/9.2/AppStream/x86_64/os/Packages/), [9.4](https://repo.almalinux.org/almalinux/9.4/AppStream/x86_64/os/Packages/)）
  - postgresql(13) from appstream
  - postgresql:15 from appstream (AlmaLinux 9.2 以降)
  - postgresql:16 from appstream (AlmaLinux 9.4 以降)
  - （dnf module で切り替える）
- [PGDG リポジトリ](https://yum.postgresql.org/repopackages/)（https://download.postgresql.org/pub/repos/yum/ 2025年3月時点の選択肢）
  - postgresql12 from pgdg12
  - postgresql13 from pgdg13
  - postgresql14 from pgdg14
  - postgresql15 from pgdg15
  - postgresql16 from pgdg16
  - postgresql17 from pgdg17
  - （pgdg-redhat-repo-latest.noarch.rpm をインストールすると、バージョン違いのリポジトリが複数入る）

### PostgreSQL Server に導入する TimescaleDB
どこから入れるかは、3つの選択肢があるようだ
- EPEL リポジトリ
- TimescaleDB リポジトリ
- PGDB リポジトリ

インストールされている PostgreSQL Server のパッケージに適合した TimescaleDB をインストールする
- EPEL リポジトリ
  - timescaeldb from epel
- [TimescaleDB リポジトリ](https://packagecloud.io/app/timescale/timescaledb/search?q=&filter=all&dist=el%2F9&arch=x86_64)
  - timescaledb-2-postgresql-12 from timescale_timescaledb
  - timescaledb-2-postgresql-13 from timescale_timescaledb
  - timescaledb-2-postgresql-14 from timescale_timescaledb
  - timescaledb-2-postgresql-15 from timescale_timescaledb
  - timescaledb-2-postgresql-16 from timescale_timescaledb
  - timescaledb-2-postgresql-17 from timescale_timescaledb
- PGDB リポジトリ
  - timescaledb_12 from pgdg12
  - timescaledb_13 from pgdg13
  - timescaledb_14 from pgdg14
  - timescaledb_15 from pgdg15
  - timescaledb_16 from pgdg16
  - timescaledb_17 from pgdg17


## どんな問題が起きたか

### appstream の PostgreSQL Server と EPEL の TimescaleDB
EPEL の TimescaleDB でサポートされているのは　appstream の postgresql(13) である。
postgresql:15 や postgresql:16 はサポートされておらず、組み込んで起動するとこのようなエラーになる。
```
FATAL:  incompatible library "/usr/lib64/pgsql/timescaledb.so": version mismatch
DETAIL:  Server is version 16, library is version 13.
LOG:  database system is shut down
```
postgresql:15 や postgresql:16 は 9.0 のときには存在しなかったバージョンなので、EPEL はそれらに対応するパッケージは作らないつもりなのかもしれない。

### EPEL の zabbix7 と nginx
EPEL の zabbix7-web パッケージには Apache 用の設定ファイルが含まれているものの、nginx 用の設定ファイルが含まれていない。
一方 zabbix リポジトリ の zabbix には zabbix-nginx-conf というパッケージがあり、nginx 用の設定ファイルが含まれている。
EPEL の zabbix7-web パッケージを使うには、[zabbix リポジトリの srpm](https://dl.fedoraproject.org/pub/epel/9/Everything/source/tree/Packages/z/) を解凍して、zabbix-nginx.conf を持ってくるとよい。

### EPEL の zabbix7 と TimescaleDB
EPEL の zabbix7-dbfiles-pgsql には zabbix 用のスキーマファイルが含まれているものの、TimescaleDB 用のスキーマファイルが含まれていない。
一方 zabbix リポジトリ の zabbix には zabbix-sql-scripts というパッケージがあり、MySQL 用、PostgreSQL 用に加えて TimescaleDB 用のスキーマファイルが含まれている。
EPEL の zabbix7-dbfiles-pgsql パッケージを使うには、zabbix リポジトリの srpm を解凍して、database/postgresql/timescaledb/schema.sql を実行するとよい。

### PostgreSQL Server 17 の監視

bgwriter と checkpoints の値が取れない。おそらくまだ [postgresql_agent](https://github.com/zabbix/zabbix/tree/master/templates/db/postgresql_agent/postgresql) が PostgreSQL 17 に対応していない。
この件についての（agent2 についてのものだが）[バグレポート](https://support.zabbix.com/browse/ZBX-25487)

- PostgreSQL 17 で統計用テーブルの構造が<a href="https://www.postgresql.org/docs/17/release-17.html">変わった</a>
- zabbix-agent の postgresql テンプレートは従来の構造を想定して統計を拾いに行っているため

### TimescaleDB 2.16, 2,17 での問題
"Last 1 day" のグラフは表示されるが、"Last 30 days" にすると "aggregated compressed column not found" という文字が表示されてグラフが表示されない。
これは TimescaleDB の[バグ](https://github.com/timescale/timescaledb/issues/7410) の影響らしい。
TimescaleDB はバグを直した 2.18 をリリースしたが、2.18 になっても[解決しない](https://support.zabbix.com/browse/ZBX-25609)っぽい。
<a href="https://support.zabbix.com/browse/ZBX-25609?focusedId=1025328&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-1025328">この workaround</a> を設定すると問題は出なくなる。
EPEL の TimescaleDB は 2.10 なので、この問題には遭遇しないと思われる。

## 私が最終的にどの組み合わせで構築したか

稼働させる必要があり、一からの構築し直しを繰り返せなかったため、おすすめの構成とは若干異なる。

<dl>
  <dt>zabbix-server</dt>
  <dd>zabbix リポジトリ から zabbix 7.0<br>
      最も新しい LTS なので 7.0 にした。</dd>
  <dt>PostgreSQL</dt>
  <dd>PGDG から postgresql17<br>
      TimescaleDB の<a href="https://docs.timescale.com/self-hosted/latest/install/installation-linux/">インストールガイド</a>が PGDG を案内していたので、また新しいのがよかったので最新の 17 にした。</dd>
  <dt>TimescaleDB</dt>
  <dd>TimescaleDB リポジトリ から timescaledb-2-postgresql-17<br>
      TimescaleDB の<a href="https://docs.timescale.com/self-hosted/latest/install/installation-linux/">インストールガイド</a>が TimescaleDB リポジトリを案内していたので、このリポジトリから PostgreSQL バージョンに合うものを選択した。<br>
      エラーが出るので TimescaleDB の <a href="https://support.zabbix.com/browse/ZBX-25609?focusedId=1025328&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-1025328">workaround</a> を適用した。</dd></dd>
  <dt>PostgreSQL 17 の監視</dt>
  <dd>bgwriter と checkpoints のアイテムを無効にした。</dd>
</dl> 

## まとめ

### 監視対象の PostgreSQL が 17 だと取得できない監視アイテムがある
おそらく zabbix-agent が未対応なため、PostgreSQL 17 ではすべての監視アイテムを取得できない。
エラーが出続けるので特定の監視アイテムを無効にするか、サービスへの採用バージョンを選べるなら PostgreSQL 16 までにしておくとよいかもしれない。

### おすすめサーバ構成1
リポジトリを追加しない構成

<dl>
  <dt>web サーバ</dt>
  <dd>Apache を用いる</dd>
  <dt>zabbix-server</dt>
  <dd>EPEL リポジトリの zabbix 7.0 を使う<br>
      最も新しい LTS である。<br>
      web サーバは Apache でなければならない</dd>
  <dt>PostgreSQL + TimescaleDB</dt>
  <dd>AlmaLinux OS の appstream リポジトリから postgresql:16 を使い、TimescaleDB を使わない。<br>
      比較的新しい PostgreSQL を使える。</dd>
</dl>

### おすすめサーバ構成2
zabbix リポジトリだけ追加した構成

<dl>
  <dt>web サーバ</dt>
  <dd>Apache でも nginx でもよい</dd>
  <dt>zabbix-server</dt>
  <dd>zabbix リポジトリの zabbix 7.0 を使う<br>
      最も新しい LTS である。<br>
      Apache でも nginx でも大丈夫だし、TimescaleDB 用のスキーマファイルもある。</dd>
  <dt>PostgreSQL + TimescaleDB パターン1</dt>
  <dd>AlmaLinux OS の appstream リポジトリから postgresql:16 を使い、TimescaleDB を使わない。<br>
      比較的新しい PostgreSQL を使える。</dd>
  <dt>PostgreSQL + TimescaleDB パターン2</dt>
  <dd>AlmaLinux OS の appstream リポジトリから postgresql(13) を使い、EPEL の TimescaleDB を使う。<br>
      TimescaleDB を使える。</dd>
</dl>

### おすすめサーバ構成3
zabbix リポジトリと PGDG リポジトリを追加した構成

<dl>
  <dt>web サーバ</dt>
  <dd>Apache でも nginx でもよい</dd>
  <dt>zabbix-server</dt>
  <dd>zabbix リポジトリの zabbix 7.0 を使う<br>
      最も新しい LTS である。<br>
      Apache でも nginx でも大丈夫だし、TimescaleDB 用のスキーマファイルもある。</dd>
  <dt>PostgreSQL + TimescaleDB</dt>
  <dd>PGDG の postgresql-16 を使い、PGDG の TimescaleDB を使う。<br>
      比較的新しい PostgreSQL と TimescaleDB を使える。<br>
      監視対象に PostreSQL Server 17 が入ってしまうので postgresql-17 は使わない。<br>
      TimescaleDB の <a href="https://support.zabbix.com/browse/ZBX-25609?focusedId=1025328&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-1025328">workaround</a> を適用する。</dd>
</dl>

### おすすめサーバ構成4
<dl>
  <dt>PostgreSQL を使わない</dt>
  <dd>試していないがこのほうが楽かもしれない。身もフタもない話であるが、そう言いたくなるくらい色々あった（で、この記事を書いた）。<br>
      MySQL のほうは MariaDB もあり、それはそれで何かあるかもしれないが、試していないのでわからない。</dd>
</dl>