Миграция zabbix с mysql на timescaledb

Lebedev Nikolay
3 min readNov 5, 2019

--

Заббикс недавно анонсировал официальную поддержку postgres timescaledb, что должно решить одну из самых актуальных проблем, удаление устаревших исторических данных в заббикс.

Для этого используют и эффективно, партицирование. Но только для таблиц history* и trends*.

Если использовать партицирование для других таблиц, то это ведёт к разрушением целостности и связанности между таблицами и как следствие переход на новую версию становится проблематичным.

Чтобы решить эти проблемы, — использование timescaledb вместо партицирования mysql.
Это позволит не использовать партицирование, и эффективно работать с удалением данных заббикс.

В данной статья я расскажу, как протестировать миграцию быстро и безопасно.

Итак, исходная инфраструктура:

  1. Тестовый стенд, Centos 7, Docker, 32G ОЗУ, 1Tb DISK
  2. Заббикс mysql, настроена репликация master slave
  3. Версия zabbix 4.12 mysql, объём 1,5Tb
  4. Версия после миграции 4.4, pgsql,timescaledb

План миграции:

  1. Сделать дамп базы данных mysql со slave без таблиц history* и trends*
  2. Скопировать бекап на тестовый стенд:
mysqldump --host=127.0.0.1 --user=root --password=pass --single-transaction --events --triggers --routines --ignore-table=zabbix.history --ignore-table=zabbix.history_log --ignore-table=zabbix.history_str --ignore-table=zabbix.history_text --ignore-table=zabbix.history_uint --ignore-table=zabbix.trends --ignore-table=zabbix.trends_uint --skip-comments --quick --set-gtid-purged=OFF  zabbix | ssh root@10.10.10.10 'cat > /var/lib/mysql/backup-zabbix-$(date +%F_%H-%M-%S).sql'

3. Развернуть тестовую mysql базу на стенде

mysql -u zabbix zabbix < /var/lib/mysql/backup-zabbix-2019-10-10.sql

4. Собрать в docker все необходимые для миграции инструменты:

cd /opt/
git clone https://github.com/bakaut/zbx2timescaledb.git
cd /opt/zbx2timescaledb/ztmp

Собрать pgloader (инструмент для миграции mysql pgsql)

cd ../pgloader/builder
make build

Из исходников zabbix-server 4.4 postgres “вытащить” базу create.sql.gz

cd ../zbx-source
make build

Разделить create.sql.gz на create и alter и добавить эти файлы в pgloader и добавить файл конфига zabbix.load

cd ../pgloader
make build

Пояснения файла zabbix.load

LOAD DATABASE
FROM mysql://zabbix:zabbix@127.0.0.1/zabbix
INTO postgresql://zabbix:zabbix@127.0.0.1/zabbix
WITH include no drop,
truncate,
create no tables,
create no indexes,
no foreign keys,
reset sequences,
data only
SET MySQL PARAMETERS
max_execution_time = '0'
SET maintenance_work_mem TO '1024MB', work_mem to '512MB'
ALTER SCHEMA 'zabbix' RENAME TO 'public'
EXCLUDING TABLE NAMES MATCHING ~/history.*/, ~/trend.*/
BEFORE LOAD EXECUTE create.sql;
max_execution_time = '0' бесконечное время на select из mysql1. Создаём в pgsql схему из create.sql
2. Копируем из mysql данные в pgsql
3. Не копируем history и trend

Запускаем базу pgsql timescaledb и копируем alter.sql

cd ../pgsql/
make recreate

Запускаем миграцию с mysql на pgsql

cd ../pgloader
make run

Запускаем репликацию с mysql на pgsql

cd ../pgmigration
make build
make init
make run

Настройка под вашу инфраструктуру:

Поменять переменные в файлах:

pgloader/zabbix.load
pgmigration/default.yml

Поменяйте user password на ваши.

Чтобы запустить полностью миграцию, нужно:

cd /opt/
git clone https://github.com/bakaut/zbx2timescaledb.git
cd /opt/zbx2timescaledb/ztmp
bash resreate.sh

Репозитарий

Список использованных статей и документация:

--

--