Официальная справка

Репликация в Managed Service for PostgreSQL

Про шардирование немного другой сервис
Managed Service for Sharded PostgreSQL

Пробую на timeweb
Логическая репликация PostgreSQL: инструкция

В общих чертах процесс репликации выглядит так:

1. На узле издателя создаётся одна или больше публикаций.

2. Один или больше подписчиков подписываются на одну или больше публикаций.
3. Моментальный снимок базы данных публикации копируется на подписчика. Этот шаг также называется фазой синхронизации таблицы. Чтобы сократить время, затрачиваемое на эту фазу, можно создать несколько обработчиков синхронизации таблиц. Однако может быть только один рабочий процесс синхронизации для каждой таблицы. 4. После завершения копирования последующие изменения, сделанные на узле-издателе, будут отправлены узлу-подписчику. Изменения будут применяться в порядке фиксации для обеспечения согласованности транзакций.

Узел подписчика извлекает изменения по мере их появления в базе данных издателя


НадоНа мастере (ruvds)На реплике (timeweb)
используйте разные порты. Например, публикация будет на 5432, а подписчик — на 5431 (просто замечание).

sudo nano /etc/postgresql/16/main/postgresql.conf

Раскомментируйте параметр wal_level и задайте значение logical.

sudo systemctl restart postgresql

Мои вопросы:
1. Это на каком сервере? - сделал на мастере
2. Останется ли работать физическая репликация? - ок

wal_level

restart
добавил запись, проверим на VM Яндекса

Как часы Хотя она была остановлена на момент изменений на мастере
Затем на мастере в основной таблице (?) выполните

pg_dumpall --database=postgres --host=192.168.1.2 --no-password --globals-only --no-privileges | psql

висит

pg_dumpall пустую

PostgreSQL database cluster dump complete

А куда и что?

Попробую по другой инструкции

Сразу отличие
listen_addresses = 'localhost, IP мастера'

... и pg_dumpall на slave вроде
psql CREATE DATABASE db_test;

Полезная инструкция timeweb

переключиться на другую базу данных внутри psql используем команду:
\c имя_БД

Создал таблицу themes

1. Брандмауэр - пока не трогал
2. Настройки Master

Реплицировать будем базу с названием db_test.
(и для того чтобы не корёжить имеющиеся БД на timeweb) /etc/postgresql/16/main/postgresql.conf

SHOW hba_file;
/var/lib/pgsql/16/data/pg_hba.conf (?)
host db_test postgres 192.168.1.11/32 trust
host postgres postgres 192.168.1.11/32 trust
Свои данные, конечно
3. Настройки на Slave
Через свой веб-интерфейс
SHOW config_file;
[('/etc/postgresql/14/main/postgresql.conf',)]

wal_level = logical

systemctl restart postgresql

Реплицирую только db_test

pg_dump --dbname db_test --host=IP мастера --no-password --create --schema-only | psql



Ожидаемо, по умолчанию через root подключается

Добавил -U postgres, теперь говорит версии не сопадают. Тоже ожидаемо. ОК, будем по друргому
Нарисовал схему ERD Добавить

По официальной инструкции

На мастере

CREATE PUBLICATION pub1 FOR TABLE themes;

На реплике
Создал на timeweb БД db_test и пустую таблицу themes

CREATE SUBSCRIPTION sub1 CONNECTION 'host=IP Мастера dbname=db_test application_name=sub1' PUBLICATION pub1;

Всё ок

Далее

1. Нужны ли предыдущие шаги по настройке?
2. Сделать такую же подписку к БД postgres
3. Добавил таблицу blog и запись на мастере в БД postgres
4. Проверить физ на Я машине - ив схему нарисовать там бд или табл? физ ведь
5. И ничо не надо очищать при лог репликации
Добавить ещё одну таблицу? И как и где она встрелит?


временная таблица разобраться



Яндекс
postgres
db_test ruvds
postgres
db_test timeweb
db_test
postgres

blog 1
themes 5

db_test

themes

db_test

themes

Логическая

21.11.25

Какая здесь репликация?

Наверняка логическая, по аналогии с timeweb

К db_test потому что

CREATE SUBSCRIPTION sub1 CONNECTION 'host=IP Мастера dbname=db_test application_name=sub1' PUBLICATION pub1;

поэкспереминтеровать с логической еще из разных баз а если наоборот esplogs на Я и подпискку в обратную сторону? CREATE TABLE esplogs (id serial PRIMARY KEY, recordtime timestamp NOT NULL, recordtext text NOT NULL);

Упс

ERROR: Cannot execute CREATE TABLE in a read-only transaction

Об этой ошибке на Yandex Cloud
Такие ошибки могут возникнуть, если произошло переключение роли мастера на другой хост и вы подключились к реплике, доступной только для чтения.




Надо Яндекс Timeweb
Ещё раз с чистого листа по https://postgrespro.ru/docs/postgresql/current/logical-replication-subscription#LOGICAL-REPLICATION-SUBSCRIPTION-EXAMPLES офиц инструкции пройтись логическую минимум движений CREATE DATABASE fromtime;

Хм, то же самое

ERROR: Cannot execute CREATE DATABASE in a read-only transaction

А как же тогда удалось создать лог.реплику на db_test?
CREATE DATABASE foryandex;

CREATE TABLE maxlogs (id serial PRIMARY KEY, recordtime timestamp NOT NULL, author varchar(20) NOT NULL, recordtext text NOT NULL);

INSERT INTO maxlogs (recordtime, author, recordtext) VALUES (nov(), 'test user', 'test text');
секреты логирования otus очистка main и вот \то вот всё? Найти историю, когда была создана db_test и настроена репликация и какая?
***
***
***
ЯндексRuvds db_testTimeweb foryandex
Мгновенно появилась. Значит здесь тоже физ.репликация 22.11.25 CREATE TABLE maxlogs в БД db_test

Теперь сделать здесь лог.репликацию из Timeweb

CREATE SUBSCRIPTION subtime CONNECTION 'host=178.253.42.21 dbname=foryandex application_name=subtime' PUBLICATION pubtime;

CREATE PUBLICATION pubtime FOR TABLE maxlogs;


could not connect to the publisher port 5432 failed fe_sendauth: no password supplied

Разбор ошибки
SHOW hba_file;
pg_hba.con
host foryandex postgres IP slave/32 trust

Три инструкции, какая из них сработала ХЗ, Каша
listen_addresses = 'localhost, 192.168.1.10' - у меня *

wal_level = logical уже