Zabbix: Чистка базы данных

UPD 28.05.2018: У данной статьи есть обновление https://shurshun.ru/zabbix-optimizatsiya-i-chistka-bazyi-dannyih/

Zabbix достаточно продвинутая в плане мониторинга система со своими достоинствами и недостатками. Одним из недостатков на нагруженных системах является постепенное разрастание баз данных ввиду ограничений встроенного решения для чистки истории -housekeeper.
2016-06-10_10-44-21

Для того чтобы понять масштабы заполнения базы можно воспользоваться следующим запросом в базу:

SELECT tableName, pg_size_pretty(pg_total_relation_size(CAST(tablename as text))) as size from pg_tables where tableName not like 'sql_%' and pg_size_pretty(pg_total_relation_size(CAST(tablename as text))) like '%GB%';
  tablename   |  size
--------------+--------
 history      | 194 GB
 history_uint | 196 GB
 history_log  | 31 GB
 history_text | 35 GB
 trends       | 15 GB
 trends_uint  | 19 GB
(6 rows)

Запрос сделан под postgresql у меня фильтрация таблиц баз идет по Гигабайтам.

Первое решение проблемы — правильное выставление параметров в zabbix_server.conf

HousekeepingFrequency=24
MaxHousekeeperDelete=10500

Можно подойти более рационально и сделать напрямую через запросы в базу.

В моем случае база на postgresql и запросы выглядят следующим образом:

su postgres
psql -d zabbix

delete FROM alerts where age(to_timestamp(alerts.clock)) > interval '180 days';
delete FROM acknowledges where age(to_timestamp(acknowledges.clock)) > interval '180 days';
delete FROM events where age(to_timestamp(events.clock)) > interval '180 days';
delete FROM history where age(to_timestamp(history.clock)) > interval '365 days' ; 
delete FROM history_uint where age(to_timestamp(history_uint.clock)) > interval '365 days' ;
delete FROM history_str where age(to_timestamp(history_str.clock)) > interval '365 days' ;
delete FROM history_text where age(to_timestamp(history_text.clock)) > interval '365 days' ;
delete FROM history_log where age(to_timestamp(history_log.clock)) > interval '365 days' ;
delete FROM trends_uint where age(to_timestamp(trends_uint.clock)) > interval '365 days' ;
delete FROM trends where age(to_timestamp(trends.clock)) > interval '365 days';

Не забываем выполнить vacuumdb (Автоматическая сборка мусора (Automatic Vacuuming) в PostgreSQL)
Кроме сборки мусора (VACUUM) производится ещё и анализ (ANALYZE). Периодическое выполнение команды ANALYZE необходимо для нормального функционирования планировщика. Собранная с помощью этой команды статистика позволяет значительно ускорить выполнение SQL- запросов.

vacuumdb -U postgres --quiet --verbose --analyze --dbname=zabbix

Сборку мусора можно внести в crontab:

# crontab
# Запуск "vacuumdb" каждый день в 18:00
0 18 * * * root vacuumdb -U postgres --quiet --analyze --dbname=mydb &
Вы можете оставить комментарий ниже.