Предыстория:

Zabbix сервер начал что-то периодически нагружать процессор под 30-40%. Вывод htop на сервере показал, что виновник MySQL. Он давал периодами нагрузку под 100%. Было решено перейти на PostgreSQL, ну и заодно пощупать TimescaleDB.

Сервер у нас трудится под Ubuntu Server 24.04, Zabbix 7.0.8.

Приступим.

Сначала подключаем репозиторий 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

Создаем пользователя базы 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';"

Для начала поправим файл /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 для улучшения работы с 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/

  • work/zabbix/zabbix-migration-mysql-postgresql.txt
  • Последнее изменение: 2025/01/15 14:26
  • rolland