Настройка PostgreSQL

Перед созданием коннектора необходимо настроить PostgreSQL для логической репликации.

Для параметров PostgreSQL необходимо установить значения:

  • значение параметра «wal_level» должно быть «logical»;
  • значение параметра «max_replication_slots» должно быть больше 0;
  • значение параметра «max_wal_senders» должно быть больше 0.

Пользователю Debezium необходимо назначить атрибут «REPLICATION»: ALTER ROLE <логин пользователя db> WITH REPLICATION;

Допустимы две схемы развертывания БД:

  • если каждый коннектор работает с отдельной базой;
  • если коннекторы работают с одной базой, но с разными схемами.

При использовании одной базы данных для нескольких коннекторов необходимо настроить следующие параметры:

  • «database.dbname» – общий для нескольких коннекторов;
  • «table.include.list» – различный для нескольких коннекторов;
  • «heartbeat.action.query» – различный для нескольких коннекторов;
  • «slot.name» – уникальный для каждого коннектора;
  • «publication.name» – уникальный для каждого коннектора;
  • «schema.history.internal.kafka.topic» – уникальный для каждого коннектора.

Примеры конфигураций различных коннекторов Debezium, которые работают с одной БД <ENVIRONMENT_PREFIX>_dh_db и с разными схемами:

  • Со схемой «collections»:
"database.dbname": " <span>&lt;ENVIRONMENT_PREFIX&gt;</span>_dh_db",
"table.include.list": "collections.dh_collections,collections.dh_collection_content,collections.debezium_heartbeat",
"heartbeat.action.query": "INSERT INTO collections.debezium_heartbeat (id, heartbeat_ts) VALUES (1, NOW()) ON CONFLICT(id) DO UPDATE SET heartbeat_ts=EXCLUDED.heartbeat_ts;"
  • Со схемой «documents»:
"database.dbname": " <span>&lt;ENVIRONMENT_PREFIX&gt;</span>_dh_db",
"table.include.list": "documents.dh_documents,documents.dh_compound_relations,documents.debezium_heartbeat",
"heartbeat.action.query": "INSERT INTO documents.debezium_heartbeat (id, heartbeat_ts) VALUES (1, NOW()) ON CONFLICT(id) DO UPDATE SET heartbeat_ts=EXCLUDED.heartbeat_ts;"

Если таблицы не находятся в схеме «public», необходимо изменить наименование схемы на актуальное в параметрах «table.include.list» и «heartbeat.action.query».

Также необходимо настроить права пользователя PostgreSQL. Для этого пользователю, указанному в полях «database.user» и «database.password», необходимо назначить права:

  • REPLICATION – на репликацию;
  • CONNECT – на используемую БД;
  • USAGE – на целевую схему;
  • SELECT – на business-таблицы, указанные в table.include.list;
  • SELECT, INSERT, UPDATE – на таблицу debezium_heartbeat.

Пример SQL-скрипта для выдачи прав пользователю для схемы «public»:

ALTER ROLE <логин пользователя db> WITH LOGIN REPLICATION;
GRANT CONNECT ON DATABASE  <span>&lt;ENVIRONMENT_PREFIX&gt;</span>_dh_collections_db TO <логин пользователя db>;
GRANT USAGE ON SCHEMA public TO <логин пользователя db>;
GRANT SELECT ON TABLE public.dh_collections TO <логин пользователя db>;
GRANT SELECT ON TABLE public.dh_collection_content TO <логин пользователя db>;
GRANT SELECT, INSERT, UPDATE ON TABLE public.debezium_heartbeat TO <логин пользователя db>;

Пример SQL-скрипта для выдачи прав пользователю для схемы «collections»:

ALTER ROLE <логин пользователя db> WITH LOGIN REPLICATION;
GRANT CONNECT ON DATABASE  <span>&lt;ENVIRONMENT_PREFIX&gt;</span>_dh_db TO <логин пользователя db>;
GRANT USAGE ON SCHEMA collections TO <логин пользователя db>;
GRANT SELECT ON TABLE collections.dh_collections TO <логин пользователя db>;
GRANT SELECT ON TABLE collections.dh_collection_content TO <логин пользователя db>;
GRANT SELECT, INSERT, UPDATE ON TABLE collections.debezium_heartbeat TO <логин пользователя db>;

Также необходимо настроить публикации PostgreSQL.

Если публикация создается автоматически, то ее имя будет создано из значения поля «publication.name».

При ручном создании необходимо заранее создать публикацию, указать в ней таблицы из «table.include.list» конкретного коннектора и в поле «publication.name» коннектора внести наименование созданной публикации. Наименование публикации должно быть уникальным для коннектора.

Пример SQL-скрипта создания публикации PostgreSQL:

CREATE PUBLICATION dh_collections_publication
FOR TABLE public.dh_collections, public.dh_collection_content, public.debezium_heartbeat;

Если используется одна база данных и разные схемы, необходимо указать таблицы нужной схемы:

CREATE PUBLICATION dh_collections_publication
FOR TABLE collections.dh_collections, collections.dh_collection_content, collections.debezium_heartbeat;

Для настройки слотов репликации необходимо указать в поле «slot.name» имя слота репликации, оно должно быть уникальным для публикации.

Перед созданием коннектора необходимо, чтобы поле «slot.name» не было занято другим коннектором, а также слот соответствовал нужной публикации. Если данный слот уже занят, необходимо задать новое имя в «slot.name».