Всем привет! Мы делаем проекты по Zabbix, накопили большую экспертизу и решили сделать переводы нескольких статей, которые нам показались интересными и полезными. Наверняка, будут полезны и вам. Также своим опытом делимся в телеграм-канале zabbix_ru, где вы можете найти полезные материалы и записи наших вебинаров, опубликованных на нашем ютуб-канале (прим. переводчика).
В этой статье мы покажем вам, как перенести базу данных Zabbix из MySQL в PostgreSQL на Rocky Linux 9. Заодно покажем, как включить TimescaleDB, а также выполним некоторые базовые настройки производительности.
В статье предполагается, что если доступны необязательные патчи (ключи с плавающей точкой и первичные ключи ), то они уже применены к базе данных.
Если вы в этом не уверены, информация об этом статусе также отображается во фронтенде в разделе System information, например, «Database history tables upgraded: No».
Мы заранее предупреждаем вас, что вы осуществляете миграцию на свой страх и риск, и мы не несем ответственности за любой ущерб, вызванный непрофессиональным вмешательством.
Каждая версия Zabbix и версия базы данных имеет свою специфику, которую необходимо учитывать при составлении плана миграции и всех последующих действиях. По нашему опыту, значительная часть проблем после миграции (например, с очисткой) может проявиться только позже. Поэтому мы рекомендуем вам обратиться к нам за возможной консультацией, прежде чем вмешиваться в производственную среду. Мы будем рады помочь вам на протяжении всего процесса безупречной миграции и на всех последующих этапах.
Проверка версий
В качестве самого первого шага перед фактической миграцией вам необходимо узнать конкретную версию сервера Zabbix, которая РАБОТАЕТ в данный момент.
Это не та версия, которая отображается в нижнем колонтитуле веб-интерфейса!
Наиболее безопасно найти это в журнале самого сервера Zabbix при его запуске:
cat /var/log/zabbix/zabbix_server.log | grep "Starting Zabbix Server. Zabbix"
Вывод этой команды в нашем случае выглядит так:
1933256:20240510:164211.482 Starting Zabbix Server. Zabbix 7.0.0 (revision 9bc845eca94)
Другой вариант — узнать версию установочных пакетов библиотеки поддержки Zabbix для MySQL, которую можно увидеть с помощью приведенной ниже команды.
Но это может быть не текущая версия!
rpm -qa | grep zabbix-server-mysql
Вывод этой команды выглядит так:
zabbix-server-mysql-7.0.0-release1.el9.x86_64.rpm
Другой способ узнать версию сервера Zabbix — проверить её с помощью исполняемого файла zabbix_server. Однако даже эта информация может быть обманчивой при определённых обстоятельствах и может не соответствовать текущей версии.
zabbix_server -V
Тогда вывод будет выглядеть так:
zabbix_server (Zabbix) 7.0.0
Revision 9bc845eca94 4 June 2024, compilation time: Jun 4 2024 00:00:00
Этапы подготовки
Триггеры MySQL
Начиная с версии 6.0.11, Zabbix содержит триггеры базы данных, которые необходимо учитывать при миграции. С помощью следующего набора команд мы проверим, применимо ли это к нашему экземпляру базы данных.
Войдите в консоль MySQL:
mysql
Переключимся на базу данных «zabbix»:
use zabbix;
Затем мы вызовем команду SHOW TRIGGERS, которая покажет нам используемые триггеры базы данных (если таковые имеются):
SHOW TRIGGERS\G
Если вывод этой команды следующий, то вы можете смело пропустить часть с установкой триггеров в инструкции ниже.
Empty set (0.00 sec)
Пример вывода этой команды в Zabbix версии 6.0.11 можно увидеть здесь. На этом этапе вам придётся перейти к главе о миграции триггеров, упомянутой ниже.
*************************** 1. row ***************************
Trigger: hosts_name_upper_insert
Event: INSERT
Table: hosts
Statement: set new.name_upper=upper(new.name)
Timing: BEFORE
Created: 2024-02-27 09:59:58.09
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Definer: zabbix@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_bin
*************************** 2. row ***************************
Trigger: hosts_name_upper_update
Event: UPDATE
Table: hosts
Statement: begin
if new.name<>old.name
then
set new.name_upper=upper(new.name);
end if;
end
Timing: BEFORE
Created: 2024-02-27 09:59:58.10
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Definer: zabbix@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_bin
*************************** 3. row ***************************
Trigger: items_name_upper_insert
Event: INSERT
Table: items
Statement: set new.name_upper=upper(new.name)
Timing: BEFORE
Created: 2024-02-27 10:00:00.76
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Definer: zabbix@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_bin
*************************** 4. row ***************************
Trigger: items_name_upper_update
Event: UPDATE
Table: items
Statement: begin
if new.name<>old.name
then
set new.name_upper=upper(new.name);
end if;
end
Timing: BEFORE
Created: 2024-02-27 10:00:00.77
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Definer: zabbix@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_bin
4 rows in set (0.01 sec)
Установка зависимостей
Сначала мы добавляем официальный репозиторий PostgreSQL, который мы рекомендуем для установки. Инсталляционные пакеты из репозиториев RedHat существенно отличаются.Мы можем сделать это с помощью следующей команды:
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Установите версию PostgreSQL, поддерживаемую Zabbix, которую вы можете найти в матрице совместимости на сайте Zabbix:
yum install postgresql16-server
Инициализируйте сервер базы данных PostgreSQL с помощью следующей команды:
/usr/pgsql-16/bin/postgresql-16-setup initdb
Запустите службу PostgreSQL и настройте ее на запуск при запуске сервера:
systemctl enable postgresql-16
systemctl start postgresql-16
Установите утилиту pgloader, используемую для переноса данных:
yum install pgloader
Для проверки версии используйте следующую команду pgloader:
pgloader -V
Вывод будет выглядеть так:
pgloader version "3.6.7"
Подготовка к миграции
Теперь создайте временную папку, в которой будут храниться файлы конфигурации, используемые при последующей миграции, и откройте ее:
mkdir /tmp/zabbix-db-migration/ && cd $_
Разбор схемы
Для самой миграции данных вам понадобится файл со схемой базы данных, который вы можете найти в официальном исходном коде Zabbix для вашей конкретной версии.
Обязательно измените эту команду в соответствии с вашей версией Zabbix!
Находясь во временной папке, созданной для миграции, загрузите исходный код для версии 7.0.0beta1 (или более свежей. -прим. переводчика) с помощью следующей команды:
wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.0.tar.gz
Распакуйте загруженный архив, содержащий исходный код Zabbix:
tar -zxvf zabbix-7.0.0.tar.gz
Откройте папку, в которой вы найдете схемы базы данных, по следующему пути:
cd /tmp/zabbix-db-migration/zabbix-7.0.0/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
Теперь этот файл содержит не только операции CREATE TABLE, но также операции и функции для триггеров, которые мы решаем индивидуально. Поэтому удалите из этого файла часть, создающую триггеры:
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, вам будет предложено ввести пароль:
sudo -u postgres createuser --pwprompt zabbix
Далее создаем базу данных Zabbix:
sudo -u postgres createdb -O zabbix zabbix
Затем создайте схему Zabbix:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -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 zabbix WITH PASSWORD '***********';"
Подготовка MySQL
Если в MySQL уже используется изменённый формат входа, то, как и в случае с PostgreSQL, для нужд pgloader необходимо изменить способ входа пользователя базы данных в Zabbix и одновременно сгенерировать пароль заново. Сделать это можно следующим образом.
Сначала откройте файл конфигурации сервера MySQL. Если вы используете другую версию, например, MariaDB или Percona, расположение файла может отличаться.
nano /etc/my.cnf.d/mysql-server.cnf
Здесь временно измените следующую директиву в [mysqld]разделе (server):
[mysqld]
...
default-authentication-plugin=mysql_native_password
Теперь необходимо перезапустить MySQL:
systemctl restart mysqld
Теперь вы можете изменить способ входа пользователя в Zabbix и сгенерировать пароль заново. Не забудьте сменить пароль на свой в команде ниже!
mysql -e "ALTER USER 'zabbix'@'localhost' IDENTIFIED WITH mysql_native_password BY '*********';"
Подготовьте файл конфигурации – скрипт SQL для pgloader, поэтому создайте этот файл:
nano /tmp/zabbix-db-migration/pgloader.conf
И заполните этот файл следующим содержимым. Не забудьте сменить пароли (отмеченные звёздочками) в этом скрипте на свои собственные, действительные пароли для обеих баз данных:
LOAD DATABASE
FROM mysql://zabbix:**********@127.0.0.1/zabbix
INTO postgresql://zabbix:**********@127.0.0.1/zabbix
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 'zabbix' RENAME TO 'public';
Миграция
Теперь можно приступить к самой миграции. Рекомендуем вам сделать резервную копию исходной базы данных MySQL и убедиться, что на диске достаточно свободного места.
Сначала остановите службу сервера Zabbix и веб-сервер Apache:
systemctl stop zabbix-server httpd
Создайте папку для перенесенных данных из MySQL в нашей временной папке:
mkdir /tmp/zabbix-db-migration/data
И затем запустите pgloader с созданного вами файла конфигурации:
pgloader --root-dir=/tmp/zabbix-db-migration/data /tmp/zabbix-db-migration/pgloader.conf
Если во время работы pgloader появляются какие-либо предупреждения, их можно смело игнорировать — это не так уж важно. С другой стороны, существуют и более серьёзные проблемы, с которыми вы также можете столкнуться, например: небольшой объём доступного дискового пространства, задержки между базами данных (тайм-ауты), низкая скорость записи на диск (низкое количество операций ввода-вывода). Даже эти проблемы можно решить, но они требуют дальнейшего анализа и последующей индивидуальной настройки.
Пример вывода этой команды можно найти здесь:
2024-05-10T16:55:38.010000+01:00 LOG pgloader version "3.6.7~devel"
2024-05-10T16:55:38.174002+01:00 LOG Migrating from #<MYSQL-CONNECTION mysql://zabbix@127.0.0.1:3306/zabbix {100685C583}>
2024-05-10T16:55:38.175002+01:00 LOG Migrating into #<PGSQL-CONNECTION pgsql://zabbix@127.0.0.1:5432/zabbix {100685C713}>
2024-05-10T16:55:38.684006+01:00 WARNING Source column "public"."history_uint"."value" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."history_uint"."value".
2024-05-10T16:55:38.685006+01:00 WARNING Source column "public"."item_rtdata"."lastlogsize" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."item_rtdata"."lastlogsize".
2024-05-10T16:55:38.686006+01:00 WARNING Source column "public"."proxy_history"."lastlogsize" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."proxy_history"."lastlogsize".
2024-05-10T16:55:38.686006+01:00 WARNING Source column "public"."trends_uint"."value_min" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."trends_uint"."value_min".
2024-05-10T16:55:38.687006+01:00 WARNING Source column "public"."trends_uint"."value_avg" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."trends_uint"."value_avg".
2024-05-10T16:55:38.687006+01:00 WARNING Source column "public"."trends_uint"."value_max" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."trends_uint"."value_max".
2024-05-10T16:56:28.778334+01:00 ERROR Database error 23505: duplicate key value violates unique constraint "changelog_pkey"
DETAIL: Key (changelogid)=(16809) already exists.
CONTEXT: COPY changelog, line 1
2024-05-10T16:56:30.691348+01:00 LOG report summary reset
table name errors rows bytes total time
--------------------------------- --------- --------- --------- --------------
fetch meta data 0 198 0.121s
Truncate 0 198 0.338s
--------------------------------- --------- --------- --------- --------------
public.history 0 3899811 133.2 MB 39.021s
public.history_uint 0 2167293 66.0 MB 26.330s
public.trends 0 502182 27.5 MB 8.498s
public.items 0 12784 4.4 MB 1.488s
public.event_tag 0 13012 326.9 kB 0.942s
public.trigger_tag 0 7365 198.8 kB 1.411s
public.triggers 0 5546 1.4 MB 2.027s
public.graphs_items 0 4186 138.6 kB 2.082s
public.history_str 0 2923 233.3 kB 2.316s
public.item_condition 0 2445 123.0 kB 2.524s
public.widget_field 0 1875 103.9 kB 2.777s
public.graphs 0 1428 154.7 kB 3.150s
public.item_rtdata 0 957 16.0 kB 3.248s
public.host_tag 0 635 17.4 kB 3.486s
public.widget 0 467 14.2 kB 3.773s
public.host_hgset 0 307 2.5 kB 3.991s
public.profiles 0 265 13.2 kB 4.305s
public.dashboard_page 0 158 1.9 kB 4.515s
public.dashboard 0 154 10.5 kB 4.839s
public.images 0 187 1.9 MB 5.049s
public.task_check_now 0 0 5.063s
public.lld_override_opdiscover 0 98 0.7 kB 5.114s
public.lld_override_opstatus 0 98 0.7 kB 5.217s
public.trigger_discovery 0 82 2.0 kB 5.339s
public.users_groups 0 64 0.5 kB 5.407s
public.user_ugset 0 61 0.3 kB 5.525s
public.graph_discovery 0 47 1.1 kB 5.643s
public.hosts_templates 0 31 0.5 kB 5.809s
public.problem 0 34 3.4 kB 6.004s
public.hstgrp 0 26 1.5 kB 6.212s
public.module 0 27 0.9 kB 6.343s
public.hgset 0 19 1.3 kB 6.497s
public.host_rtdata 0 13 0.1 kB 6.690s
public.expressions 0 10 0.5 kB 6.691s
public.escalations 0 15 0.7 kB 6.847s
public.permission 0 7 0.0 kB 6.810s
public.conditions 0 6 0.1 kB 6.961s
public.usrgrp 0 6 0.2 kB 6.958s
public.regexps 0 5 0.2 kB 7.101s
public.graph_theme 0 4 0.9 kB 7.071s
public.opmessage_grp 0 4 0.0 kB 7.248s
public.httpstepitem 0 3 0.0 kB 7.275s
public.scripts 0 3 0.3 kB 7.423s
public.sysmaps_links 0 3 0.4 kB 7.411s
public.acknowledges 0 1 0.0 kB 7.573s
public.interface_snmp 0 2 0.1 kB 7.510s
public.proxy 0 2 0.1 kB 7.738s
public.ugset 0 2 0.1 kB 7.531s
public.dchecks 0 1 0.0 kB 7.727s
public.autoreg_host 0 0 7.722s
public.config_autoreg_tls 0 1 0.0 kB 7.899s
public.connector_tag 0 0 7.852s
public.corr_condition_group 0 0 7.925s
public.corr_condition_tagpair 0 0 8.054s
public.corr_operation 0 0 8.049s
public.dashboard_user 0 0 8.200s
public.dhosts 0 1 0.0 kB 8.190s
public.dservices 0 1 0.2 kB 8.298s
public.globalmacro 0 1 0.0 kB 8.291s
public.group_discovery 0 0 8.472s
public.history_log 0 0 8.467s
public.httpstep 0 1 0.1 kB 8.693s
public.httptest 0 1 0.1 kB 8.688s
public.httptest_tag 0 0 8.849s
public.icon_mapping 0 0 8.821s
public.lld_override_ophistory 0 0 9.102s
public.lld_override_opperiod 0 0 8.981s
public.lld_override_optag 0 0 9.132s
public.lld_override_optrends 0 0 9.350s
public.maintenances 0 1 0.0 kB 9.347s
public.maintenances_hosts 0 1 0.0 kB 9.557s
public.opcommand 0 0 9.548s
public.opcommand_hst 0 0 9.736s
public.opgroup 0 1 0.0 kB 9.738s
public.opmessage_usr 0 0 9.954s
public.optemplate 0 1 0.0 kB 9.950s
public.proxy_dhistory 0 0 10.057s
public.report 0 0 10.101s
public.report_user 0 0 10.120s
public.scim_group 0 0 10.198s
public.service_alarms 0 0 10.219s
public.service_problem_tag 0 0 10.271s
public.service_tag 0 0 10.329s
public.services_links 0 0 10.363s
public.sla_excluded_downtime 0 0 10.401s
public.sla_service_tag 0 0 10.487s
public.sysmap_element_url 0 0 10.484s
public.sysmap_url 0 0 10.618s
public.sysmap_usrgrp 0 0 10.537s
public.sysmaps_link_triggers 0 0 10.622s
public.task 0 0 10.677s
public.task_close_problem 0 0 10.752s
public.task_remote_command 0 0 10.763s
public.task_result 0 0 10.812s
public.token 0 0 10.864s
public.user_scim_group 0 0 10.940s
public.userdirectory_idpgroup 0 0 10.955s
public.userdirectory_media 0 0 11.072s
public.userdirectory_usrgrp 0 0 11.029s
public.valuemap_mapping 0 30621 861.6 kB 11.359s
public.trends_uint 0 345750 11.3 MB 3.151s
public.item_tag 0 19823 598.5 kB 0.772s
public.item_preproc 0 11373 603.2 kB 0.888s
public.functions 0 9445 268.0 kB 1.304s
public.item_discovery 0 5629 129.7 kB 1.377s
public.hostmacro 0 4612 360.1 kB 1.518s
public.events 0 3494 252.6 kB 1.644s
public.alerts 0 3083 844.7 kB 1.838s
public.trigger_depends 0 1819 32.0 kB 2.011s
public.auditlog 0 5350 642.1 kB 2.329s
public.event_recovery 0 1362 27.6 kB 2.490s
public.item_rtname 0 917 60.6 kB 2.691s
public.media_type_param 0 555 22.0 kB 2.867s
public.hosts 0 318 133.3 kB 3.229s
public.hosts_groups 0 307 3.7 kB 3.413s
public.history_text 0 211 3.7 MB 3.957s
public.media_type_message 0 154 41.1 kB 4.150s
public.event_suppress 0 143 3.5 kB 4.421s
public.lld_macro_path 0 134 4.5 kB 4.481s
public.problem_tag 0 150 3.6 kB 4.600s
public.lld_override_operation 0 98 2.9 kB 4.726s
public.lld_override 0 95 3.7 kB 4.842s
public.lld_override_condition 0 85 3.6 kB 4.946s
public.users 0 63 7.8 kB 5.092s
public.ids 0 51 1.3 kB 5.177s
public.item_parameter 0 43 1.7 kB 5.288s
public.group_prototype 0 28 0.9 kB 5.371s
public.role_rule 0 27 0.8 kB 5.505s
public.interface 0 24 1.1 kB 5.670s
public.media_type 0 31 256.8 kB 5.707s
public.hgset_group 0 19 0.1 kB 5.649s
public.host_discovery 0 11 0.2 kB 5.789s
public.operations 0 10 0.2 kB 5.792s
public.opmessage 0 8 0.1 kB 5.806s
public.rights 0 7 0.1 kB 5.872s
public.sessions 0 6 0.5 kB 5.985s
public.actions 0 5 0.3 kB 5.883s
public.sysmaps_elements 0 5 0.8 kB 5.978s
public.housekeeper 0 4 0.1 kB 5.993s
public.role 0 4 0.1 kB 5.966s
public.httptestitem 0 3 0.0 kB 6.161s
public.sysmaps 0 3 0.2 kB 6.102s
public.ugset_group 0 3 0.0 kB 6.098s
public.dashboard_usrgrp 0 2 0.0 kB 6.088s
public.media 0 3 0.1 kB 6.262s
public.proxy_rtdata 0 2 0.0 kB 6.239s
public.config 0 1 0.7 kB 6.237s
public.ha_node 0 1 0.1 kB 6.223s
public.changelog 1 0 6.382s
public.connector 0 0 6.371s
public.corr_condition 0 0 6.354s
public.corr_condition_tag 0 0 6.365s
public.corr_condition_tagvalue 0 0 6.487s
public.correlation 0 0 6.505s
public.dbversion 0 1 0.0 kB 6.513s
public.drules 0 1 0.0 kB 6.500s
public.event_symptom 0 0 6.610s
public.globalvars 0 1 0.0 kB 6.631s
public.history_bin 0 0 6.634s
public.host_inventory 0 1 0.3 kB 6.640s
public.httpstep_field 0 0 6.735s
public.httptest_field 0 0 6.747s
public.icon_map 0 0 6.771s
public.interface_discovery 0 0 6.767s
public.lld_override_opinventory 0 0 6.868s
public.lld_override_opseverity 0 0 6.883s
public.lld_override_optemplate 0 0 6.908s
public.maintenance_tag 0 0 6.906s
public.maintenances_groups 0 0 7.003s
public.maintenances_windows 0 1 0.0 kB 7.016s
public.opcommand_grp 0 0 7.036s
public.opconditions 0 0 7.031s
public.opinventory 0 0 7.129s
public.optag 0 0 7.147s
public.proxy_autoreg_host 0 0 7.178s
public.proxy_history 0 0 7.191s
public.report_param 0 0 7.224s
public.report_usrgrp 0 0 7.305s
public.script_param 0 0 7.244s
public.service_problem 0 0 7.348s
public.service_status_rule 0 0 7.366s
public.services 0 0 7.318s
public.sla 0 0 7.411s
public.sla_schedule 0 0 7.473s
public.sysmap_element_trigger 0 0 7.455s
public.sysmap_shape 0 1 0.1 kB 7.407s
public.sysmap_user 0 0 7.582s
public.sysmaps_element_tag 0 0 7.602s
public.tag_filter 0 0 7.517s
public.task_acknowledge 0 0 7.653s
public.task_data 0 0 7.574s
public.task_remote_command_result 0 0 7.725s
public.timeperiods 0 1 0.0 kB 7.643s
public.trigger_queue 0 0 7.726s
public.userdirectory 0 0 7.770s
public.userdirectory_ldap 0 0 7.744s
public.userdirectory_saml 0 0 7.785s
public.valuemap 0 944 62.8 kB 7.835s
--------------------------------- --------- --------- --------- --------------
COPY Threads Completion 0 4 51.236s
Reset Sequences 0 1 0.110s
Install Comments 0 0 0.000s
--------------------------------- --------- --------- --------- --------------
Total import time 1 7071507 255.7 MB 51.346s
После успешного завершения pgloader верните алгоритм хеширования к более безопасному значению «SCRAM-SHA-256» и заново сгенерируйте пароль пользователя базы данных. Замените звёздочки в следующей команде выбранным вами паролем:
sudo -u postgres psql -c "SET password_encryption='SCRAM-SHA-256';"
sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD '************';"
Далее создадим схему для индексов:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/create_index.sql
А также схема для таблицы изменений:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/alter_table.sql
И наконец схема для триггеров:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/triggers.sql
После успешной миграции рекомендуем выполнить VACUUM для очистки базы данных:
sudo -u postgres vacuumdb --dbname=zabbix --analyze --username=postgres --jobs=$(grep -c processor /proc/cpuinfo)
Тестирование функциональности
Сначала удалите поддержку MySQL для Zabbix и интерфейса MySQL:
yum remove zabbix-server-mysql zabbix-web-mysql
Установите зависимости, необходимые для запуска сервера Zabbix с PostgreSQL, включая внешний интерфейс.
Внимание: при переустановке сервера Zabbix конфигурация в файле zabbix_server.conf будет утеряна! Рекомендуем сделать резервную копию перед установкой!
yum install zabbix-server-pgsql zabbix-web-pgsql zabbix-apache-conf
Откроем файл конфигурации сервера Zabbix:
nano /etc/zabbix/zabbix_server.conf
Здесь измените директиву конфигурации доступа к базе данных, указав новые учётные данные для PostgreSQL. Замените звёздочки текущим паролем пользователя zabbix:
DBPassword=*******
Теперь удалите старый файл конфигурации фронтенда MySQL:
rm /etc/zabbix/web/zabbix.conf.php
Перезапустите службы сервера Zabbix и веб-сервера Apache:
systemctl restart zabbix-server httpd
Проверьте файл журнала Zabbix, чтобы убедиться, что все работает и не имеет проблем.
nano /var/log/zabbix/zabbix_server.log
Используйте веб-браузер для подключения к URL-адресу интерфейса Zabbix и снова настройте интерфейс, на этот раз для PostgreSQL.
Сначала вас встретит начальный экран выбора языка:

Далее идет проверка необходимых версий и настроек, где мы уже видим установленную поддержку PostgreSQL:

На следующем этапе вам необходимо настроить базу данных, в которую вы внесете данные для входа, созданные на предыдущих этапах:

Выберите имя сервера Zabbix, часовой пояс и тему по умолчанию:

Осталось только проверить, что вы все правильно настроили, и подтвердить следующие выборы:

И теперь вы успешно подключили Zabbix frontend к PostgreSQL!

На этом этапе вы можете остановить сервер MySQL:
systemctl stop mysqld
Теперь MySQL можно полностью удалить. Данные (по стандартному пути /var/lib/mysql) не будут удалены, но мы рекомендуем удалить их, например, через 14 дней функциональной работы с PostgreSQL.
yum remove mysql
TimescaleDB
Установка и настройка
После успешного перехода с MySQL на PostgreSQL вам также предоставляется возможность еще больше повысить производительность Zabbix с помощью TimescaleDB.
Учитывая, что у вас уже есть распакованный файл с исходным кодом, который также содержит схемы установки базы данных для TimescaleDB, вы можете приступить к установке прямо сейчас.
Начнем с добавления официального репозитория:
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
Установите необходимые пакеты:
yum install timescaledb-2-postgresql-16 timescaledb-2-loader-postgresql-16
Запустите утилиту timescaledb-tune и в качестве параметра передайте ей большее значение максимального количества подключений (–max-conns), для целей тестирования давайте установим его равным 125.
Эта утилита используется для настройки параметров PostgreSQL по умолчанию для повышения производительности и изменения параметров PostgreSQL для работы с TimescaleDB.
В то же время эта утилита поможет вам выбрать текущий и действительный файл конфигурации PostgreSQL с помощью мастера установки, а также настроит автоматическую загрузку библиотек TimescaleDB.
Ответьте «да» на все вопросы.
timescaledb-tune --pg-config /usr/pgsql-16/bin --max-conns=125

Затем завершите работу сервера Zabbix и перезапустите системную службу PostgreSQL:
systemctl stop zabbix-server
systemctl restart postgresql-16
Активируйте TimescaleDB для базы данных Zabbix:
echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql --dbname=zabbix
И загрузите данные из извлеченного файла схемы базы данных:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/zabbix-7.0.0/database/postgresql/timescaledb/schema.sql

Теперь вы можете перезапустить службу сервера Zabbix:
systemctl start zabbix-server
Совместимость
Если в файле журнала вы видите сообщение о том, что версия TimescaleDB слишком новая, это не является большой проблемой. Zabbix не может достаточно быстро отреагировать на последние версии TimescaleDB, чтобы указать её поддержку в своём коде, но совместимость гарантируется Zabbix и проверена нами.
Если мы хотим это исправить, то просто откройте файл конфигурации сервера Zabbix по адресу /etc/zabbix/zabbix_server.conf и измените следующий параметр конфигурации соответствующим образом:
AllowUnsupportedDBVersions=1
Сохраните файл с этой новой настройкой и перезапустите системную службу сервера Zabbix:
systemctl restart zabbix-server
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал zabbix_ru, где еще больше полезной информации.
Abyss777
В статье не раскрыто:
Зачем это делать?
Что делать если mysql база весит 900 Гб ? А не 200 Мб как у вас.
axel_rus
Отвечу на ваш первый вопрос. Преимущество PostgreSQL в колоночном расширении TimescaleDB, которое позволяет эффективно удалять устаревшие данные при помощи удаления чанка вместо выполнения SQL-запроса, что нативно поддерживается Zabbix. В MySQL для эффективной работы с удалением исторических данных вам нужно пилить партиционирование, а потом настраивать сторонний скрипт, который будет по расписанию удалять ненужные партиции.
Abyss777
А если уже есть партиционирование? (ибо до 900 Гб без него не дожить) Есть еще какие-то преимущества?
axel_rus
Ну, если вы весело и счастливо живете с MySQL, то иных премуществ, кроме нативной поддержки, наверное, не смогу назвать.