Kaptain.
Telegram /
LinkedIn /
Email /
GIT /
RSS /
GPG /
Заказ печатных плат

№ 11067 В разделе
Sysadmin
от July 10th, 2020,
В подшивках: Linux, PostgreSQL, Zabbix
Чтобы полностью понять принцип работы логической репликации нужно прочитать документацию. Если кратко, то логическая репликация передает не бинарные данные, а запросы INSERT, UPDATE, DELETE или их сочетание, что позволяет тонко управлять реплицируемыми данными, а также делать это между разными мажорными версиями СУБД. В моем случае я буду мигрировать с 10й версии на 12ю с маленьким даунтаймом. Вся концепция репликации строится на публикациях изменений и подписках, причем подписчик сам может публиковать данные уже для своих подписчиков.
На реплицируемой базе данных необходимо создать публикатор:
postgres=# \c zabbix You are now connected to database "zabbix" as user "postgres". zabbix=# CREATE PUBLICATION zbx FOR ALL TABLES; CREATE PUBLICATION
Не забываем в postgresql.conf поставить параметр wal_level = logical. Теперь можно сдампить текущую схему БД в файл, который позже будет залит в целевую БД.
postgres@boroda:/tmp$ pg_dump -h 127.0.0.1 -p 5432 -s zabbix > zabbix_schema.sql
Для уверенности можно проверить состояние публикатора
zabbix=# \dRp
List of publications
Name | Owner | All tables | Inserts | Updates | Deletes | Truncates
------+----------+------------+---------+---------+---------+-----------
zbx | postgres | t | t | t | t | t
(1 row)
А теперь на целевом сервере создадим новую базу, зальем схему и подпишемся на источник данных:
postgres=# create database zabbix; CREATE DATABASE postgres=# create role zabbix; CREATE ROLE
А вот теперь можно и залить схему в новую БД:
postgres@boroda:/tmp$ cat /tmp/zabbix_schema.sql | psql -p 5434 zabbix
Ну вот и пришло время заливаться
postgres=# \c zabbix You are now connected to database "zabbix" as user "postgres". zabbix=# CREATE SUBSCRIPTION zbx CONNECTION 'postgresql://postgres:postgres@127.0.0.1:5432/zabbix' PUBLICATION zbx WITH (slot_name=zbx_slot); NOTICE: created replication slot "zbx_slot" on publisher CREATE SUBSCRIPTION
По умолчанию данные будут автоматически скопированы, но с помощью WITH можно изменить поведение подписки. Обратите внимание, что под репликацию лучше создать отдельного пользователя и ограничить ему доступ по IP в pg_hba.conf, но т.к. оба моих сервера находятся в безопасной среде мне на это пофигу и я копирую данные прямо суперюзером.
Проверим состояние подписки:
zabbix=# \dRs
List of subscriptions
Name | Owner | Enabled | Publication
------+----------+---------+-------------
zbx | postgres | t | {zbx}
(1 row)
Проверим начали ли данные передаваться:
zabbix=# select count(*) from hosts;
count
-------
53
(1 row)
Все выглядит просто ништяк, данные перекачались в новое место, теперь можно переключать Zabbix со старой базы данных на новую, а потом просто дропнуть подписку.
Не забудьте перестроить индексы мигрировавшей базы данных:
zabbix=# reindex database CONCURRENTLY zabbix;
Fortune cookie: "Mammon: the god of the world's leading religion." [Ambrose Bierce, The Devil's Dictionary, 1911]
Leave a Reply