2021年9月4日土曜日

ZabbixのHousekeepingの仕組みと手動による実行手順

Zabbixでは保存期間を超過したアイテムのヒストリ・トレンドや障害イベントなどのデータを定期的に自動で削除する機能が備わっており、この処理をHousekeepingと呼ぶ

本記事では、ZabbixのHousekeepingの動作に関する調査結果と、手動でHousekeepingを実行する手順について記載する。

環境

  • OS : CentOS 8.1
  • Zabbix : 5.0.8

Housekeepingの実行間隔と1回あたりの削除の上限数

Housekeepingに関するパラメータは/etc/zabbix/zabbix_server.confに以下の2つが存在する。

HousekeepingFrequency

HousekeepingFrequencyは、Housekeepingの実行間隔となる。0は定期実行の無効化となり、1~24時間の間で設定が可能となる。通常はデフォルト値となる1時間毎の設定で問題ないだろう。

HousekeepingFrequency=1

MaxHousekeeperDelete

MaxHousekeeperDeleteは、各ヒストリやイベント単位で設けられる削除データ数の上限数となる。0に設定すると無制限で対象となるすべてのデータの削除を行う。デフォルトは5,000件で設定されており、たとえ1秒間隔でデータ取得を行うアイテムがあったとしても1時間あたり3,600件となることから、削除が追い付く計算となる。

MaxHousekeeperDelete=5000

もし、1時間で5,000件以上の大量のアイテムなどのデータが登録されるような環境ではHousekeepingの処理が追い付かないため、本設定のチューニング (最大1,000,000件まで設定可能) をする必要がある。

Housekeepingはデータを徐々に削除する

ZabbixのHousekeepingは、削除対象のデータを徐々に削除する仕様となっており、削除処理に伴うデータベースへの負荷を抑えるよう動作する。具体的には、削除対象のデータの最も古いデータの時間からHousekeepingFrequencyの時間の4倍の時間 (1時間毎であれば4時間) に存在するデータを削除対象とする

定期的にHousekeepingを実行している場合は、本処理を意識する必要はないが、データの保存期間を途中で短くした場合には、データが一度では削除されず徐々に消される動作となるため注意が必要となる。

なお、データの保存期間の設定は、ZabbixのGUIにて「管理」→「一般設定」→「データの保存期間」にて設定が可能となる。

このHousekeepingの動作については、以下サイトで詳細に解説されている。

Housekeepingを手動で実行する

このようにHousekeepingが徐々に削除される仕様があるが、場合によっては時間を待たずにデータを消したい場合がある。そのような場合は、コマンドにて直接Housekeepingを実行すればい。

# zabbix_server -R housekeeper_execute
zabbix_server [9056]: command sent successfully

実行結果は、/var/log/zabbix/zabbix_server.logに出力される。手動実行の場合のみforced execution of the housekeeperというメッセージが表示される。

# tail -10 /var/log/zabbix/zabbix_server.log | grep house
  1816:20210216:200333.918 executing housekeeper
  1816:20210216:200335.168 housekeeper [deleted 64354 hist/trends, 0 items/triggers, 0 events, 0 problems, 0 sessions, 0 alarms, 0 audit, 0 records in 1.248852 sec, idle for 1 hour(s)]
  1816:20210216:201236.878 forced execution of the housekeeper
  1816:20210216:201236.878 executing housekeeper
  1816:20210216:201237.695 housekeeper [deleted 9750 hist/trends, 0 items/triggers, 0 events, 0 problems, 0 sessions, 0 alarms, 0 audit, 0 records in 0.816834 sec, idle for 1 hour(s)]

1回実行しただけでは、最も古いデータから4時間分しか削除されないため、for文を使って繰り返し実行させる。例えば、以下は600回のHousekeepingを実行し、少なくとも100日分のデータ (4時間 x 600回 = 100日) を削除する例となる。なお、以下コマンドでは負荷を抑えるため、sleepによる実行間隔の調整を実施している (以下のコマンドでは0.5秒で設定している)。

# for i in {1..600}; do zabbix_server -R housekeeper_execute > /dev/null 2>&1; sleep 0.5; done

参考

0 件のコメント:

コメントを投稿

人気の投稿