Логічна реплікація в 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