zabbix housekeeper
История "рационализации и утилизации" housekeeper'а zabbix'а на pgsql.
Суть проблемы: заббикс хранит историю значений в нескольких больших таблицах, которые могут разрастаться до неприличных размеров. Поэтому эти таблицы нужно периодически чистить от старых данных. Заббикс может делать это и сам, там этот процесс называется "housekeeping".
По мере роста размера истории возникает дилемма: если базу чистить - это занимает всё больше и больше времени. В какой-то момент может оказаться, что база загружена большей частью запросами чистки данных (см рис 1). Если же housekeeping выключить полностью (что, кстати, рекомендуют делать в большинстве постов на эту тему в сети) - проблема лишь откладывается на будущее и при необходимости сделать тот же reindex - вы оказываетесь в заднице. Или даунтайм на сутки, или оно будет идти в фоне пару недель, с падением производительности.
Есть конечно и третий путь - использовать партиции, но тут возникает необходимость их периодического создания/удаления, и от вышеописанного с реиндексом это никак не поможет. Кроме того, в mysql оно работает мягко скажем не слишком оптимально, а в pgsql его вообще штатно нет, и это там реализуется или через наследование таблиц или через триггер на вставку.
Однако, мои тесты показали, что есть ещё один вариант - использовать фиксированное время хранения истории. Это позволяет не отключать housekeeper, держать размер базы под контролем, сохранить её производительность и низкое время обслуживания/бэкапов.
На графики это не влияет, поскольку те строятся на основе данных из trends (кроме самых последних часов).
При этом запросы значительно упрощаются, с таких:
DELETE FROM history WHERE item_id IN
(SELECT itemid FROM history WHERE itemid = 'XXX' AND timestamp < 'YYY' LIMIT 'ZZZ');
-- пишу по памяти, могут быть неточности
до таких:
DELETE FROM history WHERE item_id = 'XXX' AND timestamp < 'YYY';
Ещё одна засада, о которой я уже мельком упоминал - это одновременная работа чистки данных и autovacuum'а, поскольку первое вызывает срабатывание второго. В результате - производительность базы проседает больше, чем ожидалось.
А теперь - слайды!
На графике ниже можно видеть момент полной чистки истории (с 09.10), реиндекс остального (с 10.10), включения housekeeper'а (12.10) и постепенная деградация производительности базы по мере роста объёма истории (до 02.11). График с 04.10 и до 09.10 показывает типовую нагрузку на базу при отключенной чистке истории. Пики в конце дня - это бэкап.
Этот же график, но продлённый ещё на две недели. Здесь можно видеть момент изменения политики хранения истории на фиксированный период (со 02.11 и далее). Обратите внимание на увеличение частоты пиков загрузки относительно начала графика на рис. 1: это к бэкапу добавились периодические запуски housekeeper'а.
Отрезок второго графика большего масштаба, длительностью в сутки. Чётко видно время и количество запусков чистки базы.
Ссылки
- Наиболее свежий наброс в холивар
mysql vs pgsql
применительно к заббиксу - Мониторинг 7k хостов на zabbix+mysql