ublog

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

linux [22]postgresql [10]

замітка по темі логічної реплікації в 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


happy end :)