長期間使用しているとDBの実使用量が増えます【MIRACLE ZBX 1.8, 2.0, 2.2】
Housekeeperプロセスの役割
MIRACLE ZBXを長期間使用していると、ヒストリ、トレンドデータが蓄積されていきます。
個々のアイテムによって、それらの保存する日数を決めることができ、それに応じてHousekeeperプロセスが一時間毎に不要となったデータを削除します。
しかしながら、あくまで削除されるのはDB内のデータであり、OS上のデータ使用量は変わりません。
DBの簡単な仕組みの話
上記のようなOS上のデータ使用量が変わらない仕組みを簡単に説明します。(DBの実装に依るので正確ではありません。)
- DBは個々のテーブルに対してある程度の領域をOS上にブロックとして確保します。
- 書き込み続けて確保した領域が足りなくなると、再度ある程度の領域をブロックとして確保します。
- 削除があったときは、そのブロック内で不要となったフラグ立てをします。
- うまい具合にブロック内全てのデータが不要となった場合、ブロックが削除、再利用されます。
つまり、Housekeeperがいくら不要データを削除しても、実使用量が減りません。
確認方法
まずは、個々のテーブルのデータ使用量を確認してみましょう。
(参考 http://d.hatena.ne.jp/sho-yamasaki/20120405/1333640589)
$ mysql -u root zabbix
mysql> select
-> table_name, engine, table_rows as tbl_rows, avg_row_length as rlen,
-> floor((data_length+index_length)/1024/1024) as allMB,
-> floor((data_length)/1024/1024) as dMB,
-> floor((index_length)/1024/1024) as iMB
-> from information_schema.tables
-> where table_schema=database()
-> order by (data_length+index_length) desc;
+-----------------------+--------+----------+-------+-------+------+------+
| table_name | engine | tbl_rows | rlen | allMB | dMB | iMB |
+-----------------------+--------+----------+-------+-------+------+------+
| history | InnoDB | 1123517 | 70 | 103 | 75 | 28 |
| trends | InnoDB | 291508 | 75 | 21 | 21 | 0 |
| history_uint | InnoDB | 226836 | 64 | 21 | 14 | 7 |
| trends_uint | InnoDB | 202549 | 77 | 15 | 15 | 0 |
...
historyテーブルが一番使用されており、103MB程使用しています。
次に、実際のディスク容量を見てみましょう。
# ls -al /var/lib/mysql/zabbix/history.*
-rw-rw---- 1 mysql mysql 8654 3月 5 09:16 2013 /var/lib/mysql/zabbix/history.frm
-rw-rw---- 1 mysql mysql 541065216 3月 18 09:50 2015 /var/lib/mysql/zabbix/history.ibd
OS上では540MB程使用しています。
OS上の使用量を減らす
OS上の使用量を減らす一番の方法は、mysqldumpにてフルダンプを取得した後に、全てを戻すことです。ただし、この方法ですとDBのダウンタイムが発生してしまいます。
そこで、当社がMIRACLE ZBXサーバを構築するときに、当社が推奨する設定を行っている場合※1に限りますが、下記の方法で行うことができます。
$ mysql -u root zabbix -e "alter table history type=InnoDB;"
※1 具体的には、my.cnfの[mysqld]セクションにinnodb_file_per_tableを設定することです。
実際に行った後の実使用量は下記のように変化します。
# ls -al /var/lib/mysql/zabbix/history.*
-rw-rw---- 1 mysql mysql 8654 3月 18 09:58 2015 /var/lib/mysql/zabbix/history.frm
-rw-rw---- 1 mysql mysql 96468992 3月 18 09:59 2015 /var/lib/mysql/zabbix/history.ibd
96MB程度に減少しています。
下記のようなスクリプトを定期的に動かすのが良いと思いますが、できればZabbixサーバを停止した状態で行ってください。
#!/bin/sh
cd /var/lib/mysql/zabbix
for i in *.ibd
do
db=${i%.ibd}
mysql -u root zabbix -e "alter table ${db} type=InnoDB;"
done
注意) 上記は既に古い書式でした。現在では下記が推奨となります。
$ mysql -u root zabbix -e "alter table history ENGINE=InnoDB;"