Настройка двунаправленной репликации#
GraDeLy поддерживает возможность двунаправленной репликации между двумя базами данных.
Для избежания зацикливания транзакций к каждой транзакции добавляется атрибут origin, указывающий на базу-источник транзакции. Этот атрибут хранится в WAL-журнале и при чтении журнала позволяет выбирать транзакции только из нужных источников.
Последовательность выполнения#
Чтобы настроить двунаправленную репликацию:
Предоставьте модулю Applier права на функции для присвоения атрибута
origin.Настройте фильтрацию транзакций.
Предоставьте пользователям права на публикацию и чтение слотов.
Чтобы предоставить модулю Applier права на функции#
Чтобы модуль Applier мог присваивать метки транзакциям сессии, нужно предоставить ему права на функции:
SELECT pg_replication_origin_create(origin_name);
SELECT pg_replication_origin_session_setup(origin_name);
SELECT pg_replication_origin_session_reset();
SELECT pg_replication_origin_drop(origin_name);
С помощью них при запуске репликации модуль Applier инициализирует пул соединений (java connection pool) с БД и создает для каждого соединения собственный источник функцией SELECT pg_replication_origin_create(origin_name); и присвоит имя всем транзакциям сеанса функцией pg_replication_origin_session_setup().
Для предоставления прав на функции:
Инструкция для администратора PostgreSQL
Подключитесь к базе от имени суперпользователя:
psql -U postgres -d your_databaseВыдайте пользователю, под которым работает модуль Applier, привилегии на функции
pg_replication_origin:GRANT EXECUTE ON FUNCTION pg_replication_origin_create(text) TO replicator; GRANT EXECUTE ON FUNCTION pg_replication_origin_session_setup(text) TO replicator; GRANT EXECUTE ON FUNCTION pg_replication_origin_session_reset() TO replicator; GRANT EXECUTE ON FUNCTION pg_replication_origin_drop(text) TO replicator;Убедитесь, что у модуля Applier есть необходимые права:
SET ROLE replicator; SELECT pg_replication_origin_session_reset();
Чтобы настроить фильтрацию транзакций#
Фильтрация гарантирует, что изменения с противоположной БД принимаются, а собственные — отбрасываются, предотвращая зацикливание.
Добавьте в параметрах соединения модуля Capture параметр
allowed_origins. Для этого в поле Опции, в окне Редактирование свойств соединения Capture, во вкладке Соединения пропишите"allowed_origins": [{имя_источника_по_шаблону}].Для указания имени источника GraDeLy поддерживает шаблоны с джокером «?», который равносилен любому символу.
Например:
{ "allowed_origins": [ "grdl_????" ] }Теперь каждая транзакция с меткой, соответствующей шаблону (например: grdl_0001, grdl_0007, grdl_0362), будет отправлена в trail для репликации в БД-приемник.
Модуль Capture захватывает все транзакции:
которые приходят из источника, указанного в
allowed_origins;у которых атрибут
originпуст.
Или добавьте в параметрах соединения модуля Capture параметр
disаllowed_originsдля создания «черного списка» транзакций, которые реплицировать не нужно. Для этого в поле Опции, в окне Редактирование свойств соединения Capture, во вкладке Соединения пропишите"disаllowed_origins": [{имя_источника_по_шаблону}]:{ "disallowed_origins": [ "grdl_????" ] }Теперь каждая транзакция с меткой, содержащей указанный префикс источника, в trail для дальнейшей репликации в БД-приемник отправляться не будет.
Добавьте в параметрах соединения модуля Applier параметр
origin_name. Значениеorigin_nameуказывает, откуда были сгенерированы изменения, чтобы затем их можно было фильтровать на принимающей стороне.Для этого в поле Опции, в окне Редактирование свойств соединения Applier, во вкладке Соединения пропишите
"origin_name": {префикс_источника}:{ "origin_name": "grdl" }
Чтобы предоставить права на публикацию#
Для работы пользователей GraDeLy с PostgreSQL нужно разрешение на публикацию логических слотов.
Инструкция для администратора PostgreSQL:
Подключитесь к экземпляру PostgreSQL от имени суперпользователя:
psql -U postgres -d your_databaseУбедитесь, что нужный пользователь существует:
\duЕсли пользователя нет, создайте его:
CREATE USER your_user WITH PASSWORD 'your_secure_password';Предоставьте пользователю роль
rds_replication:GRANT rds_replication TO your_user;Убедитесь, что права применены:
SELECT * FROM pg_roles WHERE rolname = 'your_user';Посмотрите, присутствует ли в колонке
rolreplicationзначениеtrue.
Результат#
В интерфейсе консоли управления, во вкладке Соединения, окне Редактирование свойств соединения Target, поле Опции прописаны параметры фильтрации с атрибутом origin.