Миграция Zabbix с MySQL на PostgreSQL
Предыстория:
Zabbix сервер начал что-то периодически нагружать процессор под 30-40%. Вывод htop на сервере показал, что виновник MySQL. Он давал периодами нагрузку под 100%. Было решено перейти на PostgreSQL, ну и заодно пощупать TimescaleDB.
Приступим.
Установка PostgreSQL
Сначала подключаем репозиторий PostgreSQL
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Далее добавляем ключ
wget --quiet -O - https://wwww.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Если получаем сообщение
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
То должно помочь
apt-key export ACCC4CF8 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/postgresql.gpg
Мне не помогло:) Выкрутился так:
sudo wget http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc
А затем:
sudo apt-key add ACCC4CF8.asc
Ну и ставим сам PostgreSQL
sudo apt -y install postgresql
Далее ставим утилиту pgloader для миграции данных. Собирать будем её из исходников.
Ставим зависимости:
sudo apt install sbcl unzip libsqlite3-dev gawk curl make freetds-dev libzip-dev
Качаем актуальную версию. На текущий момент 3.6.9
wget https://github.com/dimitri/pgloader/archive/refs/tags/v3.6.9.tar.gz
Распаковываем
tar xvf v3.6.9.tar.gz
Переходим в распакованный каталог
cd pgloader-3.6.9
И спобираем
make pgloader
Ну и для приличия перемещаем
sudo mv ./build/bin/pgloader /usr/local/bin/
Подготовка к миграции
Создаем временный каталог для исходников нашей версии Zabbix
mkdir /tmp/zabbix-db-migration/ && cd $_
Скачиваем архив с нашей версией Zabbix с официального сайта
wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.8.tar.gz
Распаковываем
tar -zxvf zabbix-7.0.8.tar.gz
Переходим в распакованный каталог, где у нас лежит схема для PostgreSQL
cd /tmp/zabbix-db-migration/zabbix-7.0.8/database/postgresql/
Выбираем из схемы только операции создания таблиц и триггеров и сохраняем их в отдельный файл в корне папки для миграции
grep -v 'ALTER TABLE ONLY' schema.sql | grep -v INSERT | grep -v 'CREATE INDEX' | grep -v 'CREATE UNIQUE INDEX' > /tmp/zabbix-db-migration/create_tables.sql
Удаляем из него строки, отвечающие за создания триггеров
sed -i '/create\ or\ replace\ function/,$d' /tmp/zabbix-db-migration/create_tables.sql
Из оригинального файла схемы забираем относящееся к триггерам
awk '/INSERT INTO dbversion/{p=1;next} /ALTER TABLE/{p=0} p' schema.sql > /tmp/zabbix-db-migration/triggers.sql
Теперь все относящееся к индексам
grep -E 'CREATE INDEX|CREATE UNIQUE INDEX' schema.sql > /tmp/zabbix-db-migration/create_index.sql
И еще ALTER
grep 'ALTER TABLE ONLY' schema.sql > /tmp/zabbix-db-migration/alter_table.sql
Настраиваем PostgreSQL
Создаем пользователя базы Zabbix. Я создавал с таким же именем и паролем, как в MySQL.
sudo -u postgres createuser --pwprompt zabbixrd
Далее создаем базу. Тоже с названием не заморачивался и брал такое же, как в MySQL.
sudo -u postgres createdb -O zabbixrd zabbixrddb
Применяем схему
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /tmp/zabbix-db-migration/create_tables.sql
Для работы с pgloader временно ставим шифрование md5
sudo -u postgres psql -c "SET password_encryption='md5';"
Задаем пароль пользователя введенный выше
sudo -u postgres psql -c "ALTER ROLE zabbixrd WITH PASSWORD 'password';"
Настраиваем MySQL
Для начала поправим файл /etc/mysql/mysql.comf.d/mysqld.cnf. Добавим в него:
[mysqld] ... default-authentication-plugin=mysql_native_password
Перезапускаем службу MySQL
systemctl restart mysql
Меняем метод входа пользователя Zabbix. Не забываем поставить правильный пароль.
mysql -e "ALTER USER 'zabbixrd'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';"
Далее создаем файл /tmp/zabbix-db-migration/pgloader.conf с таким содержанием
LOAD DATABASE FROM mysql://zabbixrd:password@127.0.0.1/zabbixrddb INTO postgresql://zabbixrd:password@127.0.0.1/zabbixrddb WITH include no drop, truncate, create no tables, create no indexes, no foreign keys, reset sequences, data only, prefetch rows = 1000, batch rows = 1000, batch concurrency = 1 ALTER SCHEMA 'zabbixrddb' RENAME TO 'public';
Миграция
Останавливаем Zabbix и Apache:
sudo systemctl stop zabbix-server apache2
Создаем каталог для данных из MySQL
mkdir /tmp/zabbix-db-migration/data
Далее запускаем pgloader с конфигурацией, которую создавали выше:
pgloader --root-dir=/tmp/zabbix-db-migration/data /tmp/zabbix-db-migration/pgloader.conf
Все предупреждающие сообщения игнорируем. Миграция займет некоторое время, в зависимости от размера и т.п.
После завершения, возвращаем шифрование.
sudo -u postgres psql -c "SET password_encryption='SCRAM-SHA-256';"
Снова задаем пользователя
sudo -u postgres psql -c "ALTER ROLE zabbixrd WITH PASSWORD 'password';"
Создаем схемы:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /tmp/zabbix-db-migration/create_index.sql sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /tmp/zabbix-db-migration/alter_table.sql sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /tmp/zabbix-db-migration/triggers.sql
Ну и рекомендуется сделать VACUUM
sudo -u postgres vacuumdb --dbname=zabbixrddb --analyze --username=postgres --jobs=$(grep -c processor /proc/cpuinfo)
Тестирование
Удаляем поддержку mysql
sudo apt remove zabbix-server-mysql
На всякий случай сохраняем конфиг zabbix_server.conf .
Ставим необходимые пакеты
sudo apt install zabbix-server-pgsql php8.3-pgsql zabbix-apache-conf
Удаляем конфиг mysql для Zabbix
sudo rm /etc/zabbix/web/zabbix.conf.php
Стартуем Zabbix и Apache
sudo systemctl start zabbix-server apache2
Подключаемся к нашему Zabbix через браузер и выполняем его настройку на СУБД PostgreSQL. После этого все должно заработать.
Удаляем MysQL и все, что с ним связано.
service mysql stop sudo apt purge mysql-server mysql-common mysql-server-core-* mysql-client-core-* sudo rm -Rf /var/lib/mysql/ sudo rm -Rf /etc/mysql/ sudo rm -Rf /var/log/mysql/ sudo deluser --remove-home mysql
Установка TimescaleDB
А теперь еще одна плюшка. Ставим TimescaleDB для улучшения работы с Zabbix.
Подключаем репозиторий
echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
Про ключ не забываем
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/timescaledb.gpg
Обновим список
sudo apt update
Ставим необходимое
sudo apt install timescaledb-2-postgresql-17 timescaledb-2-loader-postgresql-17
Выполняем настройку. Проще всего на все ответить «да».
sudo timescaledb-tune
Останавливаем сервер Zabbix
sudo systemctl stop zabbix-server
Перезапустим postgresql
sudo systemctl restart postgresql
Подключаем расширение к Zabbix
echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql --dbname=zabbixrddb
И выполняем скрипт для конвертации данных. Занимает некоторое время.
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql
Запускаем Zabbix
sudo systemctl start zabbix-server
Помогли в написании источники: https://www.initmax.com/wiki/zabbix-migration-from-mysql-to-postgresql/ https://interface31.ru/tech_it/2024/07/ustanovka-zabbix-7-c-nginx-postgresql-timescaledb-na-ubuntu-server.html https://rutube.ru/video/f393860f271726b94d9a1467a871c1da/