Аудит Zabbix: на что нужно обратить внимание

от автора

Привет! Меня зовут Антон Касимов, я руководитель Gals Software, а еще сертифицированный тренер и эксперт по Zabbix. В общем, могу сказать, что знаю эту систему чуть больше уровня «видел пару раз интерфейс». Zabbix — одна из самых популярных в мире систем мониторинга. Наверное, не существует компаний с собственной инфраструктурой, у которых не было бы Zabbix. Не так давно мы запустили услугу аудита Zabbix и обнаружили некоторые закономерности, на которые я хотел бы обратить внимание в этой статье. В нашем телеграм-канале Zabbix Recipes мы регулрно делимся нашими находками и публикуем анонсы вебинаров (скоро и по этой теме тоже будет), поэтому приглашаю присоединиться. Я построю повествование так, чтобы вы могли пройтись по статье как по чек-листу и проверить свою инсталляцию на предмет возможных улучшений. Погнали!

Состояние отдельных компонентов

Zabbix — распределенная система, поэтому первое на что я смотрю, это версит отдельных компонентов: агентов и прокси. Частая проблема — это зоопарк версий агентов. Обычно, конечные серверы находятся под управлением администраторов отдельных систем и прямого доступа у администраторов Zabbix к ним нет, а следовательно, и возможности систематического применения обновлений. Ключ agent.version возвращает текущую версию агента. Зайдите в Latest data, настройте фильтр по этому ключу и посмотрите какие версии агентов присутствуют в вашем окружении. Вероятно, вы будете удивлены. Устаревшая версия агента может быть проблемой, если вы обновляете шаблоны вместе с обновлением Zabbix сервера: некоторые ключи могут не поддерживаться старыми версиями агентов. Например, параметр `HeartbeatFrequency`, который управляет периодичностью отправки heartbeat-сообщений на сервер появился только в версии 6.4. Балансировка нагрузки агентов между группами прокси появилась начиная с 7 версии. Не обновляя версии агентов вы лишаетесь возможности использования этого функционала.

Задержка с обновлением Zabbix-прокси более редкая проблема, однако, тоже встречается. Начиная с версии 6.4 обновления конфигурации начали выполняться 1 раз в 10 секунд и инкрементально. До этой версии обновления конфигурации происходили по умолчанию 1 раз в 1 минуту и полностью. Запрос конфигурации считается одним из самых тяжелых SQL-запросов в базу. А с 7 версии появился функционал отказоустойчивости и выскокой доступности прокси. Соответственно, обновившись, вы получаете и то и другое.

Отсутствие шифрования — еще один момент, на который я обращаю внимание. Между компонентами Zabbix часто передается чувствительная информация (логины/пароли) и шифрование лишним также не будет. То же самое касается и шифрования между фронтэндом, сервером и базой данных. Безопасники не приедут за вами на УАЗике, а вместо этого скажут вам спасибо.

Одна из частых ошибок настрок конфигурации агентов — параметр AllowKey=system.run[*]. Это критически небезопасная настройка, т.к. позволяет выполнять произвольные команды через агент. Если нужно выполнять какие-то скрипты через ключ system.run[*], разрешите выполнения конкретной команды.

Состояние базы данных

Многое зависит от того, какую СУБД вы используете. Например, с версии 7.2 в Zabbix пропала официальная поддержка Oracle. До этого вы могли обеспечить поддержку, собрав компоненты из исходников. Если же используете MySQL/MariaDB обратите внимание на то, что ваша СУБД имеет настройки партиционирования исторических таблиц (history, history_uint и остальных). В этом случае вы отключаете встроенных хаускипинг и удаляете старые партиции при помощи скрипта в кроне. Если используете PostgreSQL с TimescaleDB на борту, то хаускипинг нужно оставить включенным — удаление чанков поддерживается из коробки.

Непрерывный рост размера БД

Непрерывный рост размера БД

Для случая с PostgreSQL приведу небольшой разбор конфигурации, чтобы было понятно на что обратить внимание. Я не DBA, поэтому заранее прошу простить за возможную корявость формулировок.

max_connections — важный параметр, определяющий максимальное количество подключений к БД. Кажется, что подключений много не бывает, но это не всегда так. Слишком высокий лимит часто ухудшает производительность из-за конкуренции за CPU, память и контекстных переключений. Если нет внешнего пула соединений, это может стать источником проблем. Рекомендую прикрутить PgBouncer в режиме transaction pooling в качестве внешнего пула для возможности снижения значения этого параметра.

shared_buffers — параметр конфигурации, который определяет объем памяти (RAM), выделяемый серверу для кэширования данных. Хорошая практика — 25% от общего объема RAM на сервере.

effective_cache_size — это сколько данных в сумме вы сможете удержать в памяти, если сложить shared_buffers и кэш операционной системы. Рекомендация — 50% – 75% от общего объема RAM.

Пример: если на сервере 16 ГБ RAM, то shared_buffers можно выставить в 4 ГБ, а effective_cache_size в 12 ГБ.

work_mem — память на одну операцию сортировки/хеша (не на сессию). Напрямую связан max_connections. Поэтому увеличивать безопасно этот параметр можно при условии снижения `max_connections` при условии подключения того же PgBouncer, к примеру.

Можно рассмотреть вариант добавление параметра архивирования WAL-сегментов archive_command = 'test ! -f /pgarchlog/%f && cp %p /pgarchlog/%f.part && mv /pgarchlog/%f.part /pgarchlog/%f', который сначала копирует WAL во временный файл, потом атомарно переименовывает. Использовать совместно с archive_mode = always.

autovacuum_max_workers и autovacuum_work_mem — количество воркеров автовакуума и память на autovacuum. Рекомендую обращать на эти параметры внимание.

wal_compression = on — настройка, которая сжимает full-page writes, что уменьшает интенсивность записи на диск.

Базу данных использует множество процессов Zabbix сервер, а также фронтэнд. Следовательно, важно постоянно отслеживать самочувствие СУБД. Один из наших клиентов столкнулся с проблемой периодической утилизации в 100% одного из DBSyncer, при этом остальные чувствовали себя хорошо. Оказалось, что один из коллег регулярно запрашивал через API большие объемы исторических данных. Удалось выяснить путем продвинутого логирования на nginx-сервере. Не забывайте, что вы можете повышать уровень логирования отдельных процессов Zabbix сервера для точечной диагностики.

И еще одно немаловажное замечание: сделайте отдельные учетки в БД для Zabbix сервер и фронтэнда. Когда-нибудь это поможет вам быстрее диагностировать проблему.

Рекомендации по снижению объема данных в БД

1. Включить троттлинг (throttling)

Троттлинг — это возможность пропуска одинаковых значений. То есть если значение метрики не изменилось, оно не записывается хранилище и, соответственно, не занимает место на диске.

Где искать: в правилах препроцессинга.

В Zabbix возможна настройка троттлинга двух видов:

Discard unchanged — игнор повторяющихся значений. В этом случае график будет пустым, если метрика не меняется.

Discard unchanged with heartbeat — игнор повторяющихся значений, но с регулярной проверкой жива ли метрика. На графике будут значения. Этот параметр препроцессинга требует ввода периода проверки. Если данные собираются раз в секунду, а интервал задан одной минутой, то Zabbix превратит ежесекундный поток значений в ежеминутный поток.

2. Настроить переменное значение периода сбора данных

Любой элемент данных можно собирать с разной периодичностью (или вообще не собирать) в зависимости от времени суток, дня недели или дня месяца. Примеры эпизодического сбора:

wd1-5h9 — каждый день с понедельника по пятницу в 9:00.

h9m/30;h11 — каждый день в 9:00, 9:30, 10:00, 10:30, 11:00.

h9-10m10-40/30 — каждый день в 9:10, 9:40, 10:10, 10:40.

md1wd1h9m30 — каждый первый день месяца в 9:30 если это понедельник.

Где искать: в настройках элементов данных (items), раздел пользовательский интервал (custom interval).

3. Удалять значение исходного элемента данных для зависимых элементов данных

Простой пример: вы выполняете команду, которая возвращает набор данных, которые вы потом распознаёте при помощи зависимых метрик. Нет никакого смысла хранить эти данные. тем более если это большой текстовый блок.

Где искать: в настройках элементов данных, раздел период хранения истории. Установить значение в «не хранить».

Состояние Nginx

По возможности включайте http2. Т.е. вместо listen 443 ssl; нужно указывать listen 443 ssl http2;. Интерфейс Zabbix грузит CSS, JS, шрифты, изображения, а HTTP/2 обычно уменьшает задержки и улучшает загрузку страницы.

И, если еще не включили, можно активировать сжатие путем добавления gzip on;.

Общие рекомендации по настройке параметров Zabbix сервера

Zabbix состоит и внушительного набора процессов и кэшей. Важно не выкручивать эти параметры сильно с запасом, а действовать последовательно. Общая рекомендация — повышать, когда утилизация достигает 60-70%. В процессе аудита мы обычно смотрим на текущую утилизацию каждого компонента и на общий тренд. Общего совета по количеству или объему нет, все сугубо индивидуально.

Еще бы стоило обратить внимание на обновления в минорных версиях. Не стоит их недооценивать. Например, начиная с версий 7.0.17 / 7.4.2 предобработка изменилась настолько, что теперь элементы, которым не требуется предобработка не помещаются в очередь этой самой предобработки. Ранее они туда помещались и просто пролетали без изменений. Да и вообще, хорошая практика иногда заглядывать в заметки к релизам. Вдруг, что-то интересное найдете.

Рекомендация по обновлению шаблонов (классика). Каскад обновлений с версии на версию может привести к тому, что в системе остаются связанные шаблоны. Это наследие предыдущих версий Zabbix, которое сам Zabbix полностью выпилил начиная с 7 версии. Больше никаких связанных шаблонов. Зависимости добавляют сложностей при обновлении шаблонов, а также при обновлении настроек при условии, что данный шаблон может быть привязан к другим шаблонам. Общая рекомендация — избавиться от зависимых шаблонов и сделать структуру плоской.

Еще одна рекомендация — отслеживать количество неподдерживаемых элементов, чтобы оно как минимум не росло, а как максимум постоянно снижалось.

Рост количества неподдерживаемых элементов

Рост количества неподдерживаемых элементов

Проверьте интервалы выполнения правил LLD. Для большинства правил выполнение даже 1 раз в час, чересчур избыточно. Бывает, правила обновляются 1 раз в 1 минуту. Вряд вы настолько часто подключаете новые файловые системы к серверу. Правила обнаружения генерируют дополнительную нагрузку, чрезмерно частое их выполнение не рекомендуется. Для определения часто выполняющихся LLD-правил, выполните SQL-запрос, который вернет список правил с указанием интервалов их выполнения.

Критичная и большая проблема с шумящими триггерами. Загляните в отчет `Top 100 triggers`, где, возможно, вы обнаружите множественные срабатывания, по которым нет реакции пользователей (никто эти события не принимал и по ним не было оповещений). Рекомендация — отключить триггеры, на которые не предполагается реакция пользователя. Также рекомендую проводить регулярный аудит событий в Zabbix на предмет поиска событий без реакции пользователей. 1 раза в месяц будет достаточно.

Еще одна частая ошибка настроек триггеров — отсутствие условий восстановления. Отсутствие Recovery Expression приводит к флаппингу триггеров — частому переходу из одного состояния в другое. Для часто срабатывающих триггеров рекомендуется выполнить эту настройку. Общий принцип настройки: событие по триггеру закрывается в момент, когда поведение метрики стабилизировалось на стабильно неаварийном значении.

Обращайте внимание на правила оповещений, которые ссылаются на удаленные объекты (триггеры, хосты, элементы данных). В версиях Zabbix до 7.0.10 происходила автоматическая деактивация таких действий. Начиная с 7.0.10 такие действия не отключаются, а вместо этого около них появляется оранжевая иконка с предупреждением, что действие ссылается на удаленные объекты.

Предупреждение об отсутствии объектов в действии

Предупреждение об отсутствии объектов в действии

Мы рассмотрели основные моменты, на которые нужно обращать внимание, но основную фактуру вы сможете получить, просмотрев графики производительности компонентов Zabbix. Вот список шаблонов, которые должны обязательно присутствовать в настроенном состоянии в вашей инсталляции Zabbix: Zabbix server health, Zabbix proxy health, PostgreSQL by Zabbix agent 2 или MySQL by Zabbix agent 2, Nginx by HTTP или Apache by HTTP, PHP-FPM by HTTP, Linux by Zabbix agent или Linux by Zabbix agent active.

Спасибо за внимание, надеюсь, было полезно. В комментариях приглашаю вас поделиться своими лайфхаками по выявлению недостатков конфигурации. В ближайшее время планирую провести вебинар на эту тему, подписывайтесь на канал Zabbix Recipes, чтобы не пропустить анонс.

ссылка на оригинал статьи https://habr.com/ru/articles/1030906/