— ディスク分離と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=/data | Tablespace許可パス登録 |
| Tablespace作成 | CREATE TABLESPACE | ディスク別I/O分散 |
| テーブル移動 | ALTER TABLE ... TABLESPACE | Zabbix主要テーブルの移動 |
| 検証 | SELECT TABLE_NAME, TABLESPACE_NAME | 実際の分離確認 |
9) 次回予告
第3編では、MySQL 8.0環境で file-per-table へ切り替えた後、history と trends をそれぞれ 日単位/月単位パーティション で構成する手順を解説する。
ここから本格的なDB I/O最適化が始まる。
🛠 마지막 수정일: 2025.11.03
💡 お困りですか?
Zabbix、Kubernetes、各種オープンソースインフラの構築・運用・最適化・障害解析が必要であれば、いつでもご連絡ください。
📧 メール: jikimy75@gmail.com
💼 サービス: 導入支援 | 性能チューニング | 障害解析コンサルティング
답글 남기기
댓글을 달기 위해서는 로그인해야합니다.