Перейти к основному содержимому

Настройка двунаправленной репликации

GraDeLy поддерживает возможность двунаправленной репликации между двумя базами данных.

Для избежания зацикливания транзакций к каждой транзакции добавляется атрибут origin, указывающий на базу-источник транзакции. Этот атрибут хранится в WAL-журнале и при чтении журнала позволяет выбирать транзакции только из нужных источников.

Последовательность выполнения​

Чтобы настроить двунаправленную репликацию:

  1. Предоставьте модулю Applier права на функции для присвоения атрибута origin.
  2. Настройте фильтрацию транзакций.
  3. Предоставьте пользователям права на публикацию и чтение слотов.

Чтобы предоставить модулю 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

Для предоставления прав на функции:

  1. Подключитесь к базе от имени суперпользователя:

    psql -U postgres -d your_database
  2. Выдайте пользователю, под которым работает модуль 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;
  3. Убедитесь, что у модуля Applier есть необходимые права:

    SET ROLE replicator;
    SELECT pg_replication_origin_session_reset();

Чтобы настроить фильтрацию транзакций​

примечание

Фильтрация гарантирует, что изменения с противоположной БД принимаются, а собственные — отбрасываются, предотвращая зацикливание.

  1. Добавьте в параметрах соединения модуля 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 для дальнейшей репликации в БД-приемник отправляться не будет.

  2. Добавьте в параметрах соединения модуля Applier параметр origin_name. Значение origin_name указывает, откуда были сгенерированы изменения, чтобы затем их можно было фильтровать на принимающей стороне.

    Для этого в поле Опции, в окне Редактирование свойств соединения Applier, во вкладке Соединения пропишите "origin_name": {префикс_источника}:

    {
    "origin_name": "grdl"
    }
  3. Для проверки создания 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

Для предоставления разрешения:

  1. Подключитесь к экземпляру PostgreSQL от имени суперпользователя:

    psql -U postgres -d your_database
  2. Убедитесь, что нужный пользователь существует:

    \du

    Если пользователя нет, создайте его:

    CREATE USER your_user WITH PASSWORD 'your_secure_password';
  3. Предоставьте пользователю роль rds_replication:

    GRANT rds_replication TO your_user;
  4. Убедитесь, что права применены:

    SELECT * FROM pg_roles WHERE rolname = 'your_user';

    Посмотрите, присутствует ли в колонке rolreplication значение true.

Результат​

В интерфейсе консоли управления, во вкладке Соединения, окне Редактирование свойств соединения Target, поле Опции прописаны параметры фильтрации с атрибутом origin.