Всем привет! Мы делаем проекты по Zabbix, накопили большую экспертизу и решили сделать переводы нескольких статей, которые нам показались интересными и полезными. Наверняка, будут полезны и вам. Также своим опытом делимся в телеграм-канале zabbix_ru, где вы можете найти полезные материалы и записи наших вебинаров, опубликованных на нашем ютуб-канале (прим. переводчика). Ниже ссылки на предыдущие статьи из цикла.
Миграция с MySQL на PostgreSQL
SELinux: интеграция с Zabbix и другими инструментами
Защита от ложных срабатываний триггеров в Zabbix с использованием функций min/max/avg
Zabbix – автоматизация управления пользователями (JIT)
Zabbix — это надежное решение с открытым исходным кодом для мониторинга ИТ-инфраструктуры, позволяющее отслеживать и анализировать производительность сети, серверов, приложений и других компонентов. По мере роста объема данных эффективное управление временными рядами становится ключевым фактором. Поэтому, начиная с версии 5.0, Zabbix начал поддерживать TimescaleDB — расширение PostgreSQL, оптимизированное для временных рядов. В этой статье рассматриваются преимущества использования TimescaleDB в Zabbix, ключевые таблицы и процесс установки.
Преимущества TimescaleDB в Zabbix
TimescaleDB обеспечивает Zabbix ряд существенных преимуществ, повышая производительность и эффективность при работе с большими объемами временных рядов данных:
Масштабируемость и производительность: TimescaleDB разработан для эффективного управления большими объёмами данных временных рядов. Благодаря архитектуре гипертаблиц он обеспечивает быструю запись и чтение данных, что критически важно для систем мониторинга, таких как Zabbix, которые генерируют огромные объёмы метрик.
Сжатие данных: TimescaleDB позволяет сжимать исторические данные, снижая требования к объёму хранилища и потенциально обеспечивая экономию места на диске до 90%. Однако сжатие предотвращает изменение уже сжатых данных; для любого изменения данные необходимо сначала распаковать, изменить, а затем повторно сжать.
Простота управления: TimescaleDB полностью совместима с PostgreSQL, поэтому администраторы, знакомые с PostgreSQL, также смогут легко работать с TimescaleDB. Реализация проста и минимизирует накладные расходы на управление базой данных. Более того, некоторые настройки TimescaleDB можно настроить непосредственно в панели администрирования Zabbix, в разделе «Administration > Housekeeping».
Таблицы в Zabbix, использующие TimescaleDB
Zabbix использует TimescaleDB для хранения большого объёма данных временных рядов, разделённых на несколько ключевых таблиц. Для эффективности и управляемости этого процесса используется специальная структура, называемая гипертаблицей, предназначенная для работы с данными временных рядов в TimescaleDB. Для упрощения преобразования существующих таблиц в гипертаблицы и оптимизации управления этими данными файл /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql содержит необходимые команды. Этот скрипт автоматизирует преобразование ключевых таблиц Zabbix в гипертаблицы, обеспечивая эффективную обработку больших объёмов данных.
Примечание: Начиная с версии Zabbix 7.2, скрипт schema.sql для TimescaleDB находится по следующему пути: /usr/share/zabbix/sql-scripts/postgresql/timescaledb/schema.sql.
Каждая команда в скрипте использует функцию create_hypertable, которая критически важна для преобразования обычных таблиц PostgreSQL в гипертаблицы. Гипертаблицы работают, автоматически распределяя данные по более мелким подтаблицам, называемым фрагментами. Такое разделение обеспечивает эффективные запросы и хранение данных, что крайне важно для быстрого доступа к большим объёмам временных рядов. Процесс преобразования таблиц в гипертаблицы включает в себя несколько важных параметров:
Имя таблицы (например,
'history_text'): Указывает, какая таблица будет преобразована в гипертаблицу. В случаеhistory_textтаблицы она содержит текстовые данные, такие как сообщения и журналы, отслеживаемые в Zabbix.Столбец времени (например,
'clock'): этот параметр определяет столбец с временными метками, необходимыми для разделения данных на отдельные фрагменты. В'clock'столбце указывается время записи данных, что позволяет правильно их разбить на разделы и сортировать.chunk_time_interval(например,86400): этот параметр определяет временной интервал в секундах для отдельных фрагментов. Значение в86400секундах соответствует одному дню. Это означает, что все данные, собранные за один день, будут сохранены в одном фрагменте. Этот интервал можно настроить в соответствии с требованиями к производительности и объёмом обрабатываемых данных.migrate_data(например,true): если этому параметру присвоено значениеtrue, все существующие данные в таблице автоматически переносятся в новую структуру фрагментов. Эта функция критически важна при преобразовании существующих таблиц в гипертаблицы для предотвращения потери данных.if_not_exists(например,true): этот параметр гарантирует, что если гипертаблица уже существует, команда не будет создавать её заново, предотвращая возможные ошибки и потерю данных. Если гипертаблица ещё не существует, она будет создана заново.
Использование этих настроек TimescaleDB обеспечивает эффективное управление и доступ к большим объёмам данных временных рядов, что крайне важно для таких систем, как Zabbix, которые генерируют и анализируют большие объёмы метрик. Ниже перечислены ключевые таблицы, преобразованные в гипертаблицы для повышения производительности и эффективности:
history: Хранит числовые данные с плавающей запятой.
PERFORM create_hypertable('history', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
history_uint: Сохраняет целочисленные значения.
PERFORM create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
history_log: Содержит информацию о регистрации.
PERFORM create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
history_text: Хранит текстовые данные, такие как сообщения и журналы.
PERFORM create_hypertable('history_text', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
history_str: Хранит короткие текстовые строки.
PERFORM create_hypertable('history_str', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
history_bin: Хранит двоичные данные. (Начиная с версии 7.0.2)
PERFORM create_hypertable('history_bin', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
auditlog: Содержит информацию о регистрации действий пользователя. (Начиная с версии 7.0)
PERFORM create_hypertable('auditlog', 'auditid', chunk_time_interval => 604800, time_partitioning_func => 'cuid_timestamp', migrate_data => true, if_not_exists => true);
trends: Хранит агрегированные исторические данные показателей.
PERFORM create_hypertable('trends', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
trends_uint: Хранит агрегированные исторические данные для целочисленных показателей.
PERFORM create_hypertable('trends_uint', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
Установка TimescaleDB в Zabbix
Подготовка к установке
Перед установкой TimescaleDB необходимо установить PostgreSQL, а также пакет zabbix-sql-scripts из официального репозитория для используемой версии Zabbix. Для PostgreSQL рекомендуется устанавливать его из официального репозитория PostgreSQL, а не из системного, чтобы обеспечить совместимость и доступ к последним функциям и исправлениям безопасности.
Важно отметить, что все следующие команды и настройки выполняются только на сервере PostgreSQL. Установка TimescaleDB из официального репозитория TimescaleDB, поддерживающего лицензию Community, открывает доступ к расширенным функциям, таким как сжатие данных. С лицензией Community пользователи могут использовать сжатие, что может значительно снизить требования к объёму хранилища и повысить производительность запросов к историческим данным.
Добавление официального репозитория TimescaleDB
Чтобы установить TimescaleDB из официального репозитория, его необходимо добавить в систему. В дистрибутивах на базе RHEL, таких как Rocky Linux, выполните следующие действия:
tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL
Установить TimescaleDB.
Замените номер версии (16) на версию PostgreSQL, которую вы используете.
dnf install timescaledb-2-postgresql-16 timescaledb-2-loader-postgresql-16
Запустите timescaledb-tune утилиту и передайте большее значение для максимального количества подключений (--max-conns), установленное 125 для этих целей тестирования.
Эта утилита используется для настройки параметров PostgreSQL по умолчанию для повышения производительности и соответствующей настройки параметров PostgreSQL для работы с TimescaleDB.
Эта утилита также поможет нам выбрать текущий и действительный файл конфигурации PostgreSQL с помощью мастера установки и настроить автоматическую загрузку библиотек TimescaleDB.
Ответьте «да» (y) на все вопросы. Обратите внимание, что мастер настройки предполагает, что PostgreSQL работает на автономном сервере, поэтому может потребоваться соответствующая корректировка параметров.
Замените номер версии (16) на версию PostgreSQL, которую вы используете.
timescaledb-tune --pg-config /usr/pgsql-16/bin --max-conns=125

Затем перезапустите службу PostgreSQL:
Замените номер версии (16) на версию PostgreSQL, которую вы используете.
systemctl restart postgresql-16.service
Осталось только создать и активировать сам TimescaleDB:
Обратите внимание, что в процессе разработки путь был изменен с исходного /usr/share/zabbix-sql-scripts/postgresql/timescaledb.sql на новый /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql.
Примечание: начиная с версии Zabbix 7.2, скрипт schema.sql для TimescaleDB находится по следующему пути:/usr/share/zabbix/sql-scripts/postgresql/timescaledb/schema.sql.
Игнорирование предупреждений: При запуске скрипта schema.sql на TimescaleDB версии 2.9.0 и выше могут появляться предупреждения о несоответствии лучшим практикам. Эти предупреждения можно игнорировать, так как настройка будет успешно завершена, несмотря на них.
Длительное время миграции: Перенос существующих исторических данных, терендов и журналов аудита может занять много времени!!! В это время сервер Zabbix и веб-интерфейс должны быть выключены!!! для обеспечения согласованности данных.
Для Zabbix версии 7.0 и более ранних версий:
echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix
cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql zabbix
Начиная с версии Zabbix 7.2:
echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix
cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql zabbix

Дополнительная информация
Настройка параметров очистки (Administration > Housekeeping): Скрипт schema.sql устанавливает следующие параметры очистки:
Override item history period: разрешить переопределять период хранения истории элементов.
Override item trend period: разрешить переопределение периода сохранения трендов.
Для использования раздельного управления историей и трендами необходимо включить оба этих параметра. Также можно включить переопределение только для истории или только для трендов. Если этот параметр применяется, настройки истории и тенденций на уровне элементов будут игнорироваться.
Другие параметры в скрипте schema.sql : Этот скрипт также задает два дополнительных параметра:
Enable compression: разрешить сжатие.
Compress records older than 7 days: сжать записи старше 7 дней.
Для успешного удаления сжатых данных с помощью функции встроенного housekeeper необходимо включить параметры «Override item history period» и «Override item trend period». Если функция переопределения отключена и таблицы содержат сжатые фрагменты, менеджер обслуживания не удалит данные из этих таблиц, а в разделах «Управление» и «Информация о системе» появятся предупреждения о неправильной настройке.
Если в журнале сервера Zabbix вы видите сообщение о том, что версия TimescaleDB слишком новая, это не является серьёзной проблемой. Zabbix может не успеть достаточно быстро отреагировать на последние версии TimescaleDB, чтобы указать её поддержку в своём коде, но совместимость с Zabbix гарантирована и проверена нами.

Чтобы избежать сообщений о совместимости в файле журнала Zabbix, просто откройте файл конфигурации сервера Zabbix, расположенный по адресу, /etc/zabbix/zabbix_server.conf и измените следующий параметр конфигурации:
AllowUnsupportedDBVersions=1
Сохраните файл с этой настройкой и перезапустите системную службу сервера Zabbix.
systemctl restart zabbix-server
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал zabbix_ru, где будет еще больше полезной информации.