Zabbix DBが遅いとき:MySQLパーティションで解決する実務構築ガイド(第2編)

— ディスク分離とTablespace構成によるI/O分散


概要

本ドキュメントは、Zabbix DBが次第に遅くなる主な原因の一つであるI/O集中問題を軽減するための実務ガイドである。
MySQL 8.x環境でZabbixのhistory・trendsデータを別ディスクに分離し、
General Tablespaceを構成してデータ格納パスを明確に分ける手順を扱う。

第1編でZabbix 7.4+MySQLのインストールとスキーマロードを完了している場合、
ここからはディスク構造を分け、テーブルを物理的に分離する段階となる。


1) 前提条件

  • OS:Ubuntu 22.04
  • DB:MySQL 8.x
  • スキーマ/var/lib/mysql/zabbix(第1編で作成済み)
  • 別ディスク/data(マウント済み)
  • MySQLプロセス所有者mysql:mysql

この作業はMySQLが起動中でも実行可能だが、
データディレクトリ追加 → AppArmorポリシー修正 → MySQL再起動 の順に必ず進めること。


2) ディレクトリ作成と権限設定

ディレクトリ作成

# mkdir -p /data/history
# mkdir -p /data/trends

権限設定

# chown -R mysql:mysql /data
# chmod 700 /data/history /data/trends

チェックポイント

  • MySQLサービスアカウント(mysql)が /data 以下に対して読み書き可能であること。
  • /data が別デバイス(例:/dev/sdb)としてマウントされている場合、I/O分散効果が得られる。

3) AppArmorポリシーの修正

MySQLはAppArmorによってアクセス可能なパスが制限されている。
新しく作成した /data パスを許可しないと、Tablespace作成時に “access denied” エラーが発生する。

# vi /etc/apparmor.d/usr.sbin.mysqld

以下の2行を追記する:

/data/ r,
/data/** rwk,

保存後、AppArmorを再起動する:

# systemctl restart apparmor

チェックポイント

  • /data/ を含む行がポリシーに追加されていること。
  • /var/log/syslog に “AppArmor parser error” が出ていないこと。

4) MySQL設定にディレクトリを登録

MySQL 8.0.21以降では、Tablespaceを作成できるディレクトリを事前に指定しておく必要がある。

# vi /etc/mysql/mysql.conf.d/mysqld.cnf

ファイル末尾に以下を追加:

innodb_directories=/data

保存してMySQLを再起動:

# systemctl restart mysql

チェックポイント

mysql> SHOW VARIABLES LIKE 'innodb_directories';

→ 値が /data と表示されること。


5) General Tablespaceの作成

次に、各ディスクにTablespaceを作成する。

# mysql -uroot -p
# (パスワード入力)

mysql> USE zabbix;

-- history用Tablespace (/data/history)
mysql> CREATE TABLESPACE ts_history ADD DATAFILE '/data/history/ts_history.ibd' ENGINE=InnoDB;

-- trends用Tablespace (/data/trends)
mysql> CREATE TABLESPACE ts_trends ADD DATAFILE '/data/trends/ts_trends.ibd' ENGINE=InnoDB;

結果確認

# ls -l /data/history/ts_history.ibd
# ls -l /data/trends/ts_trends.ibd

2つのファイルが実際に作成されていることを確認する。
もしファイルが見えない場合は、AppArmor設定またはinnodb_directories設定が漏れている可能性がある。


6) 既存テーブルをTablespaceへ移動

Zabbixはインストール時、すべてのデータを /var/lib/mysql/zabbix に保存する。
ここでは ALTER TABLE コマンドを使用して、history・trendsデータを別ディスクに移動する。

-- history系 → /data/history
mysql> ALTER TABLE zabbix.history       TABLESPACE ts_history;
mysql> ALTER TABLE zabbix.history_uint  TABLESPACE ts_history;

-- trends系 → /data/trends
mysql> ALTER TABLE zabbix.trends        TABLESPACE ts_trends;
mysql> ALTER TABLE zabbix.trends_uint   TABLESPACE ts_trends;

7) 作業後の確認

  • /data/history および /data/trends に各テーブルの .ibd ファイルが移動しているか確認
  • /var/lib/mysql/zabbix/data/history の容量差を du -sh で比較
  • mysql> SHOW ENGINE INNODB STATUS\G コマンドでエラーの有無を確認
  • AppArmorが依然としてブロックする場合は
    /etc/apparmor.d/cache/ を削除し、apparmor_parser -r で再適用

8) まとめ

手順コマンド/作業目的
/dataディレクトリ作成mkdir, chown物理ディスク分離
AppArmor修正/data/** rwk,アクセス許可
MySQL設定innodb_directories=/dataTablespace許可パス登録
Tablespace作成CREATE TABLESPACEディスク別I/O分散
テーブル移動ALTER TABLE ... TABLESPACEZabbix主要テーブルの移動
検証SELECT TABLE_NAME, TABLESPACE_NAME実際の分離確認

9) 次回予告

第3編では、MySQL 8.0環境で file-per-table へ切り替えた後、
historytrends をそれぞれ 日単位/月単位パーティション で構成する手順を解説する。
ここから本格的なDB I/O最適化が始まる。

🛠 마지막 수정일: 2025.11.03

💡 お困りですか?
Zabbix、Kubernetes、各種オープンソースインフラの構築・運用・最適化・障害解析が必要であれば、いつでもご連絡ください。

📧 メール: jikimy75@gmail.com
💼 サービス: 導入支援 | 性能チューニング | 障害解析コンサルティング