ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡΠΌΠ΅ Π²ΠΈ Debezium - CDC Π·Π° Apache Kafka

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡΠΌΠ΅ Π²ΠΈ Debezium - CDC Π·Π° Apache Kafka

Π’ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° си чСсто сС Π½Π°Ρ‚ΡŠΠΊΠ²Π°ΠΌ Π½Π° Π½ΠΎΠ²ΠΈ тСхничСски Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ / софтуСрни ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈ, информацията Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ Π΅ доста оскъдна Π² рускоСзичния ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚. Π‘ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌ Π΄Π° запълня Π΅Π΄Π½Π° Ρ‚Π°ΠΊΠ°Π²Π° ΠΏΡ€Π°Π·Π½ΠΈΠ½Π° с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ моята ΡΠΊΠΎΡ€ΠΎΡˆΠ½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° настроя ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° CDC ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΎΡ‚ Π΄Π²Π΅ популярни Π‘Π£Π‘Π” (PostgreSQL ΠΈ MongoDB) към ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ Π½Π° Kafka, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Debezium. Надявам сС, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ ΠΎΠ±Π·ΠΎΡ€Π½Π° статия, която сС появи Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΡΠ²ΡŠΡ€ΡˆΠ΅Π½Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π°, Ρ‰Π΅ бъдС ΠΏΠΎΠ»Π΅Π·Π½Π° Π·Π° Π΄Ρ€ΡƒΠ³ΠΈ.

Какво Π΅ Debezium ΠΈ CDC ΠΊΠ°Ρ‚ΠΎ цяло?

Π”Π΅Π±Π΅Π·ΠΈΡƒΠΌ - ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚Π΅Π» Π½Π° катСгорията CDC софтуСр (ЗаснСманС Π½Π° промяна Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅), ΠΈΠ»ΠΈ ΠΏΠΎ-Ρ‚ΠΎΡ‡Π½ΠΎ, Ρ‚ΠΎΠ²Π° Π΅ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π‘Π£Π‘Π”, ΠΊΠΎΠΈΡ‚ΠΎ са ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΈ с Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° Apache Kafka Connect.

Π’ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€Π°Π½ ΠΏΠΎΠ΄ Apache License v2.0 ΠΈ спонсориран ΠΎΡ‚ Red Hat. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π΅ Π² Ρ…ΠΎΠ΄ ΠΎΡ‚ 2016 Π³. ΠΈ към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° прСдоставя ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° слСднитС Π‘Π£Π‘Π”: MySQL, PostgreSQL, MongoDB, SQL Server. Има ΡΡŠΡ‰ΠΎ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Cassandra ΠΈ Oracle, Π½ΠΎ Ρ‚Π΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° са Π² статус "Ρ€Π°Π½Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ" ΠΈ Π½ΠΎΠ²ΠΈΡ‚Π΅ вСрсии Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚.

Ако сравним CDC с традиционния ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ (ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‡Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Π‘Π£Π‘Π” Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ), Ρ‚ΠΎΠ³Π°Π²Π° основнитС ΠΌΡƒ прСдимства Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ внСдряванСто Π½Π° ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° промяна Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ Ρ€Π΅Π΄ с ниска латСнтност, висока надСТдност ΠΈ наличност. ΠŸΠΎΡΠ»Π΅Π΄Π½ΠΈΡ‚Π΅ Π΄Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ сС постигат Ρ‡Ρ€Π΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ Kafka ΠΊΠ°Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π·Π° CDC ΡΡŠΠ±ΠΈΡ‚ΠΈΡ.

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, прСдимствата Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π΅Π΄ΠΈΠ½ ΠΌΠΎΠ΄Π΅Π» сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΊΡ€Π°ΠΉΠ½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ трябва Π΄Π° сС Ρ‚Ρ€Π΅Π²ΠΎΠΆΠΈ Π·Π° Π½ΡŽΠ°Π½ΡΠΈΡ‚Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π‘Π£Π‘Π”.

И накрая, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π±Ρ€ΠΎΠΊΠ΅Ρ€ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ отваря ΠΏΠΎΠ»Π΅ Π·Π° Ρ…ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»Π½ΠΎ ΠΌΠ°Ρ‰Π°Π±ΠΈΡ€Π°Π½Π΅ Π½Π° прилоТСния, ΠΊΠΎΠΈΡ‚ΠΎ прослСдяват ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² Π΄Π°Π½Π½ΠΈΡ‚Π΅. Π’ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π²ΡŠΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π²ΡŠΡ€Ρ…Ρƒ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ Π΅ свСдСно Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ сС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚ Π½Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ Π‘Π£Π‘Π”, Π° ΠΎΡ‚ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° Kafka.

ΠžΡ‚Π½ΠΎΡΠ½ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Debezium

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Debezium сС свСТда Π΄ΠΎ Ρ‚Π°Π·ΠΈ проста схСма:

Π‘Π£Π‘Π” (ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ) β†’ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ Π² Kafka Connect β†’ Apache Kafka β†’ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»

ΠšΠ°Ρ‚ΠΎ ΠΈΠ»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ Ρ‰Π΅ Π΄Π°ΠΌ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ° ΠΎΡ‚ сайта Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡΠΌΠ΅ Π²ΠΈ Debezium - CDC Π·Π° Apache Kafka

Π’Π°Π·ΠΈ схСма ΠΎΠ±Π°Ρ‡Π΅ Π½Π΅ ΠΌΠΈ харСсва ΠΌΠ½ΠΎΠ³ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ‡Π΅ Π΅ възмоТСн само ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ Π·Π° ΠΌΠΈΠ²ΠΊΠ°.

Π’ дСйствитСлност ситуацията Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Π°: запълванС Π½Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ Data Lake (послСдната Π²Ρ€ΡŠΠ·ΠΊΠ° Π² Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΏΠΎ-Π³ΠΎΡ€Π΅) Π½Π΅ Π΅ СдинствСният Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Debezium. Π‘ΡŠΠ±ΠΈΡ‚ΠΈΡΡ‚Π°, ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ΠΈ Π΄ΠΎ Apache Kafka, ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΎΡ‚ Π²Π°ΡˆΠΈΡ‚Π΅ прилоТСния Π·Π° справянС с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ситуации. НапримСр:

  • ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° нСподходящи Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ кСша;
  • ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° извСстия;
  • Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° индСкса Π·Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅;
  • някакъв Π²ΠΈΠ΄ ΠΎΠ΄ΠΈΡ‚Π½ΠΈ рСгистрационни Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅;
  • ...

Π’ случай, Ρ‡Π΅ ΠΈΠΌΠ°Ρ‚Π΅ Java ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ няма Π½ΡƒΠΆΠ΄Π°/Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Kafka ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€, ΠΈΠΌΠ° ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€Π΅Π· Π²Π³Ρ€Π°Π΄Π΅Π½ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΈΡΡ‚ плюс Π΅, Ρ‡Π΅ с Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΡ‚ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° инфраструктура (ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ ΠΈ Kafka). Π’ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Π°Ρ‡Π΅ Π΅ ΠΎΡ‚Ρ…Π²ΡŠΡ€Π»Π΅Π½ΠΎ ΠΎΡ‚ вСрсия 1.1 ΠΈ Π²Π΅Ρ‡Π΅ Π½Π΅ сС ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π° Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° (ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ΠΎ Π² Π±ΡŠΠ΄Π΅Ρ‰ΠΈ вСрсии).

Π’Π°Π·ΠΈ статия Ρ‰Π΅ обсъди ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π°Π½Π°Ρ‚Π° ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, която осигурява толСрантност към Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ мащабируСмост.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π°

Π—Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ Π΄Π° прослСдявамС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² Π½Π°ΠΉ-Π²Π°ΠΆΠ½Π°Ρ‚Π° стойност - Π΄Π°Π½Π½ΠΈΡ‚Π΅ - ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚:

  1. ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС MySQL ΠΎΡ‚ вСрсия 5.7, PostgreSQL 9.6+, MongoDB 3.2+ (пълСн списък);
  2. ΠšΠ»ΡŠΡΡ‚Π΅Ρ€ Apache Kafka
  3. ЕкзСмпляр Π½Π° Kafka Connect (вСрсии 1.x, 2.x);
  4. ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ Debezium ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€.

Π Π°Π±ΠΎΡ‚Π΅Ρ‚Π΅ ΠΏΠΎ ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ Π΄Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ, Ρ‚.Π΅. ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° инсталиранС Π½Π° Π‘Π£Π‘Π” ΠΈ Apache Kafka са извън ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° статията. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ искат Π΄Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ°Ρ‚ всичко Π² ΠΏΡΡΡŠΡ‡Π½ΠΈΠΊ, ΠΈΠΌΠ° Π³ΠΎΡ‚ΠΎΠ² Ρ‚Π°ΠΊΡŠΠ² Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ docker-compose.yaml.

Π©Π΅ сС спрСм ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° послСднитС Π΄Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ.

0. Kafka Connect

Π’ΡƒΠΊ ΠΈ ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ Π² статията всички ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° конфигурация сС Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Π² контСкста Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Docker, разпространСно ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Debezium. Π’ΠΎΠΉ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° всички Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ плъгин Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ (ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ) ΠΈ прСдоставя конфигурация Π½Π° Kafka Connect с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата.

Ако Π²ΡŠΠ·Π½Π°ΠΌΠ΅Ρ€ΡΠ²Π°Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Kafka Connect ΠΎΡ‚ Confluent, Ρ‰Π΅ трябва сами Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΏΠ»ΡŠΠ³ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ към дирСкторията, посочСна Π² plugin.path ΠΈΠ»ΠΈ Π·Π°Π΄Π°Π΄Π΅Π½ Ρ‡Ρ€Π΅Π· ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° срСдата CLASSPATH. НастройкитС Π·Π° Kafka Connect worker ΠΈ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚ Ρ‡Ρ€Π΅Π· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ ΠΊΠ°Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° worker start. Π—Π° подробности Π²ΠΆ докумСнтация.

ЦСлият процСс Π½Π° настройка Π½Π° Debeizum във вСрсията Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Π½Π° Π΄Π²Π° Π΅Ρ‚Π°ΠΏΠ°. НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ всСки ΠΎΡ‚ тях:

1. НастройванС Π½Π° Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° Kafka Connect

Π—Π° ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ към Apache Kafka ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€, спСцифични ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ сС Π·Π°Π΄Π°Π²Π°Ρ‚ Π² Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° Π½Π° Kafka Connect, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • настройки Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°,
  • ΠΈΠΌΠ΅Π½Π° Π½Π° Ρ‚Π΅ΠΌΠΈ, Π² ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° конфигурацията Π½Π° самия ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€,
  • ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π³Ρ€ΡƒΠΏΠ°Ρ‚Π°, Π² която Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ (Π² случай Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ).

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΈΡΡ‚ Docker ΠΎΠ±Ρ€Π°Π· Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° конфигурация с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата - Ρ‚ΠΎΠ²Π° Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅. Π’Π°ΠΊΠ° Ρ‡Π΅ Π½Π΅ΠΊΠ° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ:

docker pull debezium/connect

ΠœΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΡΡ‚ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° изпълнСниС Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π°, Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ слСдва:

  • BOOTSTRAP_SERVERS=kafka-1:9092,kafka-2:9092,kafka-3:9092 - ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π΅Π½ списък Π½Π° Kafka ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ пълСн списък Π½Π° Ρ‡Π»Π΅Π½ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°;
  • OFFSET_STORAGE_TOPIC=connector-offsets β€” Ρ‚Π΅ΠΌΠ° Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈΡ‚Π΅, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° сС Π½Π°ΠΌΠΈΡ€Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚;
  • CONNECT_STATUS_STORAGE_TOPIC=connector-status - Ρ‚Π΅ΠΌΠ° Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ;
  • CONFIG_STORAGE_TOPIC=connector-config - Ρ‚Π΅ΠΌΠ° Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π·Π° конфигурацията Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ;
  • GROUP_ID=1 β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ†ΠΈ, Π²ΡŠΡ€Ρ…Ρƒ ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС изпълни Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅; изисква сС ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ (разпространСн) Ρ€Π΅ΠΆΠΈΠΌ.

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с Ρ‚Π΅Π·ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ:

docker run 
  -e BOOTSTRAP_SERVERS='kafka-1:9092,kafka-2:9092,kafka-3:9092' 
  -e GROUP_ID=1 
  -e CONFIG_STORAGE_TOPIC=my_connect_configs 
  -e OFFSET_STORAGE_TOPIC=my_connect_offsets 
  -e STATUS_STORAGE_TOPIC=my_connect_statuses  debezium/connect:1.2

Π‘Π΅Π»Π΅ΠΆΠΊΠ° Π·Π° Avro

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Debezium записва Π΄Π°Π½Π½ΠΈ във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ JSON, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ² Π·Π° ΠΏΡΡΡŠΡ‡Π½ΠΈ ΠΊΡƒΡ‚ΠΈΠΈ ΠΈ ΠΌΠ°Π»ΠΊΠΈ количСства Π΄Π°Π½Π½ΠΈ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ силно Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π΅Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ. АлтСрнатива Π½Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€Π° Π½Π° JSON Π΅ сСриализиранСто Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Avro Π² Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΊΠΎΠ΅Ρ‚ΠΎ намалява Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° I/O подсистСмата Π² Apache Kafka.

Π—Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Avro, трябва Π΄Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ схСма-Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ (Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° схСми). ΠŸΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€Π° Ρ‰Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Ρ‚Π°ΠΊΠ°:

name: CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL
value: http://kafka-registry-01:8081/
name: CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL
value: http://kafka-registry-01:8081/
name: VALUE_CONVERTER   
value: io.confluent.connect.avro.AvroConverter

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Avro ΠΈ настройката Π½Π° Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π·Π° Π½Π΅Π³ΠΎ са извън ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° статията - освСн Ρ‚ΠΎΠ²Π°, Π·Π° яснота, Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ JSON.

2. Настройка Π½Π° самия ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€

Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ към конфигурацията Π½Π° самия ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Ρ‡Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ°.

НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Π΄Π²Π΅ Π‘Π£Π‘Π”: PostgreSQL ΠΈ MongoDB, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ°ΠΌ ΠΎΠΏΠΈΡ‚ ΠΈ Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΠΊΠΈ (ΠΌΠ°ΠΊΠ°Ρ€ ΠΈ ΠΌΠ°Π»ΠΊΠΈ, Π½ΠΎ Π² някои случаи Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΈ!).

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π΅ описана Π² JSON нотация ΠΈ Π΅ ΠΊΠ°Ρ‡Π΅Π½Π° Π² Kafka Connect с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° POST заявка.

2.1. PostgreSQL

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Π° конфигурация Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ Π·Π° PostgreSQL:

{
  "name": "pg-connector",
  "config": {
    "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
    "plugin.name": "pgoutput",
    "database.hostname": "127.0.0.1",
    "database.port": "5432",
    "database.user": "debezium",
    "database.password": "definitelynotpassword",
    "database.dbname" : "dbname",
    "database.server.name": "pg-dev",
    "table.include.list": "public.(.*)",
    "heartbeat.interval.ms": "5000",
    "slot.name": "dbname_debezium",
    "publication.name": "dbname_publication",
    "transforms": "AddPrefix",
    "transforms.AddPrefix.type": "org.apache.kafka.connect.transforms.RegexRouter",
    "transforms.AddPrefix.regex": "pg-dev.public.(.*)",
    "transforms.AddPrefix.replacement": "data.cdc.dbname"
  }
}

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡŠΡ‚ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° слСд Ρ‚Π°Π·ΠΈ конфигурация Π΅ доста прост:

  • ΠŸΡ€ΠΈ ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ стартиранС сС ΡΠ²ΡŠΡ€Π·Π²Π° с Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, Π·Π°Π΄Π°Π΄Π΅Π½Π° Π² конфигурацията, ΠΈ стартира Π² Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚Π½Π° снимка, ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°ΠΉΠΊΠΈ Π½Π° Kafka ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈ с условното SELECT * FROM table_name.
  • Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ инициализацията ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ, ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π²Π»ΠΈΠ·Π° Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΡ‚ PostgreSQL WAL Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

Π—Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΠΈ:

  • name β€” ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΡΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅Π»Ρ, Π·Π° ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° описаната ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ конфигурация; Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅ Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° (Ρ‚.Π΅. ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ / рСстартиранС / Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° конфигурацията) Ρ‡Ρ€Π΅Π· Kafka Connect REST API;
  • connector.class β€” ΠΊΠ»Π°ΡΡŠΡ‚ Π½Π° Π‘Π£Π‘Π” ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚ конфигурирания ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€;
  • plugin.name Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° плъгина Π·Π° логичСско Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ WAL Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. ΠŸΡ€Π΅Π΄Π»Π°Π³Π° сС Π·Π° ΠΈΠ·Π±ΠΎΡ€ wal2json, decoderbuffs ΠΈ pgoutput. ΠŸΡŠΡ€Π²ΠΈΡ‚Π΅ Π΄Π²Π΅ изискват инсталиранСто Π½Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² Π‘Π£Π‘Π” ΠΈ pgoutput Π·Π° PostgreSQL вСрсия 10 ΠΈ ΠΏΠΎ-Π½ΠΎΠ²Π° Π½Π΅ изисква Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΠΈ;
  • database.* β€” ΠΎΠΏΡ†ΠΈΠΈ Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ към Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ database.server.name - ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° СкзСмпляра Π½Π° PostgreSQL, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π΅ΠΌΠ°Ρ‚Π° Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° Kafka;
  • table.include.list - списък с Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, Π² ΠΊΠΎΠΈΡ‚ΠΎ искамС Π΄Π° прослСдявамС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅; Π΄Π°Π΄Π΅Π½ΠΈ във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° schema.table_name; Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π°Π΅Π΄Π½ΠΎ с table.exclude.list;
  • heartbeat.interval.ms β€” ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» (Π² милисСкунди), с ΠΊΠΎΠΉΡ‚ΠΎ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° ΡΡŠΡ€Π΄Π΅Ρ‡Π½ΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π΄ΠΎ спСциална Ρ‚Π΅ΠΌΠ°;
  • heartbeat.action.query - заявка, която Ρ‰Π΅ сС изпълнява ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° всяко ΡΡŠΡ€Π΄Π΅Ρ‡Π½ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ (опцията сС появи ΠΎΡ‚ вСрсия 1.1);
  • slot.name β€” ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° слота Π·Π° рСпликация, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π°;
  • publication.name - ИмС ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π² PostgreSQL, ΠΊΠΎΠΉΡ‚ΠΎ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°. Π’ случай, Ρ‡Π΅ Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°, Debezium Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π° Π΄Π° Π³ΠΎ създадС. Ако потрСбитСлят, ΠΏΠΎΠ΄ ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π°, няма Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ ΠΏΡ€Π°Π²Π° Π·Π° Ρ‚ΠΎΠ²Π° дСйствиС, ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ ΠΈΠ·Π»Π΅Π·Π΅ с Π³Ρ€Π΅ΡˆΠΊΠ°;
  • transforms опрСдСля ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° Ρ‚Π΅ΠΌΠ°:
    • transforms.AddPrefix.type ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ рСгулярни ΠΈΠ·Ρ€Π°Π·ΠΈ;
    • transforms.AddPrefix.regex β€” маска, Ρ‡Ρ€Π΅Π· която сС ΠΏΡ€Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° Ρ‚Π΅ΠΌΠ°;
    • transforms.AddPrefix.replacement - Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅.

ΠŸΠΎΠ²Π΅Ρ‡Π΅ Π·Π° ΡΡŠΡ€Π΄Π΅Ρ‡Π½ΠΈΡ Ρ€ΠΈΡ‚ΡŠΠΌ ΠΈ трансформациитС

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° Π΄Π°Π½Π½ΠΈ Π½Π° Kafka Π·Π° всяка Π°Π½Π³Π°ΠΆΠΈΡ€Π°Π½Π° транзакция ΠΈ записва нСйния LSN (ΠΏΠΎΡ€Π΅Π΄Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΆΡƒΡ€Π½Π°Π») Π² Ρ‚Π΅ΠΌΠ°Ρ‚Π° Π½Π° услугата offset. Но ΠΊΠ°ΠΊΠ²ΠΎ сС случва, Π°ΠΊΠΎ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ Π΄Π° Ρ‡Π΅Ρ‚Π΅ Π½Π΅ цялата Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Π° само част ΠΎΡ‚ Π½Π΅ΠΉΠ½ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ (Π² ΠΊΠΎΠΈΡ‚ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ сС Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ рядко)?

  • ΠšΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ Ρ‡Π΅Ρ‚Π΅ WAL Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ няма Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² тях към Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ наблюдава.
  • Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ няма Π΄Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π° Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° си позиция Π½ΠΈΡ‚ΠΎ Π² Ρ‚Π΅ΠΌΠ°Ρ‚Π°, Π½ΠΈΡ‚ΠΎ Π² слота Π·Π° рСпликация.
  • Π’ΠΎΠ²Π°, ΠΎΡ‚ своя страна, Ρ‰Π΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ "Π·Π°Π»Π΅ΠΏΠ²Π°Π½Π΅" Π½Π° WAL Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° диска ΠΈ вСроятно дисковото ΠΈΠΌ пространство Ρ‰Π΅ ΡΠ²ΡŠΡ€ΡˆΠΈ.

И Ρ‚ΡƒΠΊ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ ΠΈΠ΄Π²Π°Ρ‚ ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅. heartbeat.interval.ms ΠΈ heartbeat.action.query. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π΅Π·ΠΈ ΠΎΠΏΡ†ΠΈΠΈ ΠΏΠΎ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΏΡ€Π°Π²ΠΈ възмоТно ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° заявка Π·Π° промяна Π½Π° Π΄Π°Π½Π½ΠΈ Π² ΠΎΡ‚Π΄Π΅Π»Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° всСки ΠΏΡŠΡ‚, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° ΡΡŠΡ€Π΄Π΅Ρ‡Π½ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠ° LSN, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° сС Π½Π°ΠΌΠΈΡ€Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ (Π² слота Π·Π° рСпликация), сС Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π° постоянно. Π’ΠΎΠ²Π° позволява Π½Π° Π‘Π£Π‘Π” Π΄Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π° WAL Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π½Π΅ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ. Π—Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ информация ΠΊΠ°ΠΊ работят ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅, Π²ΠΈΠΆΡ‚Π΅ докумСнтация.

Π”Ρ€ΡƒΠ³ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠΎΠΉΡ‚ΠΎ заслуТава ΠΏΠΎ-голямо Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π΅ transforms. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ става Π΄ΡƒΠΌΠ° ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° удобство ΠΈ красота...

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Debezium създава Ρ‚Π΅ΠΌΠΈ, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° слСдната ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π·Π° ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½Π΅: serverName.schemaName.tableName. Π’ΠΎΠ²Π° Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Настроики transforms ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ рСгулярни ΠΈΠ·Ρ€Π°Π·ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ списък ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, Ρ‡ΠΈΠΈΡ‚ΠΎ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ насочСни към Ρ‚Π΅ΠΌΠ° с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΈΠΌΠ΅.

Π’ Π½Π°ΡˆΠ°Ρ‚Π° конфигурация Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° transforms сС случва слСдното: всички CDC ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΎΡ‚ прослСдяваната Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ‰Π΅ ΠΎΡ‚ΠΈΠ΄Π°Ρ‚ Π² Ρ‚Π΅ΠΌΠ°Ρ‚Π° с ΠΈΠΌΠ΅Ρ‚ΠΎ data.cdc.dbname. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай (Π±Π΅Π· Ρ‚Π΅Π·ΠΈ настройки), Debezium ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Ρ‰Π΅ създадС Ρ‚Π΅ΠΌΠ° Π·Π° всяка Ρ‚Π°Π±Π»ΠΈΡ†Π° Π½Π° формуляра: pg-dev.public.<table_name>.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π°

Π’ края Π½Π° описаниСто Π½Π° конфигурацията Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° Π·Π° PostgreSQL си струва Π΄Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° слСднитС характСристики / ограничСния Π½Π° Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π°:

  1. Ѐункционалността Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° Π·Π° PostgreSQL Ρ€Π°Π·Ρ‡ΠΈΡ‚Π° Π½Π° концСпцията Π·Π° логичСско Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ Ρ‚ΠΎΠΉ Π½Π΅ прослСдява заявки Π·Π° промяна Π½Π° структурата Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ (DDL) - ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ няма Π΄Π° Π³ΠΈ ΠΈΠΌΠ° Π² Ρ‚Π΅ΠΌΠΈΡ‚Π΅.
  2. Въй ΠΊΠ°Ρ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ слотовС Π·Π° рСпликация, ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° Π΅ възмоТно само към главния СкзСмпляр Π½Π° Π‘Π£Π‘Π”.
  3. Ако потрСбитСлят, ΠΏΠΎΠ΄ ΠΊΠΎΠΉΡ‚ΠΎ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ сС ΡΠ²ΡŠΡ€Π·Π²Π° към Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, ΠΈΠΌΠ° ΠΏΡ€Π°Π²Π° само Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅, Ρ‚ΠΎΠ³Π°Π²Π° ΠΏΡ€Π΅Π΄ΠΈ ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ стартиранС Ρ‰Π΅ трябва Ρ€ΡŠΡ‡Π½ΠΎ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ слот Π·Π° рСпликация ΠΈ Π΄Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ‚Π΅ Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ.

ΠŸΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° конфигурация

Π’Π°ΠΊΠ° Ρ‡Π΅ Π½Π΅ΠΊΠ° Π·Π°Ρ€Π΅Π΄ΠΈΠΌ Π½Π°ΡˆΠ°Ρ‚Π° конфигурация Π² ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π°:

curl -i -X POST -H "Accept:application/json" 
  -H  "Content-Type:application/json"  http://localhost:8083/connectors/ 
  -d @pg-con.json

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ изтСглянСто Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π΅ стартиран:

$ curl -i http://localhost:8083/connectors/pg-connector/status 
HTTP/1.1 200 OK
Date: Thu, 17 Sep 2020 20:19:40 GMT
Content-Type: application/json
Content-Length: 175
Server: Jetty(9.4.20.v20190813)

{"name":"pg-connector","connector":{"state":"RUNNING","worker_id":"172.24.0.5:8083"},"tasks":[{"id":0,"state":"RUNNING","worker_id":"172.24.0.5:8083"}],"type":"source"}

Π‘Ρ‚Ρ€Π°Ρ…ΠΎΡ‚Π½ΠΎ: настроСн Π΅ ΠΈ Π³ΠΎΡ‚ΠΎΠ² Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°. Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° сС прСструвамС, Ρ‡Π΅ смС ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΈ сС ΡΠ²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ с Kafka, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ добавямС ΠΈ промСнямС запис Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°:

$ kafka/bin/kafka-console-consumer.sh 
  --bootstrap-server kafka:9092 
  --from-beginning 
  --property print.key=true 
  --topic data.cdc.dbname

postgres=# insert into customers (id, first_name, last_name, email) values (1005, 'foo', 'bar', '[email protected]');
INSERT 0 1
postgres=# update customers set first_name = 'egg' where id = 1005;
UPDATE 1

Π’ Π½Π°ΡˆΠ°Ρ‚Π° Ρ‚Π΅ΠΌΠ° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ сС ΠΏΠΎΠΊΠ°ΠΆΠ΅, ΠΊΠ°ΠΊΡ‚ΠΎ слСдва:

Много дълъг JSON с Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ

{
"schema":{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
}
],
"optional":false,
"name":"data.cdc.dbname.Key"
},
"payload":{
"id":1005
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"before"
},
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"after"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"version"
},
{
"type":"string",
"optional":false,
"field":"connector"
},
{
"type":"string",
"optional":false,
"field":"name"
},
{
"type":"int64",
"optional":false,
"field":"ts_ms"
},
{
"type":"string",
"optional":true,
"name":"io.debezium.data.Enum",
"version":1,
"parameters":{
"allowed":"true,last,false"
},
"default":"false",
"field":"snapshot"
},
{
"type":"string",
"optional":false,
"field":"db"
},
{
"type":"string",
"optional":false,
"field":"schema"
},
{
"type":"string",
"optional":false,
"field":"table"
},
{
"type":"int64",
"optional":true,
"field":"txId"
},
{
"type":"int64",
"optional":true,
"field":"lsn"
},
{
"type":"int64",
"optional":true,
"field":"xmin"
}
],
"optional":false,
"name":"io.debezium.connector.postgresql.Source",
"field":"source"
},
{
"type":"string",
"optional":false,
"field":"op"
},
{
"type":"int64",
"optional":true,
"field":"ts_ms"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"id"
},
{
"type":"int64",
"optional":false,
"field":"total_order"
},
{
"type":"int64",
"optional":false,
"field":"data_collection_order"
}
],
"optional":true,
"field":"transaction"
}
],
"optional":false,
"name":"data.cdc.dbname.Envelope"
},
"payload":{
"before":null,
"after":{
"id":1005,
"first_name":"foo",
"last_name":"bar",
"email":"[email protected]"
},
"source":{
"version":"1.2.3.Final",
"connector":"postgresql",
"name":"dbserver1",
"ts_ms":1600374991648,
"snapshot":"false",
"db":"postgres",
"schema":"public",
"table":"customers",
"txId":602,
"lsn":34088472,
"xmin":null
},
"op":"c",
"ts_ms":1600374991762,
"transaction":null
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
}
],
"optional":false,
"name":"data.cdc.dbname.Key"
},
"payload":{
"id":1005
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"before"
},
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"after"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"version"
},
{
"type":"string",
"optional":false,
"field":"connector"
},
{
"type":"string",
"optional":false,
"field":"name"
},
{
"type":"int64",
"optional":false,
"field":"ts_ms"
},
{
"type":"string",
"optional":true,
"name":"io.debezium.data.Enum",
"version":1,
"parameters":{
"allowed":"true,last,false"
},
"default":"false",
"field":"snapshot"
},
{
"type":"string",
"optional":false,
"field":"db"
},
{
"type":"string",
"optional":false,
"field":"schema"
},
{
"type":"string",
"optional":false,
"field":"table"
},
{
"type":"int64",
"optional":true,
"field":"txId"
},
{
"type":"int64",
"optional":true,
"field":"lsn"
},
{
"type":"int64",
"optional":true,
"field":"xmin"
}
],
"optional":false,
"name":"io.debezium.connector.postgresql.Source",
"field":"source"
},
{
"type":"string",
"optional":false,
"field":"op"
},
{
"type":"int64",
"optional":true,
"field":"ts_ms"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"id"
},
{
"type":"int64",
"optional":false,
"field":"total_order"
},
{
"type":"int64",
"optional":false,
"field":"data_collection_order"
}
],
"optional":true,
"field":"transaction"
}
],
"optional":false,
"name":"data.cdc.dbname.Envelope"
},
"payload":{
"before":{
"id":1005,
"first_name":"foo",
"last_name":"bar",
"email":"[email protected]"
},
"after":{
"id":1005,
"first_name":"egg",
"last_name":"bar",
"email":"[email protected]"
},
"source":{
"version":"1.2.3.Final",
"connector":"postgresql",
"name":"dbserver1",
"ts_ms":1600375609365,
"snapshot":"false",
"db":"postgres",
"schema":"public",
"table":"customers",
"txId":603,
"lsn":34089688,
"xmin":null
},
"op":"u",
"ts_ms":1600375609778,
"transaction":null
}
}

И Π² Π΄Π²Π°Ρ‚Π° случая записитС сС ΡΡŠΡΡ‚ΠΎΡΡ‚ ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡Π° (PK) Π½Π° записа, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½, ΠΈ самата ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅: какъв Π΅ Π±ΠΈΠ» Π·Π°ΠΏΠΈΡΡŠΡ‚ ΠΏΡ€Π΅Π΄ΠΈ ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ станал слСд Ρ‚ΠΎΠ²Π°.

  • Π’ случай Π½Π° INSERT: стойност ΠΏΡ€Π΅Π΄ΠΈ (before) Ρ€Π°Π²Π½ΠΎ Π½Π° nullпослСдвано ΠΎΡ‚ Π²ΠΌΡŠΠΊΠ½Π°Ρ‚ΠΈΡ Π½ΠΈΠ·.
  • Π’ случай Π½Π° UPDATE: v payload.before ΠΏΠΎΠΊΠ°Π·Π²Π° сС ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° Ρ€Π΅Π΄Π° ΠΈ Π² payload.after - Π½ΠΎΠ² със ΡΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° промяната.

2.2 MongoDB

Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° стандартния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° рСпликация Π½Π° MongoDB, ΠΊΠ°Ρ‚ΠΎ Ρ‡Π΅Ρ‚Π΅ информация ΠΎΡ‚ oplog Π½Π° основния възСл Π½Π° Π‘Π£Π‘Π”.

Подобно Π½Π° Π²Π΅Ρ‡Π΅ описания ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ Π·Π° PgSQL, ΠΈ Ρ‚ΡƒΠΊ ΠΏΡ€ΠΈ ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ стартиранС сС ΠΏΡ€Π°Π²ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π½Π° снимка Π½Π° ΠΏΡŠΡ€Π²ΠΈΡ‡Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° oplog.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° конфигурация:

{
"name": "mp-k8s-mongo-connector",
"config": {
"connector.class": "io.debezium.connector.mongodb.MongoDbConnector",
"tasks.max": "1",
"mongodb.hosts": "MainRepSet/mongo:27017",
"mongodb.name": "mongo",
"mongodb.user": "debezium",
"mongodb.password": "dbname",
"database.whitelist": "db_1,db_2",
"transforms": "AddPrefix",
"transforms.AddPrefix.type": "org.apache.kafka.connect.transforms.RegexRouter",
"transforms.AddPrefix.regex": "mongo.([a-zA-Z_0-9]*).([a-zA-Z_0-9]*)",
"transforms.AddPrefix.replacement": "data.cdc.mongo_$1"
}
}

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, няма Π½ΠΎΠ²ΠΈ ΠΎΠΏΡ†ΠΈΠΈ Π² сравнСниС с ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎ само броят Π½Π° ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅, ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π½ΠΈ Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ към Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ прСфикси, Π΅ Π½Π°ΠΌΠ°Π»Π΅Π½.

Настройки transforms Ρ‚ΠΎΠ·ΠΈ ΠΏΡŠΡ‚ правят слСдното: ΠΎΠ±Ρ€ΡŠΡ‰Π°Ρ‚ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° Ρ‚Π΅ΠΌΠ° ΠΎΡ‚ схСмата <server_name>.<db_name>.<collection_name> Π² data.cdc.mongo_<db_name>.

отказоустойчивост

Π’ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Π·Π° толСрантността към Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ високата Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΎΡΡ‚ Π² нашС Π²Ρ€Π΅ΠΌΠ΅ Π΅ ΠΏΠΎ-ΠΎΡΡ‚ΡŠΡ€ ΠΎΡ‚ всякога - особСно ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π° прослСдяванСто Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π΅ Π΅ настрана ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π²ΡŠΠΏΡ€ΠΎΡ. НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΎΠ±ΡŠΡ€ΠΊΠ° ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ сС случи с Debezium във всСки ΠΎΡ‚Π΄Π΅Π»Π΅Π½ случай.

Има Ρ‚Ρ€ΠΈ ΠΎΠΏΡ†ΠΈΠΈ Π·Π° ΠΎΡ‚ΠΊΠ°Π·:

  1. Kafka Connect Π³Ρ€Π΅ΡˆΠΊΠ°. Ако Connect Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π² Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ, Ρ‚ΠΎΠ²Π° изисква няколко Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ†ΠΈ Π΄Π° Π·Π°Π΄Π°Π΄Π°Ρ‚ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ group.id. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π°, Π°ΠΊΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ тях сС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈ, ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ бъдС рСстартиран Π½Π° другия Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊ ΠΈ Ρ‰Π΅ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π΄Π° Ρ‡Π΅Ρ‚Π΅ ΠΎΡ‚ послСдната Π°Π½Π³Π°ΠΆΠΈΡ€Π°Π½Π° позиция Π² Ρ‚Π΅ΠΌΠ°Ρ‚Π° Π² Kafka.
  2. Π—Π°Π³ΡƒΠ±Π° Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ° с ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ Kafka. ΠšΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ просто Ρ‰Π΅ спрС Π΄Π° Ρ‡Π΅Ρ‚Π΅ Π½Π° позицията, която Π½Π΅ Π΅ успял Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ Π½Π° Kafka ΠΈ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π²Π° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ ΠΎΡ‚Π½ΠΎΠ²ΠΎ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ ΠΎΠΏΠΈΡ‚ΡŠΡ‚ успСС.
  3. Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΡŠΡ‚ Π½Π° Π΄Π°Π½Π½ΠΈ Π΅ Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½. ΠšΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π° Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ към ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° спорСд конфигурацията. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π΅ 16 ΠΎΠΏΠΈΡ‚Π° СкспонСнциално ΠΎΡ‚ΡΡ‚ΡŠΠΏΠ»Π΅Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ 16-ия Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ΅Π½ ΠΎΠΏΠΈΡ‚ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Ρ‰Π΅ бъдС ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½Π° ΠΊΠ°Ρ‚ΠΎ ΠΠ΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ Ρ‰Π΅ трябва Π΄Π° сС рСстартира Ρ€ΡŠΡ‡Π½ΠΎ Ρ‡Ρ€Π΅Π· интСрфСйса Kafka Connect REST.
    • Π’ случай Π½Π° PostgreSQL Π΄Π°Π½Π½ΠΈΡ‚Π΅ няма Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π·Π°Π³ΡƒΠ±Π΅Π½ΠΈ, Ρ‚.ΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° слотовС Π·Π° рСпликация Ρ‰Π΅ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° WAL Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ΠΈ ΠΎΡ‚ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π°. Π’ Ρ‚ΠΎΠ·ΠΈ случай ΠΈΠΌΠ° Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ: Π°ΠΊΠΎ ΠΌΡ€Π΅ΠΆΠΎΠ²Π°Ρ‚Π° ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎΡΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ Π‘Π£Π‘Π” Π΅ ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚Π° Π·Π° дълго Π²Ρ€Π΅ΠΌΠ΅, ΠΈΠΌΠ° вСроятност дисковото пространство Π΄Π° ΡΠ²ΡŠΡ€ΡˆΠΈ ΠΈ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΎΡ‚ΠΊΠ°Π· Π½Π° цялата Π‘Π£Π‘Π”.
    • Π’ случай Π½Π° MySQL binlog Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ€ΠΎΡ‚ΠΈΡ€Π°Π½ΠΈ ΠΎΡ‚ самата Π‘Π£Π‘Π”, ΠΏΡ€Π΅Π΄ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π΄Π° бъдС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²Π΅Π½Π°. Π’ΠΎΠ²Π° Ρ‰Π΅ Π½Π°ΠΊΠ°Ρ€Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ Π² Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ ΠΈ Ρ‰Π΅ трябва Π΄Π° сС рСстартира Π² ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚Π½Π° снимка, Π·Π° Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π΄Π° Ρ‡Π΅Ρ‚Π΅ ΠΎΡ‚ binlogs, Π·Π° Π΄Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π°.
    • Около MongoDB. Π’ докумСнтацията сС ΠΊΠ°Π·Π²Π°: ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° Π² случай, Ρ‡Π΅ log/oplog Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ са ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ ΠΈ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π΄Π° Ρ‡Π΅Ρ‚Π΅ ΠΎΡ‚ позицията, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅ спрял, Π΅ Π΅Π΄Π½Π°ΠΊΠ²ΠΎ Π·Π° всички Π‘Π£Π‘Π”. Π’ΠΎΠ²Π° сС ΠΊΡ€ΠΈΠ΅ във Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ Π² ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ ΠΠ΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ Ρ‰Π΅ изисква рСстартиранС Π² Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚Π½Π° снимка.

      Има ΠΎΠ±Π°Ρ‡Π΅ ΠΈ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Ако ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π΅ Π±ΠΈΠ» Π² ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π·Π° дълго Π²Ρ€Π΅ΠΌΠ΅ (ΠΈΠ»ΠΈ Π½Π΅ Π΅ могъл Π΄Π° достигнС СкзСмпляра Π½Π° MongoDB) ΠΈ oplog Π΅ Π±ΠΈΠ» Π·Π°Π²ΡŠΡ€Ρ‚ΡΠ½ ΠΏΡ€Π΅Π· Ρ‚ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅, Ρ‚ΠΎΠ³Π°Π²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° бъдС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²Π΅Π½Π°, ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ спокойно Π΄Π° Ρ‡Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ ΠΏΡŠΡ€Π²Π°Ρ‚Π° Π½Π°Π»ΠΈΡ‡Π½Π° позиция , ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠ΅Ρ‚ΠΎ някои ΠΎΡ‚ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² ΠšΠ°Ρ„ΠΊΠ° Π½Π΅ Ρ‰Π΅ ΡƒΠ΄Π°Ρ€ΠΈ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Debezium Π΅ ΠΏΡŠΡ€Π²ΠΈΡΡ‚ ΠΌΠΈ ΠΎΠΏΠΈΡ‚ с CDC систСми ΠΈ ΠΊΠ°Ρ‚ΠΎ цяло бСшС ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π΅Π½. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ ΠΏΠΎΠ΄ΠΊΡƒΠΏΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° основната Π‘Π£Π‘Π”, Π»Π΅ΠΊΠΎΡ‚Π° Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅, ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈΡ€Π°Π½Π΅ ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Π° общност. Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС интСрСсуват ΠΎΡ‚ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°Ρ‚Π°, ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²Π°Ρ‚Π° Π·Π° Kafka Connect ΠΈ Π”Π΅Π±Π΅Π·ΠΈΡƒΠΌ.

Π’ сравнСниС с JDBC ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° Π·Π° Kafka Connect, основното прСдимство Π½Π° Debezium Π΅, Ρ‡Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ сС Ρ‡Π΅Ρ‚Π°Ρ‚ ΠΎΡ‚ рСгистрационнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° Π‘Π£Π‘Π”, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ забавянС. JDBC Connector (прСдоставСн ΠΎΡ‚ Kafka Connect) ΠΏΡ€Π°Π²ΠΈ запитвания към прослСдяваната Ρ‚Π°Π±Π»ΠΈΡ†Π° Π½Π° фиксиран ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΈ (ΠΏΠΎΡ€Π°Π΄ΠΈ ΡΡŠΡ‰Π°Ρ‚Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°) Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ сС ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ (ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ заявки Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са Ρ‚Π°ΠΌ?).

Π—Π° Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° слСднитС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ (Π² допълнСниС към Debezium):

PS

ΠŸΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π² нашия Π±Π»ΠΎΠ³:

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€