Поднимаем сервер мониторинга Zabbix 7 + TimescaleDB в docker
Приветствую!

В данной инструкции мы с вами развернем популярную систему мониторинга Zabbix с использованием TimescaleDB — плагина для БД PostgreSQL, позволяющего эффективно работать с «временнЫми рядам». Все это добро мы завернем внутрь docker контейнеров 🐳. Будет интересно 😉.

Напомню, что в одной из прошлых заметок мы обсуждали, что такое системы мониторинга в IT, какие виды бывают и немного узнали о популярных реализациях на сегодняшний день, среди которых — Zabbix.

Сразу прошу обратить внимание на то, что все действия описанные в данном руководстве вы делаете на свой риск и ответственность. Мой блог – лишь площадка, где я рассказываю про свой опыт и делюсь своим мнением по каким-либо вещам и явлениям. Спасибо за понимание.

Иван Чёрный

Введение

Особенностью инсталяции, описываемой в этой статье является не только развертывание системы мониторинга Zabbix в docker контейнерах, но и использование ее в связке с базой данных временных рядов — TimescaleDB.

Прежде чем мы начнем, давайте дадим несколько определений в качестве введения.

Zabbix — это открытая платформа для мониторинга сетей и серверов. Для хранения данных использует реляционные СУБД, например: PostgreSQL, MySQL, MariaDB, Oracle, SQLite и т.д.

Временные ряды в базах данных (time series) — это набор данных, упорядоченных по времени, где значения регистрируются через равные или неравные интервалы времени.

Базы данных временных рядов (time series database) — это специализированные базы данных, предназначенные для эффективного хранения, управления и анализа временных рядов. Часто это no sql базы данных.

TimescaleDB (TSDB) — это расширение для PostgreSQL, которое оптимизирует работу с временными рядами в данной СУБД, сохраняя при этом всю мощь и гибкость классических SQL like баз данных. С определенного времени Zabbix научился работать с данной СУБД.

Цитата из официальной документации Zabbix:

Zabbix supports TimescaleDB, a PostgreSQL-based database solution of automatically partitioning data into time-based chunks to support faster performance at scale.

Zabbix.com

Для лучшего понимания причины выбора именно такой связки, рекомендую статью на Habr: Zabbix, временные ряды и TimescaleDB.

Прошу вас также обратить внимание на предупреждение из оф. документации Zabbix:

Warning: Currently, TimescaleDB is not supported by Zabbix proxy.

Zabbix.com 09.2024

Уверен, что в будущем это поправят. А пока хватит трепа, переходим к делу🤵‍♂️.

Подготовка

Разворачивать Zabbix будем в среде дистрибутива Debian 12 💿 с установленным Docker engine 🐳. Если у вас еще нет готового Linux сервера, то рекомендую мои предыдущие статьи:

Также для дальнейшей работы нам понадобится пользователь с правами root.

Эй, данная статья является частью цикла о построении своей инфраструктуры. Предыдущие статьи:

А вот схема, с учетом добавления на нее сервера мониторинга:

Установка необходимых утилит

Сегодня нам понадобятся утилиты для взаимодействия с веб. Открываем терминал и устанавливаем систему контроля версий git и утилиту curl:

BASH
sudo apt update && sudo apt install -y git curl
Нажмите, чтобы развернуть и увидеть больше

Скачивание файлов проекта

Все файлы проекта находятся в моем репозитории на GitHub. Клонируем его с помощью установленной ранее утилиты git по пути /opt/zabbix:

BASH
sudo git clone https://github.com/r4ven-me/zabbix /opt/zabbix
Нажмите, чтобы развернуть и увидеть больше

При необходимости, отредактируйте блок deploy у нужных сервисов в файле docker-compose.yml, в зависимости от серверных ресурсов, которыми располагаете. По умолчанию используются самые минимальные значения.

Создание сервисного пользователя zabbix

В целях безопасности создаем ограниченные в правах группу и сервисного пользователя для запуска контейнеров zabbix:

BASH
sudo addgroup --system --gid 1995 zabbix

sudo adduser --system --gecos "Zabbix monitoring system" \
    --disabled-password --uid 1997 --ingroup zabbix  \
    --shell /sbin/nologin --home /opt/zabbix/zabbix_data zabbix
Нажмите, чтобы развернуть и увидеть больше

Создание сервисного пользователя postgres

Теперь аналогичным образом создаем группу и пользователя для запуска контейнера TimescaleDB:

BASH
sudo addgroup --system --gid 70 postgres

sudo adduser --system --gecos "PostgreSQL database" \
    --disabled-password --uid 70 --ingroup postgres  \
    --shell /sbin/nologin --home /opt/zabbix/postgres_data postgres
Нажмите, чтобы развернуть и увидеть больше

Проверяем наличие всех нужных файлов и папок:

BASH
ls -l /opt/zabbix
Нажмите, чтобы развернуть и увидеть больше

Отлично, идем дальше 🚶.

Создание пароля для базы данных Postgres

По умолчанию в файле /opt/zabbix/env/.POSTGRES_PASSWORD я задал для БД zabbix одноименный пароль. Но крайне рекомендую сгенерировать новый, например такой командой:

BASH
tr -cd "[:alnum:]" < /dev/urandom | head -c 30 \
    | sudo tee /opt/zabbix/env/.POSTGRES_PASSWORD
Нажмите, чтобы развернуть и увидеть больше

Не обращайте внимания на символ % в конце строки моего примера. Это особенность командной оболочки ZSH, которая выводит его (или # для root) при отсутствии символа перевода строки.

Запуск Zabbix стека с помощью docker compose

Старт Postgres сервера

Первым запускаем сервер СУБД, такой командой:

BASH
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d postgres-server
Нажмите, чтобы развернуть и увидеть больше

После загрузки образа и запуска контейнера смотрим его вывод:

BASH
sudo docker logs -f postgres-server
Нажмите, чтобы развернуть и увидеть больше

При успешном запуске, вы увидите подобное:

При первом старте, внутри контейнера выполняются скрипты подготовки окружения и базовой конфигурации СУБД в зависимости от параметров сервера. В одном из моих тестов такой скрипт выставлял параметр max_connections равным 25 — чего недостаточно даже для импорта схемы БД zabbix и процесс выпадет в ошибку:

BASH
FATAL:  sorry, too many clients already
Нажмите, чтобы развернуть и увидеть больше

Проверить значение max_connections можно такой командой:

BASH
sudo grep 'max_connections' /opt/zabbix/postgres_data/postgresql.conf
Нажмите, чтобы развернуть и увидеть больше

Если у вас <=25, то этот параметр необходимо увеличить. Открываем файл на редактирование любым консольным редактором, например, Vim/Neovim 😎:

BASH
sudo vim /opt/zabbix/postgres_data/postgresql.conf
Нажмите, чтобы развернуть и увидеть больше

Находим там строку:

PLAINTEXT
max_connections = 25
Нажмите, чтобы развернуть и увидеть больше

И меняем ее, например, на:

PLAINTEXT
max_connections = 200
Нажмите, чтобы развернуть и увидеть больше

Сохраняем файл, выходим из редактора.

Для применения изменений перезапускаем контейнер postgres-server и проверяем текущее значение max_connections:

BASH
sudo docker compose -f /opt/zabbix/docker-compose.yml restart postgres-server

sudo docker exec -it postgres-server psql -U zabbix -c "SHOW max_connections;"
Нажмите, чтобы развернуть и увидеть больше

Все применилось, переходим к запуску контейнера zabbix-server.

Старт Zabbix сервера

Запускаем его такой командой:

BASH
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d zabbix-server
Нажмите, чтобы развернуть и увидеть больше

Смотрим вывод контейнера:

BASH
sudo docker logs -f zabbix-server
Нажмите, чтобы развернуть и увидеть больше

При первом запуске, котейнер запустит создание базы. Это займет некоторое время. Вывод остановится на такой строке:

PLAINTEXT
Creating 'zabbix' schema in PostgreSQL
Нажмите, чтобы развернуть и увидеть больше

Обязательно дождитесь завершения процедуры создания БД!

При успешном запуске вы должны увидеть что-то подобное:

Возможно в самом конце будет вывод, подобный этому:

PLAINTEXT
256:20240922:121849.602 Zabbix agent item "system.cpu.util[,system]" on host "Zabbix server" failed: first network error, wait for 15 seconds
225:20240922:121855.944 item "Zabbix server:zabbix[vmware,buffer,pused]" became not supported: No "vmware collector" processes started.
225:20240922:121858.958 item "Zabbix server:zabbix[process,report writer,avg,busy]" became not supported: No "report writer" processes started.
225:20240922:121859.962 item "Zabbix server:zabbix[process,report manager,avg,busy]" became not supported: No "report manager" processes started.
256:20240922:121904.599 Zabbix agent item "system.users.num" on host "Zabbix server" failed: another network error, wait for 15 seconds
256:20240922:121919.602 Zabbix agent item "system.cpu.load[all,avg5]" on host "Zabbix server" failed: another network error, wait for 15 seconds
225:20240922:121928.010 item "Zabbix server:zabbix[connector_queue]" became not supported: connector is not initialized: please check "StartConnectors" configuration parameter
225:20240922:121929.016 item "Zabbix server:zabbix[process,connector manager,avg,busy]" became not supported: No "connector manager" processes started.
225:20240922:121930.021 item "Zabbix server:zabbix[process,connector worker,avg,busy]" became not supported: No "connector worker" processes started.
256:20240922:121934.600 temporarily disabling Zabbix agent checks on host "Zabbix server": interface unavailable
Нажмите, чтобы развернуть и увидеть больше

Не обращаем на него внимания.

Проверяем статус запущенных контейнеров:

BASH
sudo docker ps
Нажмите, чтобы развернуть и увидеть больше

Все ок — идем дальше.

Создание схемы для TimescaleDB

Выводим созданный ранее пароль в терминал, скоро он нам понадобится. Затем подключаемся к оболочке контейнера zabbix-server:

BASH
sudo cat /opt/zabbix/env/.POSTGRES_PASSWORD

sudo docker exec -it zabbix-server bash
Нажмите, чтобы развернуть и увидеть больше

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

BASH
psql -h postgres-server -U zabbix zabbix < /usr/share/doc/zabbix-server-postgresql/timescaledb.sql
Нажмите, чтобы развернуть и увидеть больше

Процесс импорта представляет собой простое перенаправление содержимого SQL скрипта на вводе команды подключения к БД с помощью psql.

Вывод должен быть таким:

Выходим из контейнера zabbix-server и проверяем наличие информации о чанках (chunks) в Postgres:

BASH
exit

sudo docker exec -it postgres-server \
    psql -U zabbix -c "SELECT * FROM chunks_detailed_size('history')"
Нажмите, чтобы развернуть и увидеть больше

Если вывод у вас такой же, как на скрине выше, то все импортировалось успешно 🥳.

На этом этапе БД Postgres/TimesacleDB и Zabbix сервер готовы 😉.

Старт всего стека TimesacleDB + Zabbix server + Zabbix web + Zabbix agent

Останавливаем запущенные контейнеры и запускаем всю инсталляцию, включая Zabbix web и Zabbix agent:

BASH
sudo docker compose -f /opt/zabbix/docker-compose.yml down

sudo docker compose -f /opt/zabbix/docker-compose.yml up -d
Нажмите, чтобы развернуть и увидеть больше

Проверяем все ли контейнеры запустились корректно:

BASH
sudo docker ps

sudo docker compose -f /opt/zabbix/docker-compose.yml logs -f
Нажмите, чтобы развернуть и увидеть больше

Отлично. Теперь проверим работу самого Zabbix:

BASH
curl -I http://localhost:8080

nc -zv localhost 10051

ss -tulnap | grep -E '8080|10051'
Нажмите, чтобы развернуть и увидеть больше

Первой командой мы проверили доступность веб интерфейса из консоли, второй — доступность порта zabbix-server, а третьей вывели порты, прослушиваемые хостовой ОС.

Отлично, все работает 🎉🎉🎉.

Доступ к веб интерфейсу Zabbix

Способ получения доступа к веб интерфейсу Zabbix зависит от условий, в которых вы разворачивали стек. Я опишу несколько очевидных вариантов.

Для авторизации в веб интерфейсе используйте стандартные логин: Admin и пароль: zabbix

Если вы увидели такое:

Мои поздравления 😎! Zabbix сервер с TimescaleDB поднят и готов к работе 👷‍♂️.

Опционально

Ниже приведены необязательные, но рекомендованные шаги инструкции 😉.

Минимальная начальная настройка Zabbix сервера

Настройка автозапуска Zabbix стека с systemd

Установка и запуск Zabbix agent в docker на удаленном хосте

Настройка отправки уведомлений Zabbix в Telegram с графиком

Заключение

Фух..🤯 это была не самая простая статья. Особенно по объему перелопаченной информации. Но, мне кажется, оно того стоило. В итоге мы получили гибкий и легко переносимый проект системы мониторинга, работающий внутри docker контейнеров. А также мы настроили лаконичные, но информативные уведомления с графиками в Telegram, чтобы всегда быть в курсе состояния нашей инфраструктуры.

Хочется также отметить великолепную работу разработчиков Zabbix. В частности, актуальность и разнообразие docker образов и доступность файлов их сборки. После написания этой статьи, я их зауважал еще больше 👍.

Спасибо, что читаете 😊. Если возникли вопросы — приглашаю вас в Вороний чат, как вы догадались, в телеге 😅. У нас там дружное сообщество 🚶‍♀️🐧🚶🐧🚶‍♂️🐧. И обязательно подписывайтесь на основной телеграм канал: @r4ven_me, чтобы не пропустить публикации новых материалов на сайте.

Желаю успехов и нападающего прода! 😌

Используемые материалы

Комментарии

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/monitoring/podnimaem-server-monitoringa-zabbix-7-timescaledb-v-docker/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша