Π ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ°ΡΡΠΎ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ Π½ΠΎΠ²ΡΠΌΠΈ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ/ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°ΠΌΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΊΠΎΡΠΎΡΡΡ
Π² ΡΡΡΡΠΊΠΎΡΠ·ΡΡΠ½ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΌΠ°Π»ΠΎ. ΠΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ΠΉ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡ Π²ΠΎΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠ±Π΅Π» ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΈΠ· ΡΠ²ΠΎΠ΅ΠΉ Π½Π΅Π΄Π°Π²Π½Π΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΡ CDC-ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈΠ· Π΄Π²ΡΡ
ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ
Π‘Π£ΠΠ (PostgreSQL ΠΈ MongoDB) Π² ΠΊΠ»Π°ΡΡΠ΅Ρ Kafka ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Debezium. ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠ° ΠΎΠ±Π·ΠΎΡΠ½Π°Ρ ΡΡΠ°ΡΡΡ, ΠΏΠΎΡΠ²ΠΈΠ²ΡΠ°ΡΡΡ ΠΏΠΎ ΠΈΡΠΎΠ³Π°ΠΌ ΠΏΡΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ, ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈ Π΄ΡΡΠ³ΠΈΠΌ.
Π§ΡΠΎ Π·Π° Debezium ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ CDC?
ΠΡΠΎ
ΠΡΠ»ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ CDC Ρ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ (ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π‘Π£ΠΠ Π½Π°ΠΏΡΡΠΌΡΡ), ΡΠΎ ΠΊ Π΅Π³ΠΎ Π³Π»Π°Π²Π½ΡΠΌ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°ΠΌ ΠΎΡΠ½ΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΡΠΈΠΌΠΈΠ½Π³Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΡΡΠΎΠΊ Ρ Π½ΠΈΠ·ΠΊΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ, Π²ΡΡΠΎΠΊΠΎΠΉ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΡΡ ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡΡ. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π° ΠΏΡΠ½ΠΊΡΠ° Π΄ΠΎΡΡΠΈΠ³Π°ΡΡΡΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Kafka Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° CDC-ΡΠΎΠ±ΡΡΠΈΠΉ.
Π’Π°ΠΊΠΆΠ΅ ΠΊ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ½Π΅ΡΡΠΈ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΅Π΄ΠΈΠ½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΠΏΡΠΈΠ΄ΡΡΡΡ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΎ Π½ΡΠ°Π½ΡΠ°Ρ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π‘Π£ΠΠ.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΡΠΎΠΊΠ΅ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΎΡΡΠΎΡ Π΄Π»Ρ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π΄Π°Π½Π½ΡΡ . ΠΡΠΈ ΡΡΠΎΠΌ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π½Π° ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π΄Π°Π½Π½ΡΡ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π΅ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ· Π‘Π£ΠΠ, Π° ΠΈΠ· ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Kafka.
ΠΠ± Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ Debezium
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Debezium ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΡ Π΅ΠΌΠ΅:
Π‘Π£ΠΠ (ΠΊΠ°ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π΄Π°Π½Π½ΡΡ ) β ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π² Kafka Connect β Apache Kafka β ΠΊΠΎΠ½ΡΡΡΠΌΠ΅Ρ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ²Π΅Π΄Ρ ΡΡ Π΅ΠΌΡ Ρ ΡΠ°ΠΉΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠ° ΡΡ
Π΅ΠΌΠ° ΠΌΠ½Π΅ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π½ΡΠ°Π²ΠΈΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΡΡΡ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅, ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ sink-ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ°.
Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΆΠ΅ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ: Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Π°ΡΠ΅Π³ΠΎ Data Lake (ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π·Π²Π΅Π½ΠΎ Π½Π° ΡΡ Π΅ΠΌΠ΅ Π²ΡΡΠ΅) Ββ ΡΡΠΎ Π½Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Debezium. Π‘ΠΎΠ±ΡΡΠΈΡ, ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π² Apache Kafka, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²Π°ΡΠΈΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
- ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π΅Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΠΊΡΡΠ°;
- ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ;
- ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²;
- Π½Π΅ΠΊΠΎΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π»ΠΎΠ³ΠΎΠ² Π°ΡΠ΄ΠΈΡΠ°;
- β¦
Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Java ΠΈ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ/Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡΠ΅Ρ Kafka, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ΅Π·
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ°
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΠΉ Π³Π»Π°Π²Π½ΠΎΠΉ ΡΠ΅Π½Π½ΠΎΡΡΠΈ β Π΄Π°Π½Π½ΡΡ , β Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ:
- ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π»ΡΡΡΡΡ MySQL Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ 5.7, PostgreSQL 9.6+, MongoDB 3.2+ (
ΠΏΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ); - ΠΊΠ»Π°ΡΡΠ΅Ρ Apache Kafka;
- ΠΈΠ½ΡΡΠ°Π½Ρ Kafka Connect (Π²Π΅ΡΡΠΈΠΈ 1.x, 2.x);
- ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Debezium.
Π Π°Π±ΠΎΡΡ ΠΏΠΎ ΠΏΠ΅ΡΠ²ΡΠΌ Π΄Π²ΡΠΌ ΠΏΡΠ½ΠΊΡΠ°ΠΌ, Ρ.Π΅. ΠΏΡΠΎΡΠ΅ΡΡ ΠΈΠ½ΡΡΠ°Π»Π»ΡΡΠΈΠΈ Π‘Π£ΠΠ ΠΈ Apache Kafka, Π²ΡΡ
ΠΎΠ΄ΡΡ Π·Π° ΡΠ°ΠΌΠΊΠΈ ΡΡΠ°ΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ Ρ
ΠΎΡΠ΅Ρ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ Π²ΡΡ Π² ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΠ΅, Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ Π΅ΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠΉ
ΠΡ ΠΆΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π½Π° Π΄Π²ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΡΠ½ΠΊΡΠ°Ρ .
0. Kafka Connect
ΠΠ΄Π΅ΡΡ ΠΈ Π΄Π°Π»Π΅Π΅ Π² ΡΡΠ°ΡΡΠ΅ Π²ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Docker-ΠΎΠ±ΡΠ°Π·Π°, ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ Debezium. ΠΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² (ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΡ) ΠΈ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Kafka Connect ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Kafka Connect ΠΎΡ Confluent, ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ
ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠΎΠ² Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π² plugin.path
ΠΈΠ»ΠΈ Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ CLASSPATH
. ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π²ΠΎΡΠΊΠ΅ΡΠ° Kafka Connect ΠΈ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠΎΠ² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π·Π°ΠΏΡΡΠΊΠ° Π²ΠΎΡΠΊΠ΅ΡΠ°. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠΌ. Π²
ΠΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ Debeizum Π² Π²Π°ΡΠΈΠ°Π½ΡΠ΅ Ρ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠΎΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² Π΄Π²Π° ΡΡΠ°ΠΏΠ°. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ :
1. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Kafka Connect
ΠΠ»Ρ ΡΡΡΠΈΠΌΠΈΠ½Π³Π° Π΄Π°Π½Π½ΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅Ρ Apache Kafka Π²ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ΅ Kafka Connect Π·Π°Π΄Π°ΡΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ:
- ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΊΠ»Π°ΡΡΠ΅ΡΡ,
- Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠΎΠΏΠΈΠΊΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ°,
- ΠΈΠΌΡ Π³ΡΡΠΏΠΏΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π·Π°ΠΏΡΡΠ΅Π½ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ (Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ distributed-ΡΠ΅ΠΆΠΈΠΌΠ°).
ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ 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
β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ Π²ΠΎΡΠΊΠ΅ΡΠΎΠ², Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ°; Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ (distributed) ΡΠ΅ΠΆΠΈΠΌΠ°.
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ ΡΡΠΈΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ:
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 ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ
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 ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ registry Π·Π° Π½Π΅Π³ΠΎ Π²ΡΡ ΠΎΠ΄ΡΡ Π·Π° ΡΠ°ΠΌΠΊΠΈ ΡΡΠ°ΡΡΠΈ β Π΄Π°Π»Π΅Π΅ Π΄Π»Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡΠΈ ΠΌΡ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ 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"
}
}
ΠΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ° ΠΏΠΎΡΠ»Π΅ ΡΠ°ΠΊΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡ:
- ΠΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ Π±Π°Π·Π΅, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ initial snapshot, ΠΎΡΠΏΡΠ°Π²Π»ΡΡ Π² Kafka Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ
, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ
Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ»ΠΎΠ²Π½ΠΎΠ³ΠΎ
SELECT * FROM table_name
. - ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½Π°, ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈΠ· WAL-ΡΠ°ΠΉΠ»ΠΎΠ² PostgreSQL.
ΠΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΎΠΏΡΠΈΡΡ :
-
name
β ΠΈΠΌΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ°, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅; Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΡΡΠΎ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠΎΠΌ (Ρ.Π΅. ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΡΡΠ°ΡΡΡΠ°/ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ) ΡΠ΅ΡΠ΅Π· REST API Kafka Connect; -
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-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΎΠΏΠΈΠΊ; -
heartbeat.action.query
β Π·Π°ΠΏΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ heartbeat-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ (ΠΎΠΏΡΠΈΡ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Ρ Π²Π΅ΡΡΠΈΠΈ 1.1); -
slot.name
β ΠΈΠΌΡ ΡΠ»ΠΎΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠΎΠΌ; publication.name
β ΠΈΠΌΡΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π² PostgreSQL, ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ. Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π΅Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, Debezium ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ Π΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ. Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΏΠΎΠ΄ ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠ°Π² Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ β ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ;-
transforms
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠΎΠΏΠΈΠΊΠ°:-
transforms.AddPrefix.type
ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ; -
transforms.AddPrefix.regex
β ΠΌΠ°ΡΠΊΠ°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠΎΠΏΠΈΠΊΠ°; -
transforms.AddPrefix.replacement
β Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΎ, Π½Π° ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ.
-
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΏΡΠΎ heartbeat ΠΈ transforms
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² Kafka ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΌΠΈΡΠ½ΡΡΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π° Π΅Ρ LSN (Log Sequence Number) Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠΉ ΡΠΎΠΏΠΈΠΊ offset
. ΠΠΎ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π½Π°ΡΡΡΠΎΠ΅Π½ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π²ΡΠ΅ΠΉ Π±Π°Π·Ρ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΠΈ Π΅Ρ ΡΠ°Π±Π»ΠΈΡ (Π² ΠΊΠΎΡΠΎΡΡΡ
ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π½Π΅ ΡΠ°ΡΡΠΎ)?
- ΠΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΡΠΈΡΠ°ΡΡ WAL-ΡΠ°ΠΉΠ»Ρ ΠΈ Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡ Π² Π½ΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ, Π·Π° ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΠ½ ΡΠ»Π΅Π΄ΠΈΡ.
- ΠΠΎΡΡΠΎΠΌΡ ΠΎΠ½ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΡΠ²ΠΎΡ ΡΠ΅ΠΊΡΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π½ΠΈ Π² ΡΠΎΠΏΠΈΠΊΠ΅, Π½ΠΈ Π² ΡΠ»ΠΎΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ.
- ΠΡΠΎ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ Β«ΡΠ΄Π΅ΡΠΆΠ°Π½ΠΈΡΒ» WAL-ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π° Π΄ΠΈΡΠΊΠ΅ ΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎΠΌΡ ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΈΡ Π²ΡΠ΅Π³ΠΎ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°.
Π ΡΡΡ Π½Π° ΠΏΠΎΠΌΠΎΡΡ ΠΏΡΠΈΡ
ΠΎΠ΄ΡΡ ΠΎΠΏΡΠΈΠΈ heartbeat.interval.ms
ΠΈ heartbeat.action.query
. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΈΡ
ΠΎΠΏΡΠΈΠΉ Π² ΠΏΠ°ΡΠ΅ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ heartbeat-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅. Π’Π΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ LSN, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ΅ΠΉΡΠ°Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ (Π² ΡΠ»ΠΎΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ). ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π‘Π£ΠΠ ΡΠ΄Π°Π»ΠΈΡΡ WAL-ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π½ΡΠΆΠ½Ρ. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ·Π½Π°ΡΡ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ ΠΎΠΏΡΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²
ΠΡΡΠ³Π°Ρ ΠΎΠΏΡΠΈΡ, Π΄ΠΎΡΡΠΎΠΉΠ½Π°Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ, β ΡΡΠΎ transforms
. Π₯ΠΎΡΡ ΠΎΠ½Π° ΡΠΊΠΎΡΠ΅Π΅ ΠΏΡΠΎ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΠΈ ΠΊΡΠ°ΡΠΎΡΡβ¦
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Debezium ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠΏΠΈΠΊΠΈ, ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ: serverName.schemaName.tableName
. ΠΡΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄ΠΎΠ±Π½ΠΎ. ΠΠΏΡΠΈΡΠΌΠΈ transforms
ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ
Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π±Π»ΠΈΡ, ΡΠ²Π΅Π½ΡΡ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
Π½ΡΠΆΠ½ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΠΎΠΏΠΈΠΊ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ.
Π Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ transforms
ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: Π²ΡΠ΅ CDC-ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ· ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΠ ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² ΡΠΎΠΏΠΈΠΊ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ data.cdc.dbname
. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ (Π±Π΅Π· ΡΡΠΈΡ
Π½Π°ΡΡΡΠΎΠ΅ΠΊ) Debezium ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±Ρ ΡΠΎΠ·Π΄Π°Π²Π°Π» ΠΏΠΎ ΡΠΎΠΏΠΈΠΊΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π²ΠΈΠ΄Π°: pg-dev.public.<table_name>
.
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ°
Π Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ° Π΄Π»Ρ PostgreSQL ΡΡΠΎΠΈΡ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ /ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ:
- Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ° Π΄Π»Ρ PostgreSQL ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΎΠ½ Π½Π΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΠ (DDL) β ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π² ΡΠΎΠΏΠΈΠΊΠ°Ρ ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
- Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ»ΠΎΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ Π²Π΅Π΄ΡΡΠ΅ΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π‘Π£ΠΠ.
- ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΏΠΎΠ΄ ΠΊΠΎΡΠΎΡΡΠΌ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ , Π²ΡΠ΄Π°Π½Ρ ΠΏΡΠ°Π²Π° ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅, ΡΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ²ΡΠΌ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΡΡΠ½ΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ»ΠΎΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π² ΠΠ.
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
ΠΡΠ°ΠΊ, Π·Π°Π³ΡΡΠ·ΠΈΠΌ Π½Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ:
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
: Π²payload.before
ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ, Π° Π²payload.after
β Π½ΠΎΠ²ΠΎΠ΅ Ρ ΡΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
2.2 MongoDB
ΠΡΠΎΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ MongoDB, ΡΡΠΈΡΡΠ²Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· oplog’Π° primary-ΡΠ·Π»Π° Π‘Π£ΠΠ.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΆΠ΅ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΡ Π΄Π»Ρ 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 Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΠ»ΡΡΠ°Π΅Π².
ΠΡΡΡ ΡΡΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΎΡΠΊΠ°Π·Π°:
- ΠΡΠΊΠ°Π· Kafka Connect. ΠΡΠ»ΠΈ Connect Π½Π°ΡΡΡΠΎΠ΅Π½ Π½Π° ΡΠ°Π±ΠΎΡΡ Π² ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ Π²ΠΎΡΠΊΠ΅ΡΠ°ΠΌ Π·Π°Π΄Π°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ group.id. Π’ΠΎΠ³Π΄Π° ΠΏΡΠΈ ΠΎΡΠΊΠ°Π·Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠ΅Π½ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ Π²ΠΎΡΠΊΠ΅ΡΠ΅ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΊΠΎΠΌΠΌΠΈΡΠ½ΡΡΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π² ΡΠΎΠΏΠΈΠΊΠ΅ Π² Kafka.
- ΠΠΎΡΠ΅ΡΡ ΡΠ²ΡΠ·Π½ΠΎΡΡΠΈ Ρ Kafka-ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠΌ. ΠΠΎΠ½Π½Π΅ΠΊΡΠΎΡ ΠΏΡΠΎΡΡΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π² Kafka, ΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΡΠ°ΡΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΅Ρ, ΠΏΠΎΠΊΠ° ΠΏΠΎΠΏΡΡΠΊΠ° Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΡΠΏΠ΅Ρ ΠΎΠΌ.
- ΠΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ
. ΠΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠΎ 16 ΠΏΠΎΠΏΡΡΠΎΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
exponential backoff . ΠΠΎΡΠ»Π΅ 16-ΠΉ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΉ ΠΏΠΎΠΏΡΡΠΊΠΈ ΡΠ°ΡΠΊ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ failed ΠΈ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΅Π³ΠΎ ΡΡΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΠ΅Π· REST-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Kafka Connect.- Π ΡΠ»ΡΡΠ°Π΅ Ρ PostgreSQL Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΠΏΡΠΎΠΏΠ°Π΄ΡΡ, Ρ.ΠΊ. ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΡΠΎΠ² ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π½Π΅ Π΄Π°ΡΡ ΡΠ΄Π°Π»ΠΈΡΡ WAL-ΡΠ°ΠΉΠ»Ρ, Π½Π΅ ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΠ΅ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠΎΠΌ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΅ΡΡΡ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½Π°Ρ ΡΡΠΎΡΠΎΠ½Π° ΠΌΠ΅Π΄Π°Π»ΠΈ: Π΅ΡΠ»ΠΈ Π½Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π±ΡΠ΄Π΅Ρ Π½Π°ΡΡΡΠ΅Π½Π° ΡΠ΅ΡΠ΅Π²Π°Ρ ΡΠ²ΡΠ·Π½ΠΎΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠΎΠΌ ΠΈ Π‘Π£ΠΠ, Π΅ΡΡΡ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ, ΡΡΠΎ ΠΌΠ΅ΡΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡΡ, Π° ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΎΡΠΊΠ°Π·Ρ Π‘Π£ΠΠ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ.
- Π ΡΠ»ΡΡΠ°Π΅ Ρ MySQL ΡΠ°ΠΉΠ»Ρ Π±ΠΈΠ½Π»ΠΎΠ³ΠΎΠ² ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΡΡΠΎΡΠΈΡΠΎΠ²Π°Π½Ρ ΡΠ°ΠΌΠΎΠΉ Π‘Π£ΠΠ ΡΠ°Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ²ΡΠ·Π½ΠΎΡΡΡ. ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ failed, Π° Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ initial snapshot Π΄Π»Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· Π±ΠΈΠ½Π»ΠΎΠ³ΠΎΠ².
- ΠΡΠΎ MongoDB. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π³Π»Π°ΡΠΈΡ: ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠ° Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ»Ρ ΠΆΡΡΠ½Π°Π»ΠΎΠ²/oplog’Π° Π±ΡΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½Ρ ΠΈ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ, Π³Π΄Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π΄Π»Ρ Π²ΡΠ΅Ρ
Π‘Π£ΠΠ. ΠΠ½ΠΎ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ failed ΠΈ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ initial snapshot.
ΠΠ΄Π½Π°ΠΊΠΎ Π±ΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠ»ΡΡ Π² ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ (ΠΈΠ»ΠΈ Π½Π΅ ΠΌΠΎΠ³ Π΄ΠΎΡΡΡΡΠ°ΡΡΡΡ Π΄ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° MongoDB), Π° oplog Π·Π° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΡΠ» ΡΠΎΡΠ°ΡΠΈΡ, ΡΠΎ ΠΏΡΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π½Π΅Π²ΠΎΠ·ΠΌΡΡΠΈΠΌΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ ΡΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ, ΠΈΠ·-Π·Π° ΡΠ΅Π³ΠΎ ΡΠ°ΡΡΡ Π΄Π°Π½Π½ΡΡ Π² Kafka Π½Π΅ ΠΏΠΎΠΏΠ°Π΄ΡΡ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Debezium β ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΎΠΏΡΡ ΡΠ°Π±ΠΎΡΡ Ρ CDC-ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ ΠΈ Π² ΡΠ΅Π»ΠΎΠΌ Π²Π΅ΡΡΠΌΠ° ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΉ. ΠΡΠΎΠ΅ΠΊΡ ΠΏΠΎΠ΄ΠΊΡΠΏΠΈΠ» ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
Π‘Π£ΠΠ, ΠΏΡΠΎΡΡΠΎΡΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎΠΌ. ΠΠ°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π²ΡΠΈΠΌΡΡ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ Π³Π°ΠΉΠ΄Π°ΠΌΠΈ Π΄Π»Ρ
ΠΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ JDBC-ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΠΎΠΌ Π΄Π»Ρ Kafka Connect ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ Debezium ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ ΠΈΠ· ΠΆΡΡΠ½Π°Π»ΠΎΠ² Π‘Π£ΠΠ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ. JDBC Connector (ΠΈΠ· ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ Kafka Connect) Π΄Π΅Π»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠΌ ΠΈ (ΠΏΠΎ ΡΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Π΅) Π½Π΅ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ (ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅Ρ?).
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡ ΠΎΠΆΠΈΡ Π·Π°Π΄Π°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ (ΠΏΠΎΠΌΠΈΠΌΠΎ Debezium):
-
JDBC Connector Kafka Connect; - ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ MySQL:
-
Oracle GoldenGate , Π½ΠΎ ΡΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³Π°Ρ Β«Π²Π΅ΡΠΎΠ²Π°Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΒ».
P.S.
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- Β«
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Kafka Π² Kubernetes Β»; - Β«
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΡΡΠΎΡΠΈΠΈ ΠΈΠ· Π½Π°ΡΠΈΡ SRE-Π±ΡΠ΄Π½Π΅ΠΉ. Π§Π°ΡΡΡ 2 Β»; - Β«
ΠΡΠ°ΡΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² PostgreSQL Π΄Π»Ρ Kubernetes, Π½Π°Ρ Π²ΡΠ±ΠΎΡ ΠΈ ΠΎΠΏΡΡ Β».
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com