INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / Thingiverse / RSS / GPG

Логическая репликация в Postgresql

№ 11067 В разделе "Sysadmin" от July 10th, 2020,
В подшивках: , ,

Чтобы полностью понять принцип работы логической репликации нужно прочитать документацию. Если кратко, то логическая репликация передает не бинарные данные, а запросы 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;

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Яндекс.Метрика

Fortune cookie: Spam del giorno: Ideale declino