Debezium CDC на PostgreSQL и транзакциях

Я хотел бы использовать Debezium для отслеживания измененных данных (CDC) в базе данных PostgreSQL. Прямо сейчас я не совсем понимаю, как работать с транзакциями в Debezium.

Рассмотрим следующий пример - у меня есть 2 таблицы в исходной базе данных PostgreSQL. Я вставляю данные в обе эти таблицы в рамках одной транзакции базы данных. Другими словами, мне нужно выполнить два отдельных оператора INSERT. Если я правильно понимаю, в случае Debezium CDC это приведет к двум отдельным сообщениям в двух отдельных темах Kafka (или потоках AWS Kinesis). Каждое из этих сообщений будет использовано собственным потребителем и вставлено в целевую базу данных отдельной транзакцией. В случае сбоя одной из транзакций другая может быть успешной, и я столкнусь с состоянием несогласованности данных в целевой базе данных.

Есть ли в Дебезиуме какие-то стандартные механизмы, позволяющие справиться с такой ситуацией? Или, например, чтобы этого избежать, я должен использовать Kafka Streams API и объединить эти две темы в одну (на transactionId) перед обновлением целевой базы данных?


person alexanoid    schedule 08.08.2020    source источник


Ответы (1)


Вы правильно описываете поведение по умолчанию.

Если вы хотите записать несколько записей в базу данных приемника с помощью одной транзакции, вам, вероятно, придется использовать специальное приложение-потребитель, которое буферизует события, происходящие из одной транзакции, внутри и записывает их в базу данных приемника сразу за одну сделка. Простое объединение событий по одной теме вам не поможет, поскольку общий коннектор приемника по-прежнему не знает об исходных транзакционных границах.

Для этого вы можете использовать тему транзакции Debezium. Он предоставляет всю информацию, которая может понадобиться такому потребительскому приложению для реализации такой логики буферизации. К сожалению, у нас пока нет исчерпывающей демонстрации для этого, но я надеюсь, что мы скоро напишем об этом в блоге.

person Gunnar    schedule 08.08.2020
comment
Спасибо за Ваш ответ. Пожалуйста, позвольте мне резюмировать мое понимание того, что вы сказали. Мне нужно реализовать специальное приложение, которое будет прослушивать все темы Kafka для таблиц, которые участвуют в моих бизнес-транзакциях, и собирать все события где-то на моей стороне в некотором буфере (в памяти или в базе данных). Также мне нужно прослушивать события в теме метаданных транзакции Debezium, и, таким образом, я буду знать границы каждой исходной транзакции (количество событий и т. Д.). - person alexanoid; 08.08.2020
comment
Как только я пойму, что локально собрал все события для конкретной транзакции, я реплицирую эти изменения в свою базу данных приемника в рамках одной транзакции. И буду повторять этот шаг для каждой транзакции, которая есть в теме метаданных транзакции Debezium. Я прав? - person alexanoid; 08.08.2020
comment
И если да, то как насчет первоначального снимка существующих данных в исходной базе данных, который Debezium попытается загрузить после самого первого выполнения? Будет ли Debezium следовать такому сценарию с существующими данными в исходной базе данных? - person alexanoid; 08.08.2020
comment
Вы правы со своими первыми двумя комментариями. Повторите снимки, что TX в настоящее время не представлен в теме метаданных TX (мы планировали добавить это). В блоке source событий изменений есть маркер, который сообщает вам, является ли это последним событием моментального снимка. Таким образом, вы сможете дождаться всех событий моментальных снимков, но вы можете получить большую транзакцию при одновременной записи всех событий. - person Gunnar; 09.08.2020
comment
Прошу прощения, что беспокою вас дополнительным вопросом по этой теме - чтобы использовать Debezium, я собираюсь обновить старую существующую базу данных PostgreSQL 9.2 до некоторой новой версии, которая поддерживает журнал с упреждающей записью (WAL). После обновления сможет ли Debezium сделать первоначальный снимок существующих данных из этой базы данных? Я спрашиваю, потому что исходные (существующие данные) были сформированы на старой базе данных без WAL. - person alexanoid; 14.08.2020
comment
Да, снимок читается через JDBC, т.е. формат WAL для этого не имеет значения. Вы даже можете сделать снимок (только) с PG 9.2. - person Gunnar; 14.08.2020
comment
Спасибо за Ваш ответ! Не могли бы вы также изучить следующий вопрос stackoverflow.com/questions/63418001/ - person alexanoid; 16.08.2020