Настройка двунаправленной репликации
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"} -
Для проверки создания
originsна БД-приемника, выполните запрос:SELECT * from pg_replication_origin;Должны отображаться записи вида: grdl_0001, grdl_0002, grdl_0003, ...
Количество данных
originsопределяется количеством соединений к БД, а количество соединений к БД настраивается параметромmax.pool.size.max.pool.sizeуказывается в options соединения БД-приемника. По умолчанию значениеmax.pool.size: 10.Также учитывается параметр на сервере БД
max_replication_slots, значение которого должно быть больше, чем создаваемое количествоorigins(которые регулируются параметромmax.pool.size).
Чтобы предоставить права на публикацию
Для работы пользователей 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.