Как ускорить миграцию Zabbix на TimescaleDB

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

image


После того, как в прошлой статье Как мигрировать Zabbix с MySQL на PostgreSQL с минимальным downtime я успешно перенес Zabbix с MySQL на PostgreSQL, встала необходимость сделать следующий шаг — мигрировать БД на TimescaleDB, т.к. ради нее все и затевалось.


У читателя может возникнуть вопрос: зачем нужна эта статья, если есть простой и понятный мануал?
Но проблема, как и в прошлой статье, скрыта в downtime. В мануале ясно написано:


The migration of existing history and trend data may take a lot of time. Zabbix server and frontend must be down for the period of migration.

Исходные данные следующие:


  • Zabbix 5.0
  • СУБД PostgreSQL 12
  • Применен патч ENABLING EXTENDED RANGE OF NUMERIC (FLOAT) VALUES
  • Установлен TimescaleDB 1.7 (поддержка 2.0 пока отсутствует)

Я всячески игрался с тюнингом PostgreSQL, добавлял ресурсы на виртуальную машину с PostgreSQL. Испытанный максимум ресурсов — 24 CPU, 64 GB RAM. Но, очевидно, скрипт миграции упирается в дисковую производительность. В итоге при моей базе данных размером в ~350 Гб миграция занимала 15 часов. Все это время мониторинг отключен.


Я пошел читать документацию TimescaleDB по миграции данных и нашел такой способ, обозначенный как "Faster Method":


  • выбираем таблицу, которую хотим мигрировать в гипертаблицу. Например, history
  • создаем новую таблицу, аналогичную старой, при этом исключая индексы
    CREATE TABLE history_new (LIKE history INCLUDING DEFAULTS INCLUDING CONSTRAINTS EXCLUDING INDEXES);
  • конвертируем новую таблицу в гипертаблицу
    SELECT create_hypertable('history_new', 'clock', chunk_interval => 86400);
  • перемещаем все данные из history в history_new
    INSERT INTO history_new SELECT * FROM history;
  • удаляем старую таблицу history
    DROP TABLE IF EXISTS history;
  • переименовываем history_new в history
    ALTER TABLE IF EXISTS history_new RENAME TO history;
  • создаем индекс (как — описано в файле схемы БД schema.sql)
    CREATE INDEX history_1 in history (itemid,clock);

И так надо сделать для таблиц:


  • history
  • history_log
  • history_str
  • history_text
  • history_uint
  • trends
  • trends_uint

Для ускорения процесса я поместил команды для каждой таблицы в отдельные файлы, чтобы запускать их параллельно.
Ссылка на github репозиторий со скриптами:
https://github.com/niklep/zabbix_timescaledb_scripts


Скрипт finish.sql необходимо выполнить уже после завершения миграции всех таблиц.


В итоге миграция таблиц в гипертаблицы TimescaleDB в моем случае заняла 5 часов, что сильно меньше изначальных 15.
PROFIT.

Источник: https://habr.com/ru/post/549428/


Интересные статьи

Интересные статьи

Всем привет! Меня зовут Дмитрий Андриянов, я Flutter-разработчик в Surf. В этой статье я расскажу про бесшовную миграцию данных при установке новой версии приложения, написанного на Fl...
Можно слушать подкасты и смотреть видео на большей скорости, но как на это реагирует мозг? Моя подруга Мегги смотрит и слушает всё на скорости 150%. Сначала это были обучающие видео и записи...
Есть статьи о недостатках Битрикса, которые написаны программистами. Недостатки, описанные в них рядовому пользователю безразличны, ведь он не собирается ничего программировать.
При выполнении запросов в ClickHouse можно обратить внимание, что в профайлере на одном из первых мест часто видна функция LZ_decompress_fast. Почему так происходит? Этот вопрос стал поводом для ...
Некоторое время назад мне довелось пройти больше десятка собеседований на позицию php-программиста (битрикс). К удивлению, требования в различных организациях отличаются совсем незначительно и...