UPD 28.05.2018: У данной статьи есть обновление https://shurshun.ru/zabbix-optimizatsiya-i-chistka-bazyi-dannyih/
Zabbix достаточно продвинутая в плане мониторинга система со своими достоинствами и недостатками. Одним из недостатков на нагруженных системах является постепенное разрастание баз данных ввиду ограничений встроенного решения для чистки истории -housekeeper.
Для того чтобы понять масштабы заполнения базы можно воспользоваться следующим запросом в базу:
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 &