緩やかなhousekeeping【MIRACLE ZBX 2.2】
イベント削除設定の追加
Zabbix 2.2では、Housekeepingの設定が、2.0以前と比較して細かく設定が行えるようになっています。
Web UIでの、「管理」→「一般設定」から、右上のプルダウンメニューの「データの保存期間」を選択すると、Housekeepingの設定を行うことができます。
MIRACLE ZBX 2.0 での「データの保存期間」の画面
MIRACLE ZBX 2.2 での「データの保存期間」の画面
Zabbix 2.0では、アクションとイベントの保存期間の設定だけしか行えませんでしたが、Zabbix 2.2では、細かく設定が行えるようになっています。
特に、「イベントとアラート」については、eventsテーブルからデータを削除する際のソース(イベントが生成された起因)ごとの設定が行えるようになっています。
設定が反映されていない?
お客様からのお問い合わせで、『上記「イベントとアラート」の各項目の設定を行ったが実際にHouse Keeperプロセスにより削除された形跡がない』というものがありました。
テスト環境を構築しましたが問題が発生せず、ソースコードを調査を行いました。
Housekeeping処理
以下の調査は、MIRACLE ZBX-2.2.9-2でのものとなります。
Housekeeping処理の記述は、src/zabbix_server/housekeeper/housekeeper.c : void main_housekeeper_loop() から始まります。
今回は、イベントに関する削除の調査になりますので、housekeeping_events() から見ていくことにします。
748 static int housekeeping_events(int now)
749 {
750 static zbx_hk_rule_t rules[] = {
751 {"events", "source=" ZBX_STR(EVENT_SOURCE_TRIGGERS)
752 " and object=" ZBX_STR(EVENT_OBJECT_TRIGGER), 0, &hk_config.events_trigger},
753 {"events", "source=" ZBX_STR(EVENT_SOURCE_DISCOVERY)
754 " and object=" ZBX_STR(EVENT_OBJECT_DHOST), 0, &hk_config.events_discovery},
755 {"events", "source=" ZBX_STR(EVENT_SOURCE_DISCOVERY)
756 " and object=" ZBX_STR(EVENT_OBJECT_DSERVICE), 0, &hk_config.events_discovery},
757 {"events", "source=" ZBX_STR(EVENT_SOURCE_AUTO_REGISTRATION)
758 " and object=" ZBX_STR(EVENT_OBJECT_ZABBIX_ACTIVE), 0, &hk_config.events_autoreg},
759 {"events", "source=" ZBX_STR(EVENT_SOURCE_INTERNAL)
760 " and object=" ZBX_STR(EVENT_OBJECT_TRIGGER), 0, &hk_config.events_internal},
761 {"events", "source=" ZBX_STR(EVENT_SOURCE_INTERNAL)
762 " and object=" ZBX_STR(EVENT_OBJECT_ITEM), 0, &hk_config.events_internal},
763 {"events", "source=" ZBX_STR(EVENT_SOURCE_INTERNAL)
764 " and object=" ZBX_STR(EVENT_OBJECT_LLDRULE), 0, &hk_config.events_internal},
765 {NULL}
766 };
767
768 int deleted = 0;
769 zbx_hk_rule_t *rule;
770
771 if (ZBX_HK_OPTION_ENABLED != hk_config.events_mode)
772 return 0;
773
774 for (rule = rules; NULL != rule->table; rule++)
775 deleted += housekeeping_process_rule(now, rule);
776
777 return deleted;
778 }
最初に、構造体 zbx_hk_rule_t rule(配列)にて削除ルールを決定し、この配列の各要素をhousekeeping_process_rule()に渡すことで削除処理を行っています。
天下り式で申し訳ありませんが、hk_config.events_trigger, hk_config.events_discovery, hk_config.events_autoreg, hk_config.events_internal の各値は、WEB UIで設定を行った「トリガーデータの保存期間」、「ネットワークディスカバリデータの保存期間」、「自動登録データの保存期間」、「内部データの保存期間」となります。
実際の削除処理
次に実際の削除処理のアルゴリズムを見ていきます。
521 static int housekeeping_process_rule(int now, zbx_hk_rule_t *rule)
522 {
...
533 /* initialize min_clock with the oldest record timestamp from database */
534 if (0 == rule->min_clock)
535 {
...
rule->min_clock = 対象データ群の最小クロック;
544 }
545
546 /* Delete the old records from database. Don't remove more than 4 x housekeeping */
547 /* periods worth of data to prevent database stalling. */
548 keep_from = now - *rule->phistory * SEC_PER_DAY;
549 if (keep_from > rule->min_clock)
550 {
551 rule->min_clock = MIN(keep_from, rule->min_clock +
552 HK_MAX_DELETE_PERIODS * CONFIG_HOUSEKEEPING_FREQUENCY * SEC_PER_HOUR);
553
554 rc = DBexecute("delete from %s where %s%sclock<%d", rule->table, rule->filter,
555 ('\0' != *rule->filter ? " and " : ""), rule->min_clock);
...
548行目の計算で、keep_from は、「現在時刻から設定した日数分前の時刻」となります。
549行目からのブロックは、keep_fromよりrule->min_clockが小さい場合、つまり設定した日数より古いデータが存在する場合に処理が行われます。
551行目で、どこの時刻のデータまでを削除するかが計算され、keep_fromか、rule->min_clock + HK_MAX_DELETE_PERIODS * CONFIG_HOUSEKEEPING_FREQUENCY * SEC_PER_HOUR の小さい方を採用します。
そして、554行目で削除処理を行っています。
551行目の rule->min_clock + HK_MAX_DELETE_PERIODS * CONFIG_HOUSEKEEPING_FREQUENCY * SEC_PER_HOUR はどのような値なのかを考えてみます。HK_MAX_DELETE_PERIODS は、ソースコード上方で 4 と定義されています。ですので、HousekeepingFrequencyが1(時間)の場合、データの最小値から4時間大きい値となります。
データの保存期間を変更していないような定常的なケースでは、一定周期でHousekeepingが行われ、551行目の処理は、keep_fromが採用されます。
しかし、データの保存期間を小さく設定した状況を考えてみます。(例えば、365日から30日へと変更。) この場合、前者は、「30日前」、後者は「365日前+4時間」となり、後者が採用されます。そして、消されるデータは、30日前より古いものではなく、「365日前+4時間」より古いものとなり、設定したユーザの意図していないものとなります。(2.0までは、30日より前のものが初回で消されます。当然、このときの負荷は高くなります。)
ですが、1時間ごとに4時間分を削除していくことになるので、緩やかではありますが、設定した日数分には近づくというアルゴリズムにはなっています。
他の設定項目はどうなの?
上記 housekeeping_process_rule() は、他からもコールされています。ですので、「ITサービス」と「監査」に関しては、同様に緩やかに削除されることになります。