history_unit.ibdとトリガーの関係

お世話になります。shin19と申します。
zabbix2.0.4を利用しております。

MySQLのデータファイルhistory_unit.ibdが肥大化しているので、アイテムの
保存期間を短くし、昔のデータを削除させようと考えているのですが、質問がございます。

監視対象ホストに

 ・ping用アイテム
   (一定周期でpingを打ち、1か0を保存)
   (保存期間:ヒストリ365/トレンド365)
 ・ping用トリガー
   (アイテムで0を検知すると障害イベント、1を検知すると復旧イベント)

という設定を行っており、このアイテムのヒストリを180に
変更することで肥大化がかなり抑えられると認識しております。
しかし、このことによって180日より前に発生したトリガーのイベント情報は消えてしまいますでしょうか。
トリガーに保存期間の設定がないので、アイテムを消すと一緒に消えてしまうのかと思い、投稿させて頂きました。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

Zabbix 2.0なら、アクションやイベントの保存期間を指定できます。
https://www.zabbix.com/documentation/2.0/jp/manual/web_interface/fronten...

Zabbix 2.2なら、イベントやヒストリなど細かく保存期間を指定で
きるようになります。
https://www.zabbix.com/documentation/2.2/jp/manual/web_interface/fronten...

ただし、一度肥大したデータベースファイルは、中のデータを削除
しただけではファイルサイズは小さくならないと思いますのでご注
意ください。

ご参考:mysqlのデータベースの肥大化について
  http://www.zabbix.jp/node/2631

ユーザー shin19 の写真

TNK様

ご返信頂きありがとうございます。
アクションやイベント期間は無事、手動設定できました。
また、併せてヒストリの保存期間を狭めたのですが、仰る通りhistory_unit.ibdは小さくならずでした。
参考として頂いたURLに記述されている方法の一つとして
 mysql> alter table history_log;
がありますが、データベース内の肥大化しているファイルを特定し、
この対応をすることでhistory_unit.ibdは小さくなるという認識でしょうか。
また、対応後、zabbixのweb画面で見えるデータは一部見えなくなることはございますでしょうか。
質問が多く、恐縮です。

以上、どうぞよろしくお願い致します。

ユーザー TNK の写真

alter tableの実行ではデータは削除されません。

ただし、処理中に何らかの原因で中断してしまった場合にファイル
が破損してしまう可能性はありますので、alter tableを実行する
前に、バックアップを取得してから作業を行うことをお勧めします。

ご参考:ALTER TABLEを上手に使いこなそう。
  http://nippondanji.blogspot.jp/2009/05/alter-table.html

ユーザー shin19 の写真

TNK様

サーバのコピーを作成し、試験環境でhistory_unitに対してalter tableを実行してみました。
結果としては、数時間かかり、エラーが返ってきました。
実行~完了までの間、pingの値取得もできていなかったようです。
history_unit.ibdが肥大化し過ぎておりました。

やはり、教えて頂いたリンク先でお話にある、
 DBエクスポート -> DB作り直し -> DBインポート
の対応が一番のようです。

しかし、実は運用zabbixの作業は時間制限付きなので、どの対応も難しい状況です。
(肥大化を放っておいた私の管理不足です。。)

そこで考えたのが、
 1. サーバのディスク増設
 2. アイテムの保存期間を[ ヒストリ1、トレンド0 ]に変更
という対応です。

この対応により、ヒストリは1日分しか確認できなくなりますが、
housekeepingを365にし、up/down履歴は全てイベントで管理しようと考えております。
また、2.の作業では既存のデータを消せないものの、今後の肥大化を抑えることができると考えております。

こちらの対応は効果的であると言えますでしょうか。

話がトピックからかなり脱線してしまっていることをお許しください。
どうぞよろしくお願い申し上げます。

ユーザー KAZ の写真

shin19さん


この対応により、ヒストリは1日分しか確認できなくなりますが、
housekeepingを365にし、up/down履歴は全てイベントで管理しようと考えております。
また、2.の作業では既存のデータを消せないものの、今後の肥大化を抑えることができると考えております。
 
こちらの対応は効果的であると言えますでしょうか。

ibdファイルは定期的にalter tableかけないと肥大化し続けます。
ibdファイルはデータファイルではなくindexファイルですからデータを削除してもibdは小さくなりません。

history_uintを一度捨てて良いなら、history_uintをdropテーブルしてcreateテーブルすれば良いかと。
テーブルを削除すればibdファイルはなくなります。

時間があるならZabbixを止めた状態で…
1)history_uintテーブルのみエクスポート
2)history_uintをdropテーブルしてcreateテーブル
3)history_uintテーブルのみインポート

上記でいけると思いますが、検証してません。A(^^;

尚、この場合ibdata1は消しちゃダメです。

ユーザー shin19 の写真

KAZ様

ご回答頂き、ありがとうございます。
早速試験環境でエクスポートを実行中です。

恐縮ですが、重ねて質問させて下さい。

> history_uintを一度捨てて良いなら、history_uintをdropテーブルしてcreateテーブルすれば良いかと。
> テーブルを削除すればibdファイルはなくなります。

> 時間があるならZabbixを止めた状態で…
> 1)history_uintテーブルのみエクスポート
> 2)history_uintをdropテーブルしてcreateテーブル
> 3)history_uintテーブルのみインポート

の違いについてですが、
 前者は今までのデータがすべてなくなる
 後者は時間がかかるが、エクスポートを実行した時点までのデータは残る
という認識でよろしいでしょうか。

どうぞよろしくお願いいたします。

ユーザー KAZ の写真

shin19さん


の違いについてですが、
 前者は今までのデータがすべてなくなる
 後者は時間がかかるが、エクスポートを実行した時点までのデータは残る
という認識でよろしいでしょうか。

そうです。

ユーザー shin19 の写真

KAZ様

すみません、もう一点お願いいたします。

> ibdファイルは定期的にalter tableかけないと肥大化し続けます。
> ibdファイルはデータファイルではなくindexファイルですからデータを削除してもibdは小さくなりません。

ヒストリ365/トレンド365
 を
ヒストリ1/トレンド0
に変更したとしても、肥大化し続ける旨、承知いたしました。
多少、肥大化の進行を遅らせることができる考えていたのですが、
それも変わらずでしょうか。

どうぞよろしくお願いいたします。

ユーザー KAZ の写真

shin19さん


それも変わらずでしょうか。

fripperさんの指摘通りです。
変わりません。

ユーザー fripper の写真

パーティショニング機能を利用した場合には、ibd ファイルを時系列的に別のデータファイルとすることができ
古くなったファイルを、内部的に drop する動作となりますので、肥大化を抑えることができます

しかし、保持期間を短くするだけの場合、KAZ さんのおっしゃるとおり、同一ファイルの末尾へどんどんと
追記されてしまう(deleteされたデータが格納されていたファイル領域は再利用されない)ので
定期的に alter table xxxx engine=innodb 等のコマンドで、ibd ファイルを再構築してあげる必要が
出てきてしまいます

残念ながら、パーティショニングもしくは、alter による定期的なデータファイルの再構築なしに
肥大化を抑えることはできないのが現状の模様です‥

拙著ですが‥以下、ご参考まで。
http://www.rack.sh/zabbix-partitioning-1/
http://www.rack.sh/zabbix-partitioning-2/

ユーザー KAZ の写真

fripperさん

フォローありがとうございます。m(__)m

ユーザー shin19 の写真

KAZ様、fripper様

ご回答頂き、ありがとうございます。

やはり私の考えていたやり方では肥大化を抑えることができないということですね。
運用上は対策として定期的にalter tableが必要な旨、理解致しました。

今回は以下の対応で様子を見たいと思います。

 (1)history_uintテーブルのdrop -> create (alter tableが失敗するので作り直し)
 (2)ディスク増設 (念のため)
 (3)定期的にalter table (cronで週一回実施)

色々とご教示頂き、ありがとうございました。
頂いた、アドバイス、URL、大変勉強になりました。
今後ともよろしくお願い申し上げます。

ユーザー hellozabbix の写真

参考にさせていただきます。