Π ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΈ ΡΠ΅ΡΡΠΎ ΡΠ΅ Π½Π°ΡΡΠΊΠ²Π°ΠΌ Π½Π° Π½ΠΎΠ²ΠΈ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ / ΡΠΎΡΡΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΊΠΎΠΈΡΠΎ Π΅ Π΄ΠΎΡΡΠ° ΠΎΡΠΊΡΠ΄Π½Π° Π² ΡΡΡΠΊΠΎΠ΅Π·ΠΈΡΠ½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ. Π‘ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π° Π·Π°ΠΏΡΠ»Π½Ρ Π΅Π΄Π½Π° ΡΠ°ΠΊΠ°Π²Π° ΠΏΡΠ°Π·Π½ΠΈΠ½Π° Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡ ΠΌΠΎΡΡΠ° ΡΠΊΠΎΡΠΎΡΠ½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΡ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° CDC ΡΡΠ±ΠΈΡΠΈΡ ΠΎΡ Π΄Π²Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ Π‘Π£ΠΠ (PostgreSQL ΠΈ MongoDB) ΠΊΡΠΌ ΠΊΠ»ΡΡΡΠ΅Ρ Π½Π° Kafka, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Debezium. ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ ΠΎΠ±Π·ΠΎΡΠ½Π° ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π² ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠ²ΡΡΡΠ΅Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ°, ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π° Π·Π° Π΄ΡΡΠ³ΠΈ.
ΠΠ°ΠΊΠ²ΠΎ Π΅ Debezium ΠΈ CDC ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ?
Π’ΠΎ
ΠΠΊΠΎ ΡΡΠ°Π²Π½ΠΈΠΌ CDC Ρ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΈΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ (ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π‘Π£ΠΠ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ), ΡΠΎΠ³Π°Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΌΡ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° Π²ΠΊΠ»ΡΡΠ²Π°Ρ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΡΠΎΡΠ½ΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΡΠ΅Π΄ Ρ Π½ΠΈΡΠΊΠ° Π»Π°ΡΠ΅Π½ΡΠ½ΠΎΡΡ, Π²ΠΈΡΠΎΠΊΠ° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡ ΠΈ Π½Π°Π»ΠΈΡΠ½ΠΎΡΡ. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π΅ ΡΠΎΡΠΊΠΈ ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π°Ρ ΡΡΠ΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅Ρ Kafka ΠΊΠ°ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° CDC ΡΡΠ±ΠΈΡΠΈΡ.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° Π²ΠΊΠ»ΡΡΠ²Π°Ρ ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΌΠΎΠ΄Π΅Π» ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΊΡΠ°ΠΉΠ½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΡΠ΅Π²ΠΎΠΆΠΈ Π·Π° Π½ΡΠ°Π½ΡΠΈΡΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π‘Π£ΠΠ.
Π Π½Π°ΠΊΡΠ°Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π±ΡΠΎΠΊΠ΅Ρ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡΠ²Π°ΡΡ ΠΏΠΎΠ»Π΅ Π·Π° Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Ρ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π΄Π°Π½Π½ΠΈΡΠ΅. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π²ΡΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Π²ΡΡΡ Ρ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ Π΅ ΡΠ²Π΅Π΄Π΅Π½ΠΎ Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ Π½Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ Π‘Π£ΠΠ, Π° ΠΎΡ ΠΊΠ»ΡΡΡΠ΅ΡΠ° Kafka.
ΠΡΠ½ΠΎΡΠ½ΠΎ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Debezium
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Debezium ΡΠ΅ ΡΠ²Π΅ΠΆΠ΄Π° Π΄ΠΎ ΡΠ°Π·ΠΈ ΠΏΡΠΎΡΡΠ° ΡΡ Π΅ΠΌΠ°:
Π‘Π£ΠΠ (ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ) β ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ Π² Kafka Connect β Apache Kafka β ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»
ΠΠ°ΡΠΎ ΠΈΠ»ΡΡΡΡΠ°ΡΠΈΡ ΡΠ΅ Π΄Π°ΠΌ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° ΠΎΡ ΡΠ°ΠΉΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
Π’Π°Π·ΠΈ ΡΡ
Π΅ΠΌΠ° ΠΎΠ±Π°ΡΠ΅ Π½Π΅ ΠΌΠΈ Ρ
Π°ΡΠ΅ΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ, Π·Π°ΡΠΎΡΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΠ΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ ΡΠ°ΠΌΠΎ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ Π·Π° ΠΌΠΈΠ²ΠΊΠ°.
Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΡΠΈΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΡΠ°Π·Π»ΠΈΡΠ½Π°: Π·Π°ΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° Π²Π°ΡΠ΅ΡΠΎ 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 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, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅ ΠΎΡΠ΄Π΅Π»Π΅Π½
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 ΡΠΈ ΡΡΡΡΠ²Π° Π΄Π° Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ / ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ°:
- Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π·Π° 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
: vpayload.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 Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ.
ΠΠΌΠ° ΡΡΠΈ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΎΡΠΊΠ°Π·:
- Kafka Connect Π³ΡΠ΅ΡΠΊΠ°. ΠΠΊΠΎ Connect Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π² ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ, ΡΠΎΠ²Π° ΠΈΠ·ΠΈΡΠΊΠ²Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈ Π΄Π° Π·Π°Π΄Π°Π΄Π°Ρ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ group.id. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, Π°ΠΊΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ ΡΠ΅ ΠΏΡΠΎΠ²Π°Π»ΠΈ, ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½ Π½Π° Π΄ΡΡΠ³ΠΈΡ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ ΠΈ ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ Π΄Π° ΡΠ΅ΡΠ΅ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² ΡΠ΅ΠΌΠ°ΡΠ° Π² Kafka.
- ΠΠ°Π³ΡΠ±Π° Π½Π° Π²ΡΡΠ·ΠΊΠ° Ρ ΠΊΠ»ΡΡΡΠ΅Ρ Kafka. ΠΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ ΠΏΡΠΎΡΡΠΎ ΡΠ΅ ΡΠΏΡΠ΅ Π΄Π° ΡΠ΅ΡΠ΅ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ°, ΠΊΠΎΡΡΠΎ Π½Π΅ Π΅ ΡΡΠΏΡΠ» Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈ Π½Π° Kafka ΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠΈ ΠΎΡΠ½ΠΎΠ²ΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΎΠΏΠΈΡΡΡ ΡΡΠΏΠ΅Π΅.
- ΠΠ·ΡΠΎΡΠ½ΠΈΠΊΡΡ Π½Π° Π΄Π°Π½Π½ΠΈ Π΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½. ΠΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΊΡΠΌ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π΅ 16 ΠΎΠΏΠΈΡΠ°
Π΅ΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»Π½ΠΎ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ . Π‘Π»Π΅Π΄ 16-ΠΈΡ Π½Π΅ΡΡΠΏΠ΅ΡΠ΅Π½ ΠΎΠΏΠΈΡ Π·Π°Π΄Π°ΡΠ°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π° ΠΊΠ°ΡΠΎ ΠΠ΅ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΡΠ½ΠΎ ΡΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Kafka Connect REST.- Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° PostgreSQL Π΄Π°Π½Π½ΠΈΡΠ΅ Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°Π³ΡΠ±Π΅Π½ΠΈ, Ρ.ΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ»ΠΎΡΠΎΠ²Π΅ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ΡΠΎ Π½Π° WAL ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ΠΈ ΠΎΡ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ°. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΈΠΌΠ° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ: Π°ΠΊΠΎ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΎΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° ΠΈ Π‘Π£ΠΠ Π΅ ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° Π·Π° Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΈΠΌΠ° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π΄Π° ΡΠ²ΡΡΡΠΈ ΠΈ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΎΡΠΊΠ°Π· Π½Π° ΡΡΠ»Π°ΡΠ° Π‘Π£ΠΠ.
- Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° MySQL binlog ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠΎΡΠΈΡΠ°Π½ΠΈ ΠΎΡ ΡΠ°ΠΌΠ°ΡΠ° Π‘Π£ΠΠ, ΠΏΡΠ΅Π΄ΠΈ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²Π΅Π½Π°. Π’ΠΎΠ²Π° ΡΠ΅ Π½Π°ΠΊΠ°ΡΠ° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ Π² Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° Π² ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΌΠΎΠΌΠ΅Π½ΡΠ½Π° ΡΠ½ΠΈΠΌΠΊΠ°, Π·Π° Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ Π΄Π° ΡΠ΅ΡΠ΅ ΠΎΡ binlogs, Π·Π° Π΄Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈ Π½ΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ°.
- ΠΠΊΠΎΠ»ΠΎ MongoDB. Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΊΠ°Π·Π²Π°: ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π² ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ log/oplog ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ ΡΠ° ΠΈΠ·ΡΡΠΈΡΠΈ ΠΈ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ Π΄Π° ΡΠ΅ΡΠ΅ ΠΎΡ ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ Π΅ ΡΠΏΡΡΠ», Π΅ Π΅Π΄Π½Π°ΠΊΠ²ΠΎ Π·Π° Π²ΡΠΈΡΠΊΠΈ Π‘Π£ΠΠ. Π’ΠΎΠ²Π° ΡΠ΅ ΠΊΡΠΈΠ΅ Π²ΡΠ² ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ Π² ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΠ΅ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½Π° ΠΌΠΎΠΌΠ΅Π½ΡΠ½Π° ΡΠ½ΠΈΠΌΠΊΠ°.
ΠΠΌΠ° ΠΎΠ±Π°ΡΠ΅ ΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΠΊΠΎ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ Π΅ Π±ΠΈΠ» Π² ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π·Π° Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ (ΠΈΠ»ΠΈ Π½Π΅ Π΅ ΠΌΠΎΠ³ΡΠ» Π΄Π° Π΄ΠΎΡΡΠΈΠ³Π½Π΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π½Π° MongoDB) ΠΈ oplog Π΅ Π±ΠΈΠ» Π·Π°Π²ΡΡΡΡΠ½ ΠΏΡΠ΅Π· ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅, ΡΠΎΠ³Π°Π²Π°, ΠΊΠΎΠ³Π°ΡΠΎ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π±ΡΠ΄Π΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²Π΅Π½Π°, ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π΄Π° ΡΠ΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΡΡΠ²Π°ΡΠ° Π½Π°Π»ΠΈΡΠ½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡ , ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠΎΠ΅ΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅ Π² ΠΠ°ΡΠΊΠ° Π½Π΅ ΡΠ΅ ΡΠ΄Π°ΡΠΈ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Debezium Π΅ ΠΏΡΡΠ²ΠΈΡΡ ΠΌΠΈ ΠΎΠΏΠΈΡ Ρ CDC ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΈ ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ Π±Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π΅Π½. ΠΡΠΎΠ΅ΠΊΡΡΡ ΠΏΠΎΠ΄ΠΊΡΠΏΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π‘Π£ΠΠ, Π»Π΅ΠΊΠΎΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΊΠ»ΡΡΡΠ΅ΡΠΈΡΠ°Π½Π΅ ΠΈ Π°ΠΊΡΠΈΠ²Π½Π° ΠΎΠ±ΡΠ½ΠΎΡΡ. ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ ΠΎΡ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°ΡΠ°, ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π°ΡΠ° Π·Π°
Π ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ JDBC ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π·Π° Kafka Connect, ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ Π½Π° Debezium Π΅, ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ΡΠ°Ρ ΠΎΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° Π‘Π£ΠΠ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ Π·Π°Π±Π°Π²ΡΠ½Π΅. JDBC Connector (ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ ΠΎΡ Kafka Connect) ΠΏΡΠ°Π²ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΠΊΡΠΌ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π½Π° ΡΠΈΠΊΡΠΈΡΠ°Π½ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΈ (ΠΏΠΎΡΠ°Π΄ΠΈ ΡΡΡΠ°ΡΠ° ΠΏΡΠΈΡΠΈΠ½Π°) Π½Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ²Π°Ρ (ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΡΠ°ΠΌ?).
ΠΠ° Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ (Π² Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ Debezium):
-
JDBC Connector Kafka Connect - ΠΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΌΠΎ Π·Π° MySQL:
-
Oracle Golden Gate , Π½ΠΎ ΡΠΎΠ²Π° Π΅ ΡΡΠ²ΡΠ΅ΠΌ ΡΠ°Π·Π»ΠΈΡΠ½Π° "ΡΠ΅Π³Π»ΠΎΠ²Π° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ".
PS
ΠΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΡΡΠΎ Π² Π½Π°ΡΠΈΡ Π±Π»ΠΎΠ³:
- Β«
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ Π·Π° ΠΊΠ»ΡΡΡΠ΅Ρ Kafka Π² Kubernetes Β»; - Β«
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΡΡΠΎΡΠΈΠΈ ΠΎΡ Π½Π°ΡΠ΅ΡΠΎ SRE Π΅ΠΆΠ΅Π΄Π½Π΅Π²ΠΈΠ΅. Π§Π°ΡΡ 2 Β»; - Β«
ΠΡΠ°ΡΡΠΊ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ Π½Π° PostgreSQL Π·Π° Kubernetes, Π½Π°ΡΠΈΡΡ ΠΈΠ·Π±ΠΎΡ ΠΈ ΠΎΠΏΠΈΡ ".
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com