Настройка 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><ENVIRONMENT_PREFIX></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><ENVIRONMENT_PREFIX></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><ENVIRONMENT_PREFIX></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><ENVIRONMENT_PREFIX></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».