Логічна реплікація в postgresql 10 на debian

налаштування логічної реплікації в postgresql 10 на debian

на master

$ sudo vim /etc/postgresql/10/main/postgresql.conf

знайти строчку

#listen_addresses = 'localhost'        # what IP address(es) to listen on;

розкоментувати й додати ip вашого slave

listen_addresses = 'localhost, db_master_private_ip_address'

далі знайти строчку

#wal_level = replica                    # minimal, replica, or logical

розкоментувати й прописати

wal_level = logical

зберегти, закрити, далі

$ sudo vim /etc/postgresql/10/main/pg_hba.conf
...
# TYPE      DATABASE        USER            ADDRESS                              METHOD
...
host        all            all            db_replica_private_ip_address/32      md5

зберегти, закрити

не забути про firewall

sudo ufw allow from db_replica_private_ip_address to any port 5432
sudo systemctl restart postgresql

далі наступні команди на обох серверах -
на master та на slave

$ sudo -u postgres psql
postgres=# CREATE DATABASE example;
postgres=# c example

    CREATE TABLE widgets
    (
        id SERIAL,
        name TEXT,
        price DECIMAL,
        CONSTRAINT widgets_pkey PRIMARY KEY (id)
    );

примітка:
Additional columns must not have NOT NULL or other constraints. If they do, replication will fail.

іншими словами -- всі значення потрібно вставляти, default працює

далі на master

example=# CREATE ROLE sammy WITH REPLICATION LOGIN PASSWORD 'my_password';
example=# GRANT ALL PRIVILEGES ON DATABASE example TO sammy;
example=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sammy;

створення підписки --
на master

example=# CREATE PUBLICATION my_publication;

example=# ALTER PUBLICATION my_publication ADD TABLE widgets;

далі на slave

example=# CREATE SUBSCRIPTION my_subscription CONNECTION 'host=db_master_private_ip_address port=5432 password=my_password user=sammy dbname=example' PUBLICATION my_publication;

якщо все ок, ви побачите -

Output
NOTICE:  created replication slot "my_subscription" on publisher
CREATE SUBSCRIPTION

тестування -
на master

example=# INSERT INTO widgets (name, price) VALUES ('Hammer', 4.50), ('Coffee Mug', 6.20), ('Cupholder', 3.80);

на репліці

example=# SELECT * FROM widgets;

Output
 id |    name    | price 
----+------------+-------
  1 | Hammer    |  4.50
  2 | Coffee Mug |  6.20
  3 | Cupholder  |  3.80
(3 rows)

примітка:
реплікація відбувається на фоні,
тобто можлива ситуація, коли ви на master вставили запис,
далі одразу ж на slave робите вибірку, а запису там ще немає :)

лог при помилках можна знайти
на slave

vim /var/log/postgresql/postgresql-10-main.log

видалити підписку для створення заново можна командою -

example=# DROP SUBSCRIPTION my_subscription;

Посилання

https://www.digitalocean.com/community/tutorials/how-to-set-up-logical-replication-with-postgresql-10-on-ubuntu-18-04 https://postgrespro.ru/docs/postgresql/10/sql-createsubscription
https://postgrespro.ru/docs/postgresql/10/sql-createpublication