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

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"
       }
    

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

Для работы пользователей 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.