ื™ื ื˜ืจืึธื•ื“ื•ืกื™ื ื’ Debezium - CDC ืคึฟืึทืจ Apache Kafka

ื™ื ื˜ืจืึธื•ื“ื•ืกื™ื ื’ Debezium - CDC ืคึฟืึทืจ Apache Kafka

ืื™ืŸ ืžื™ื™ืŸ ืึทืจื‘ืขื˜, ืื™ืš ืึธืคื˜ ื˜ืจืขืคืŸ ื ื™ื™ึทืข ื˜ืขื›ื ื™ืฉ ืกืึทืœื•ืฉืึทื ื– / ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืคึผืจืึธื“ื•ืงื˜ืŸ, ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื•ื•ืึธืก ืื™ื– ื’ืึทื ืฅ ืงื ืึทืคึผ ืื•ื™ืฃ ื“ื™ ืจื•ืกื™ืฉ-ืฉืคึผืจืึทืš ืื™ื ื˜ืขืจื ืขื˜. ืžื™ื˜ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ืš ื•ื•ืขืœ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืคึผืœืึธืžื‘ื™ืจืŸ ืื™ื™ืŸ ืึทื–ืึท ืจื™ืก ืžื™ื˜ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืžื™ื™ืŸ ืœืขืฆื˜ืข ืคื™ืจ, ื•ื•ืขืŸ ืื™ืš ื“ืืจืฃ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ ืฉื™ืงื˜ CDC events ืคื•ืŸ ืฆื•ื•ื™ื™ ืคืึธืœืงืก DBMSs (PostgreSQL ืื•ืŸ MongoDB) ืฆื• ืึท Kafka ืงื ื•ื™ืœ ื ื™ืฆืŸ Debezium. ืื™ืš ื”ืึธืคึฟืŸ ืึทื– ื“ืขืจ ืึธืคึผืฉืึทืฆื•ื ื’ ืึทืจื˜ื™ืงืœ, ื•ื•ืึธืก ืื™ื– ืืจื•ื™ืก ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ื“ื™ ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืึทืจื‘ืขื˜, ื•ื•ืขื˜ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ืคึฟืึทืจ ืื ื“ืขืจืข.

ื•ื•ืึธืก ืื™ื– ื“ืขื‘ืขื–ื™ื•ื ืื•ืŸ CDC ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ?

ื“ืขื‘ืขื–ื™ื•ื - ืคืืจืฉื˜ื™ื™ืขืจ ืคื•ืŸ ื“ื™ CDC ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืงืึทื˜ืขื’ืึธืจื™ืข (ื›ืึทืคึผืŸ ื“ืึทื˜ืึท ื˜ื•ื™ืฉืŸ), ืึธื“ืขืจ ืžืขืจ ื’ืขื ื•ื™, ืขืก ืื™ื– ืึท ื’ืึทื ื’ ืคื•ืŸ ืงืึทื ืขืงื˜ืขืจื– ืคึฟืึทืจ ืคืึทืจืฉื™ื“ืŸ ื“ื‘ืžืก ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืžื™ื˜ ื“ื™ Apache Kafka Connect ืคืจื™ื™ืžื•ื•ืขืจืง.

ืขืก ืขืคึฟืŸ ืžืงื•ืจ ืคึผืจื•ื™ืขืงื˜, ืœื™ื™ืกืึทื ืกื˜ ืื•ื ื˜ืขืจ ื“ื™ Apache License v2.0 ืื•ืŸ ื‘ืืฆืืœื˜ืข ื“ื•ืจืš Red Hat. ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืื™ื– ืึธื ื’ืึธื™ื ื’ ื–ื™ื ื˜ 2016 ืื•ืŸ ื“ืขืจื•ื•ื™ื™ึทืœ ืขืก ื’ื™ื˜ ื‘ืึทืึทืžื˜ืขืจ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ื“ื™ ืคืืœื’ืขื ื“ืข ื“ื‘ืžืก: MySQL, PostgreSQL, MongoDB, SQL Server. ืขืก ื–ืขื ืขืŸ ืื•ื™ืš ืงืึทื ืขืงื˜ืขืจื– ืคึฟืึทืจ Cassandra ืื•ืŸ Oracle, ืึธื‘ืขืจ ืื™ืŸ ื“ืขื ืžืึธืžืขื ื˜ ื–ื™ื™ ื–ืขื ืขืŸ ืื™ืŸ "ืคืจื™ ืึทืงืกืขืก" ืกื˜ืึทื˜ื•ืก, ืื•ืŸ ื ื™ื™ึท ืจื™ืœื™ืกื™ื– ื˜ืึธืŸ ื ื™ื˜ ื’ืึทืจืึทื ื˜ื™ืจืŸ ืฆื•ืจื™ืง ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™.

ืื•ื™ื‘ ืžื™ืจ ืคืึทืจื’ืœื™ื™ึทื›ืŸ CDC ืžื™ื˜ ื“ื™ ื˜ืจืื“ื™ืฆื™ืื ืขืœืŸ ืฆื•ื’ืึทื ื’ (ื•ื•ืขืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืœื™ื™ืขื ื˜ ื“ืึทื˜ืŸ ืคื•ืŸ ื“ื™ DBMS ื’ืœื™ื™ึทืš), ื“ื™ ื”ื•ื™ืคึผื˜ ืึทื“ื•ื•ืึทื ื˜ื™ื“ื–ืฉื™ื– ืึทืจื™ื™ึทื ื ืขืžืขืŸ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืกื˜ืจื™ืžื™ื ื’ ืคื•ืŸ ื“ืึทื˜ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื•ื™ืฃ ื“ื™ ืจื•ื“ืขืจืŸ ืžื“ืจื’ื” ืžื™ื˜ ื ื™ื“ืขืจื™ืง ืœื™ื™ื˜ืึทื ืกื™, ื”ื•ื™ืš ืจื™ืœื™ื™ืึทื‘ื™ืœืึทื˜ื™ ืื•ืŸ ืึทื•ื•ื™ื™ืœืึทื‘ื™ืœืึทื˜ื™. ื“ื™ ืœืขืฆื˜ืข ืฆื•ื•ื™ื™ ืคื•ื ืงื˜ืŸ ื–ืขื ืขืŸ ืึทื˜ืฉื™ื•ื•ื“ ื“ื•ืจืš ื ื™ืฆืŸ ืึท ืงืึทืคืงืึท ืงื ื•ื™ืœ ื•ื•ื™ ืึท ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืคึฟืึทืจ CDC events.

ืืŸ ืื ื“ืขืจ ืžื™ื™ึทืœืข ืื™ื– ื“ืขืจ ืคืึทืงื˜ ืึทื– ืึท ืื™ื™ืŸ ืžืึธื“ืขืœ ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืงืจืึธื ื’ืขืฉืขืขื ื™ืฉืŸ, ืึทื–ื•ื™ ื“ื™ ืกื•ืฃ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื˜ื•ื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ืฆื• ื–ืึธืจื’ ื•ื•ืขื’ืŸ ื“ื™ ื ื•ืึทื ืกื™ื– ืคื•ืŸ ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืคืึทืจืฉื™ื“ืขื ืข ื“ื‘ืžืก.

ืฆื•ื ืกื•ืฃ, ื ื™ืฆืŸ ืึท ืึธื ื–ืึธื’ ืžืขืงืœืขืจ ืึทืœืึทื•ื– ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืึทื– ืžืึธื ื™ื˜ืึธืจ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ืึทื˜ืŸ ืฆื• ื•ื•ืึธื’ ืื•ื™ืก ื›ืึธืจื™ื–ืึทื ื˜ืึทืœื™. ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜, ื“ื™ ืคึผืจืึทืœ ืื•ื™ืฃ ื“ื™ ื“ืึทื˜ืŸ ืžืงื•ืจ ืื™ื– ืžื™ื ืึทืžื™ื™ื–ื“, ื•ื•ื™ื™ึทืœ ื“ื™ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื‘ืืงื•ืžืขืŸ ื ื™ืฉื˜ ื’ืœื™ื™ึทืš ืคึฟื•ืŸ ื“ื™ DBMS, ืึธื‘ืขืจ ืคึฟื•ืŸ ื“ื™ ืงืึทืคืงืึท ืงื ื•ื™ืœ.

ื•ื•ืขื’ืŸ ื“ื™ ื“ืขื‘ืขื–ื™ื•ื ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ

ื ื™ืฆืŸ Debezium ืงื•ืžื˜ ืึทืจืึธืคึผ ืฆื• ื“ืขื ืคึผืฉื•ื˜ ืกื›ืขืžืข:

DBMS (ื•ื•ื™ ืึท ื“ืึทื˜ืŸ ืžืงื•ืจ) โ†’ ืงืึทื ืขืงื˜ืขืจ ืื™ืŸ Kafka Connect โ†’ Apache Kafka โ†’ ืงืึทื ืกื•ืžืขืจ

ื•ื•ื™ ืึท ื’ืขืžืขืœ, ื“ืึธ ืื™ื– ืึท ื“ื™ืึทื’ืจืึทืžืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื•ื•ืขื‘ื–ื™ื™ื˜ืœ:

ื™ื ื˜ืจืึธื•ื“ื•ืกื™ื ื’ Debezium - CDC ืคึฟืึทืจ Apache Kafka

ืึธื‘ืขืจ, ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื˜ืึทืงืข ื•ื•ื™ ื“ืขื ืกื›ืขืžืข, ื•ื•ื™ื™ึทืœ ืขืก ืžื™ื™ื ื˜ ืึทื– ื‘ืœื•ื™ื– ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ืึท ื–ื™ื ืงืขืŸ ืงืึทื ืขืงื˜ืขืจ ืื™ื– ืžืขื’ืœืขืš.

ืื™ืŸ ืคืึทืงื˜, ื“ื™ ืกื™ื˜ื•ืึทืฆื™ืข ืื™ื– ืึทื ื“ืขืจืฉ: ืคื™ืœื•ื ื’ ื“ื™ื™ืŸ ื“ืึทื˜ืึท ืœื™ื™ืง (ืœืขืฆื˜ืข ืœื™ื ืง ืื™ืŸ ื“ื™ ื“ื™ืึทื’ืจืึทืžืข ืื•ื™ื‘ืŸ) ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ื“ืขืจ ื‘ืœื•ื™ื– ื•ื•ืขื’ ืฆื• ื ื•ืฆืŸ Debezium. ื’ืขืฉืขืขื ื™ืฉืŸ ื’ืขืฉื™ืงื˜ ืฆื• Apache Kafka ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื“ื•ืจืš ื“ื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืฆื• ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ืคืึทืจืฉื™ื“ืŸ ืกื™ื˜ื•ืึทื˜ื™ืึธื ืก. ืœืžืฉืœ:

  • ืจื™ืžื•ื•ื•ื™ื ื’ ื™ืจืขืœืึทื•ื•ืึทื ื˜ ื“ืึทื˜ืŸ ืคื•ืŸ ื“ื™ ืงืึทืฉ;
  • ืฉื™ืงื˜ ื ืึธื•ื˜ืึทืคืึทืงื™ื™ืฉืึทื ื–;
  • ื–ื•ื›ืŸ ืื™ื ื“ืขืงืก ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื•ื ื’ืขืŸ;
  • ืขื˜ืœืขื›ืข ืกืึธืจื˜ ืคื•ืŸ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืœืึธื’ืก;
  • ...

ืื•ื™ื‘ ืื™ืจ ื”ืึธื˜ ืึท Java ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ืŸ ืขืก ืื™ื– ื ื™ื˜ ื ื•ื™ื˜ื™ืง / ืžืขื’ืœืขื›ืงื™ื™ื˜ ืฆื• ื ื•ืฆืŸ ืึท Kafka ืงื ื•ื™ืœ, ืขืก ืื™ื– ืื•ื™ืš ื“ื™ ืžืขื’ืœืขื›ืงื™ื™ื˜ ืฆื• ืึทืจื‘ืขื˜ืŸ ื“ื•ืจืš ืขืžื‘ืขื“ื™ื“-ืงืึทื ืขืงื˜ืขืจ. ื“ื™ ืงืœืึธืจ ื•ื•ื™ ื“ืขืจ ื˜ืึธื’ ืžื™ื™ึทืœืข ืื™ื– ืึทื– ืขืก ื™ืœื™ืžืึทื ื™ื™ืฅ ื“ื™ ื ื•ื™ื˜ ืคึฟืึทืจ ื ืึธืš ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ (ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ ืึท ืงืึทื ืขืงื˜ืขืจ ืื•ืŸ ืงืึทืคืงืึท). ืึธื‘ืขืจ, ื“ื™ ืœื™ื™ื–ื•ื ื’ ืื™ื– ื“ื™ืคึผืจื™ืฉื™ื™ื™ื˜ื™ื“ ื–ื™ื ื˜ ื•ื•ืขืจืกื™ืข 1.1 ืื•ืŸ ืื™ื– ื ื™ื˜ ืžืขืจ ืจืขืงืึทืžืขื ื“ื™ื“ ืคึฟืึทืจ ื ื•ืฆืŸ (ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ืขืก ืงืขืŸ ื–ื™ื™ืŸ ืึทื•ื•ืขืงื’ืขื ื•ืžืขืŸ ืื™ืŸ ืฆื•ืงื•ื ืคึฟื˜ ืจื™ืœื™ืกื™ื–).

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ื“ื™ืกืงื•ื˜ื™ืจืŸ ื“ื™ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืจืขืงืึทืžืขื ื“ื™ื“ ื“ื•ืจืš ื“ืขื•ื•ืขืœืึธืคึผืขืจืก, ื•ื•ืึธืก ื’ื™ื˜ ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ืื•ืŸ ืกืงืึทืœืึทื‘ื™ืœื™ื˜ื™.

ืงืึทื ืขืงื˜ืขืจ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ

ืื™ืŸ ืกื“ืจ ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ื˜ืจืึทืงื™ื ื’ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ื™ ืžืขืจืกื˜ ื•ื•ื™ื›ื˜ื™ืง ื•ื•ืขืจื˜ - ื“ืึทื˜ืŸ - ืžื™ืจ ื“ืึทืจืคึฟืŸ:

  1. ื“ืึทื˜ืŸ ืžืงื•ืจ, ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ MySQL ืกื˜ืึทืจื˜ื™ื ื’ ืคึฟื•ืŸ ื•ื•ืขืจืกื™ืข 5.7, PostgreSQL 9.6+, MongoDB 3.2+ (ื’ืึทื ืฅ ืจืฉื™ืžื”);
  2. ืึทืคึผืึทื˜ืฉื™ ืงืึทืคืงืึท ืงื ื•ื™ืœ;
  3. ืงืึทืคืงืึท ืงืึธื ื ืขืงื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ (ื•ื•ืขืจืกื™ืขืก 1.ืงืก, 2.ืงืก);
  4. ืงืึทื ืคื™ื’ื™ืขืจื“ ื“ืขื‘ืขื–ื™ื•ื ืงืึทื ืขืงื˜ืขืจ.

ืึทืจื‘ืขื˜ ืื•ื™ืฃ ื“ื™ ืขืจืฉื˜ืข ืฆื•ื•ื™ื™ ืคื•ื ืงื˜ืŸ, ื“.ื”. ื“ืขืจ ื™ื™ึทื ืžืึธื ื˜ื™ืจื•ื ื’ ืคึผืจืึธืฆืขืก ืคื•ืŸ ื“ื™ DBMS ืื•ืŸ Apache Kafka ืื™ื– ื•ื•ื™ื™ึทื˜ืขืจ ืคื•ืŸ ื“ื™ ืคืึทืจื ืขื ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ. ืึธื‘ืขืจ, ืคึฟืึทืจ ื“ื™ ื•ื•ืืก ื•ื•ื™ืœืŸ ืฆื• ืฆืขื•ื•ื™ืงืœืขืŸ ืึทืœืฅ ืื™ืŸ ื“ื™ ื–ืึทืžื“ืงืึทืกื˜ืŸ, ื“ืขืจ ื‘ืึทืึทืžื˜ืขืจ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืžื™ื˜ ื‘ื™ื™ืฉืคื™ืœืŸ ื”ืื˜ ืึท ืคืึทืจื˜ื™ืง docker-compose.yaml.

ืื•ื™ืฃ ื“ื™ ืœืขืฆื˜ืข ืฆื•ื•ื™ื™ ื ืงื•ื“ื•ืช ื•ื•ืขืœืŸ ืžื™ืจ ื–ื™ืš ืžืขืจ ื“ืขื˜ืึทืœืŸ ืึธืคึผืฉื˜ืขืœืŸ.

0. ืงืึทืคืงืึท ืงืึธื ื ืขืงื˜

ื“ืึธ ืื•ืŸ ื•ื•ื™ื™ึทื˜ืขืจ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืึทืœืข ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ื–ืขื ืขืŸ ื“ื™ืกืงืึทืกื˜ ืื™ืŸ ื“ืขื ืงืึธื ื˜ืขืงืกื˜ ืคื•ืŸ ื“ื™ ื“ืึธืงืงืขืจ ื‘ื™ืœื“ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ื“ื•ืจืš ื“ื™ ื“ืขื‘ืขื–ื™ื•ื ื“ืขื•ื•ืขืœืึธืคึผืขืจืก. ืขืก ื›ึผื•ืœืœ ืึทืœืข ื“ื™ ื ื™ื™ื˜ื™ืง ืคึผืœื•ื’ื™ืŸ ื˜ืขืงืขืก (ืงืึทื ืขืงื˜ืขืจื–) ืื•ืŸ ื’ื™ื˜ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคื•ืŸ Kafka Connect ื ื™ืฆืŸ ืกื•ื•ื™ื•ื•ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื–.

ืื•ื™ื‘ ืื™ืจ ื‘ื“ืขื” ืฆื• ื ื•ืฆืŸ Kafka Connect ืคึฟื•ืŸ ืงืึธื ืคืœื•ืขื ื˜, ืื™ืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื™ื ื“ื™ืคึผืขื ื“ืึทื ื˜ืœื™ ืœื™ื™ื’ืŸ ื“ื™ ืคึผืœื•ื’ื™ื ืก ืคื•ืŸ ื“ื™ ื ื™ื™ื˜ื™ืง ืงืึทื ืขืงื˜ืขืจื– ืฆื• ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืกืคึผืขืกื™ืคื™ืขื“ ืื™ืŸ plugin.path ืึธื“ืขืจ ืฉื˜ืขืœืŸ ื“ื•ืจืš ืึท ืกื•ื•ื™ื•ื•ืข ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง CLASSPATH. ืกืขื˜ื˜ื™ื ื’ืก ืคึฟืึทืจ ื“ื™ Kafka Connect ืึทืจื‘ืขื˜ืขืจ ืื•ืŸ ืงืึทื ืขืงื˜ืขืจื– ื–ืขื ืขืŸ ื‘ืืฉืœืืกืŸ ื“ื•ืจืš ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืขืก ื•ื•ืึธืก ื–ืขื ืขืŸ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ื•ื•ื™ ืึทืจื’ื•ืžืขื ื˜ืŸ ืฆื• ื“ื™ ืึทืจื‘ืขื˜ืขืจ ืงืึทื˜ืขืจ ื‘ืึทืคึฟืขืœ. ืคึฟืึทืจ ืคืจื˜ื™ื ื–ืขืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ.

ื“ืขืจ ื’ืื ืฆืขืจ ืคึผืจืึธืฆืขืก ืคื•ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ Debeizum ืื™ืŸ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ื•ื•ืขืจืกื™ืข ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืื™ืŸ ืฆื•ื•ื™ื™ ืกื˜ืึทื’ืขืก. ื–ืืœ ืก ืงื•ืง ื‘ื™ื™ึท ื™ืขื“ืขืจ ืคื•ืŸ ื–ื™ื™:

1. ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ Kafka Connect ืคืจื™ื™ืžื•ื•ืขืจืง

ืฆื• ืกื˜ืจื™ืžื™ื ื’ ื“ืึทื˜ืŸ ืฆื• ื“ื™ Apache Kafka ืงื ื•ื™ืœ, ืกืคึผืขืฆื™ืคื™ืฉ ืคึผืึทืจืึทืžืขื˜ืขืจืก ื–ืขื ืขืŸ ื‘ืึทืฉื˜ื™ืžื˜ ืื™ืŸ ื“ื™ Kafka Connect ืคืจื™ื™ืžื•ื•ืขืจืง, ืึทื–ืึท ื•ื•ื™:

  • ืคึผืึทืจืึทืžืขื˜ืขืจืก ืคึฟืึทืจ ืงืึทื ืขืงื˜ื™ื ื’ ืฆื• ื“ื™ ืงื ื•ื™ืœ,
  • ื ืขืžืขืŸ ืคื•ืŸ ื˜ืขืžืขืก ืื™ืŸ ื•ื•ืึธืก ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ื–ื™ืš ื•ื•ืขื˜ ื–ื™ื™ืŸ ืกื˜ืึธืจื“ ื’ืœื™ื™ึทืš,
  • ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ืขืจ ื’ืจื•ืคึผืข ืื™ืŸ ื•ื•ืึธืก ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืื™ื– ืคืœื™ืกื ื“ื™ืง (ืื•ื™ื‘ ื“ื™ืกื˜ืจื™ื‘ื™ื•ื˜ื™ื“ ืžืึธื“ืข ืื™ื– ื’ืขื ื™ืฆื˜).

ื“ืขืจ ื‘ืึทืึทืžื˜ืขืจ ื“ืึธืงืงืขืจ ื‘ื™ืœื“ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืฉื˜ื™ืฆื˜ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ืกื•ื•ื™ื•ื•ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื– - ื“ืึธืก ืื™ื– ื•ื•ืึธืก ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ. ืึทื–ื•ื™, ืืจืืคืงืืคื™ืข ื“ื™ ื‘ื™ืœื“:

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

ื‘ืึทืžืขืจืงื•ื ื’ ื•ื•ืขื’ืŸ ืึทื•ื•ืจืึธ

ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, Debezium ืฉืจื™ื™ื‘ื˜ ื“ืึทื˜ืŸ ืื™ืŸ JSON ืคึฟืึธืจืžืึทื˜, ื•ื•ืึธืก ืื™ื– ืคึผืึทืกื™ืง ืคึฟืึทืจ ื–ืึทืžื“ื‘ืึธืงืกืขืก ืื•ืŸ ืงืœื™ื™ืŸ ืึทืžืึทื•ื ืฅ ืคื•ืŸ ื“ืึทื˜ืŸ, ืึธื‘ืขืจ ืงืขื ืขืŸ ื•ื•ืขืจืŸ ืึท ืคึผืจืึธื‘ืœืขื ืื™ืŸ ื”ืขื›ืกื˜ ืœืึธื•ื“ื™ื“ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื–. ืึทืŸ ืึธืœื˜ืขืจื ืึทื˜ื™ื•ื• ืฆื• ืึท JSON ืงืึทื ื•ื•ืขืจื˜ืขืจ ืื™ื– ืฆื• ืกื™ืจื™ืึทืœื™ื–ื™ืจืŸ ืึทืจื˜ื™ืงืœืขืŸ ื ื™ืฆืŸ ืึทื•ื•ืจืึธ ืฆื• ืึท ื‘ื™ื™ื ืขืจื™ ืคึฟืึธืจืžืึทื˜, ื•ื•ืึธืก ืจืึทื“ื•ืกืึทื– ื“ื™ ืžืึทืกืข ืื•ื™ืฃ ื“ื™ 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 - DBMS ืงืึทื ืขืงื˜ืขืจ ืงืœืึทืก ื•ื•ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื“ื•ืจืš ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื“ ืงืึทื ืขืงื˜ืขืจ;
  • plugin.name - ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ืคึผืœื•ื’ื™ืŸ ืคึฟืึทืจ ืœืึทื“ื–ืฉื™ืงืึทืœ ื“ื™ืงืึธื•ื“ื™ื ื’ ืคื•ืŸ ื“ืึทื˜ืŸ ืคึฟื•ืŸ WAL ื˜ืขืงืขืก. ื‘ื ื™ืžืฆื ืฆื• ืงืœื™ื™ึทื‘ืŸ ืคื•ืŸ wal2json, decoderbuffs ะธ pgoutput. ื“ื™ ืขืจืฉื˜ืข ืฆื•ื•ื™ื™ ื“ืึทืจืคืŸ ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืคื•ืŸ ื“ื™ ืฆื•ื ืขืžืขืŸ ื™ืงืกื˜ืขื ืฉืึทื ื– ืื™ืŸ ื“ื™ DBMS, ืื•ืŸ 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, ื•ื•ืึธืก ื“ื™ ืงืึทื ืขืงื˜ืขืจ ื ื™ืฆื˜. ืื•ื™ื‘ ืขืก ื˜ื•ื˜ ื ื™ืฉื˜ ืขืงืกื™ืกื˜ื™ืจืŸ, ื“ืขื‘ืขื–ื™ื•ื ื•ื•ืขื˜ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืžืึทื›ืŸ ืขืก. ืื•ื™ื‘ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืื•ื ื˜ืขืจ ื•ื•ืขืžืขืŸ ื“ื™ ืงืฉืจ ืื™ื– ื’ืขืžืื›ื˜ ื”ืื˜ ื ื™ืฉื˜ ื’ืขื ื•ื’ ืจืขื›ื˜ ืคึฟืึทืจ ื“ืขื ืงืึทืžืฃ, ื“ืขืจ ืงืึทื ืขืงื˜ืขืจ ื•ื•ืขื˜ ืคืึทืจืขื ื“ื™ืงืŸ ืžื™ื˜ ืึท ื˜ืขื•ืช;
  • transforms ื“ื™ื˜ืขืจืžืึทื ื– ืคึผื•ื ืงื˜ ื•ื•ื™ ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ืฆื™ืœ ื˜ืขืžืข:
    • transforms.AddPrefix.type ื™ื ื“ื™ืงื™ื™ืฅ ืึทื– ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ืจืขื’ื•ืœืขืจ ืื•ื™ืกื“ืจื•ืงืŸ;
    • transforms.AddPrefix.regex - ืึท ืžืึทืกืงืข ื•ื•ืึธืก ืจื™ื“ื™ืคื™ื ื– ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ืฆื™ืœ ื˜ืขืžืข;
    • transforms.AddPrefix.replacement - ื’ืœื™ื™ืš ื•ื•ืึธืก ืžื™ืจ ืจื™ื“ื™ืคื™ื™ื ื™ื ื’.

ืžืขืจ ื•ื•ืขื’ืŸ ื›ืึทืจื˜ื‘ื™ื˜ ืื•ืŸ ื˜ืจืึทื ืกืคืึธืจืžืึทืฆื™ืข

ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืกืขื ื“ื– ื“ืึทื˜ืŸ ืฆื• Kafka ืคึฟืึทืจ ื™ืขื“ืขืจ ื‘ืื’ืื ื’ืขืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ, ืื•ืŸ ื–ื™ื™ืŸ LSN (ืœืึธื’ ืกื™ืงื•ื•ืึทื ืก ื ื•ืžืขืจ) ืื™ื– ืจืขืงืึธืจื“ืขื“ ืื™ืŸ ื“ื™ ืกืขืจื•ื•ื™ืก ื˜ืขืžืข offset. ืึธื‘ืขืจ ื•ื•ืึธืก ื›ืึทืคึผืึทื ื– ืื•ื™ื‘ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืื™ื– ืงืึทื ืคื™ื’ื™ืขืจื“ ืฆื• ืœื™ื™ืขื ืขืŸ ื ื™ืฉื˜ ื“ื™ ื’ืื ืฆืข ื“ืึทื˜ืึทื‘ื™ื™ืก, ืึธื‘ืขืจ ื‘ืœื•ื™ื– ื˜ื™ื™ืœ ืคื•ืŸ ื–ื™ื™ึทืŸ ื˜ื™ืฉืŸ (ืื™ืŸ ื•ื•ืึธืก ื“ืึทื˜ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื•ื ื’ืขืŸ ื˜ืึธืŸ ื ื™ื˜ ืคืึทืœืŸ ืึธืคื˜)?

  • ื“ืขืจ ืงืึทื ืขืงื˜ืขืจ ื•ื•ืขื˜ ืœื™ื™ืขื ืขืŸ WAL ื˜ืขืงืขืก ืื•ืŸ ื•ื•ืขื˜ ื ื™ืฉื˜ ื“ืขื˜ืขืงื˜ ืงื™ื™ืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืงืึทืžื™ืฅ ืฆื• ื“ื™ ื˜ื™ืฉืŸ ืขืก ืื™ื– ืžืึธื ื™ื˜ืึธืจื™ื ื’.
  • ื“ืขืจื™ื‘ืขืจ, ืขืก ื•ื•ืขื˜ ื ื™ืฉื˜ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื–ื™ื™ืŸ ืงืจืึทื ื˜ ืฉื˜ืขืœืข ืื™ืŸ ื“ืขืจ ื˜ืขืžืข ืึธื“ืขืจ ืื™ืŸ ื“ื™ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฉืคึผืขืœื˜ืœ.
  • ื“ืึธืก, ืื™ืŸ ืงืขืจ, ื•ื•ืขื˜ ืคื™ืจืŸ ืฆื• WAL ื˜ืขืงืขืก ืื•ื™ืฃ ื“ื™ืกืง ืื•ืŸ ืžื™ืกื˜ืึธืžืข ืœื•ื™ืคืŸ ืื•ื™ืก ืคื•ืŸ ื“ื™ืกืง ืคึผืœืึทืฅ.

ืื•ืŸ ื“ืึธืก ืื™ื– ื•ื•ื• ืึธืคึผืฆื™ืขืก ืงื•ืžืขืŸ ืฆื• ืจืึทื˜ืขื•ื•ืขืŸ. heartbeat.interval.ms ะธ heartbeat.action.query. ื ื™ืฆืŸ ื“ื™ ืึธืคึผืฆื™ืขืก ืื™ืŸ ืคึผืขืจื– ืžืื›ื˜ ืขืก ืžืขื’ืœืขืš ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ืึท ื‘ืงืฉื” ืฆื• ื˜ื•ื™ืฉืŸ ื“ืึทื˜ืŸ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ื˜ื™ืฉ ื™ืขื“ืขืจ ืžืึธืœ ืึท ื”ืขืึทืจื˜ื‘ืขืึทื˜ ืึธื ื–ืึธื’ ืื™ื– ื’ืขืฉื™ืงื˜. ืื–ื•ื™, ื“ื™ LSN ืื•ื™ืฃ ื•ื•ืึธืก ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืื™ื– ืื™ืฆื˜ ืœื™ื’ืŸ (ืื™ืŸ ื“ื™ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฉืคึผืขืœื˜ืœ) ืื™ื– ืงืขืกื™ื™ื“ืขืจ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜. ื“ืึธืก ืึทืœืึทื•ื– ื“ื™ DBMS ืฆื• ื‘ืึทื–ื™ื™ึทื˜ื™ืงืŸ WAL ื˜ืขืงืขืก ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ื˜ ืžืขืจ ื“ืืจืฃ. ืื™ืจ ืงืขื ื˜ ืœืขืจื ืขืŸ ืžืขืจ ื•ื•ืขื’ืŸ ื•ื•ื™ ื“ื™ ืึธืคึผืฆื™ืขืก ืึทืจื‘ืขื˜ ืื™ืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ.

ืืŸ ืื ื“ืขืจ ืึธืคึผืฆื™ืข ื•ื•ืขืจื˜ ืคื•ืŸ ื ืขืขื ื˜ืขืจ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜ ืื™ื– transforms. ื›ืึธื˜ืฉ ืขืก ืื™ื– ืžืขืจ ื•ื•ืขื’ืŸ ืงืึทื ื•ื•ื™ื ื™ืึทื ืก ืื•ืŸ ืฉื™ื™ื ืงื™ื™ื˜ ...

ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, Debezium ืงืจื™ื™ื™ืฅ ื˜ืขืžืขืก ื ื™ืฆืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื ืึทืžื™ื ื’ ืคึผืึธืœื™ื˜ื™ืง: serverName.schemaName.tableName. ื“ืึธืก ืงืขืŸ ื ื™ืฉื˜ ืฉื˜ืขื ื“ื™ืง ื–ื™ื™ืŸ ื‘ืึทืงื•ื•ืขื. ืึธืคึผืฆื™ืขืก transforms ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ืจืขื’ื•ืœืขืจ ืื•ื™ืกื“ืจื•ืงืŸ ืฆื• ื“ืขืคื™ื ื™ืจืŸ ืึท ืจืฉื™ืžื” ืคื•ืŸ ื˜ื™ืฉืŸ, ื’ืขืฉืขืขื ื™ืฉืŸ ืคื•ืŸ ื•ื•ืึธืก ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื–ื™ื™ืŸ ืจืึทื•ื˜ื™ื“ ืฆื• ืึท ื˜ืขืžืข ืžื™ื˜ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ื ืึธืžืขืŸ.

ืื™ืŸ ืื•ื ื“ื–ืขืจ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื“ืึทื ืงืขืŸ transforms ื“ื™ ืคืืœื’ืขื ื“ืข ื›ืึทืคึผืึทื ื–: ืึทืœืข CDC events ืคื•ืŸ ื“ื™ ืžืึธื ื™ื˜ืึธืจืขื“ ื“ืึทื˜ืึทื‘ื™ื™ืก ื•ื•ืขื˜ ื’ื™ื™ืŸ ืฆื• ืึท ื˜ืขืžืข ืžื™ื˜ ื“ืขื ื ืึธืžืขืŸ data.cdc.dbname. ืึทื ื“ืขืจืฉ (ืึธืŸ ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก), Debezium ื•ื•ืึธืœื˜ ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜ ืฉืึทืคึฟืŸ ืึท ื˜ืขืžืข ืคึฟืึทืจ ื™ืขื“ืขืจ ื˜ื™ืฉ ื•ื•ื™: pg-dev.public.<table_name>.

ืงืึทื ืขืงื˜ืขืจ ืœื™ืžื™ื˜ื™ื™ืฉืึทื ื–

ืฆื• ืคืึทืจืขื ื“ื™ืงืŸ ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคึฟืึทืจ PostgreSQL, ืขืก ืื™ื– ื•ื•ืขืจื˜ ืฆื• ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืคึฟืขื™ึดืงื™ื™ื˜ืŸ / ืœื™ืžื™ื˜ื™ื™ืฉืึทื ื– ืคื•ืŸ ื–ื™ื™ึทืŸ ืึธืคึผืขืจืึทืฆื™ืข:

  1. ื“ื™ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืคื•ืŸ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืคึฟืึทืจ PostgreSQL ืจื™ืœื™ื™ื– ืื•ื™ืฃ ื“ืขืจ ื‘ืึทื’ืจื™ืฃ ืคื•ืŸ ืœืึทื“ื–ืฉื™ืงืึทืœ ื“ื™ืงืึธื•ื“ื™ื ื’. ื“ืขืจื™ื‘ืขืจ ืขืจ ื˜ื•ื˜ ื ื™ืฉื˜ ืฉืคึผื•ืจ ืจื™ืงื•ื•ืขืก ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืกื˜ืจื•ืงื˜ื•ืจ (DDL) - ืึทืงืึธืจื“ื™ื ื’ืœื™, ื“ื™ ื“ืึทื˜ืŸ ื•ื•ืขื˜ ื ื™ืฉื˜ ื–ื™ื™ืŸ ืื™ืŸ ื“ื™ ื˜ืขืžืขืก.
  2. ื–ื™ื ื˜ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืกืœืึธืฅ ื–ืขื ืขืŸ ื’ืขื ื™ืฆื˜, ืงืึทื ืขืงื˜ื™ื ื’ ืึท ืงืึทื ืขืงื˜ืขืจ ืื™ื– ืžืขื’ืœืขืš ื‘ืœื•ื™ื– ืฆื• ื“ื™ ืœื™ื“ื™ื ื’ DBMS ื‘ื™ื™ึทืฉืคึผื™ืœ.
  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: ื‘ื™ื™ payload.before ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ืฉื•ืจื” ืื™ื– ื’ืขื•ื•ื™ื–ืŸ, ืื•ืŸ ืื™ืŸ payload.after โ€” ื ืฒืขื ืžื™ื˜ ื“ืขื ืžื”ื•ืช ืคื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ.

2.2 MongoDB

ื“ืขืจ ืงืึทื ืขืงื˜ืขืจ ื ื™ืฆื˜ ื“ื™ ื ืึธืจืžืึทืœ MongoDB ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžืขืงืึทื ื™ื–ืึทื, ืœื™ื™ืขื ืขืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืคึฟื•ืŸ ื“ื™ ืึธืคึผืœืึธื’ ืคื•ืŸ ื“ื™ ืขืจืฉื˜ื™ืง DBMS ื ืึธื“ืข.

ืขื ืœืขืš ืฆื• ื“ื™ ืฉื•ื™ืŸ ื“ื™ืกืงืจื™ื™ื‘ื“ ืงืึทื ืขืงื˜ืขืจ ืคึฟืึทืจ PgSQL, ื“ืึธ ืื•ื™ืš, ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ืึธื ื”ื™ื™ื‘, ื“ื™ ืขืจืฉื˜ื™ืง ื“ืึทื˜ืŸ ืžืึธืžืขื ื˜ื‘ื™ืœื“ ืื™ื– ื’ืขื ื•ืžืขืŸ, ื ืึธืš ื•ื•ืึธืก ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืกื•ื•ื™ื˜ืฉื™ื– ืฆื• ืึธืคึผืœืึธื’ ืœื™ื™ืขื ืขืŸ ืžืึธื“ืข.

ืงืึธื ืคื™ื’ื•ืจืึทื˜ื™ืึธืŸ ื‘ื™ื™ึทืฉืคึผื™ืœ:

{
"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>.

ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ

ื“ื™ ืึทืจื•ื™ืกื’ืขื‘ืŸ ืคื•ืŸ ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ืื•ืŸ ื”ื•ื™ืš ืึทื•ื•ื™ื™ืœืึทื‘ื™ืœืึทื˜ื™ ืื™ืŸ ืื•ื ื“ื–ืขืจ ืฆื™ื™ื˜ ืื™ื– ืžืขืจ ืึทืงื•ื˜ืข ื•ื•ื™ ืืœืฅ - ืกืคึผืขืฆื™ืขืœ ื•ื•ืขืŸ ืžื™ืจ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื“ืึทื˜ืŸ ืื•ืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–, ืื•ืŸ ื˜ืจืึทืงื™ื ื’ ื“ืึทื˜ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ื– ื ื™ืฉื˜ ื‘ืึทื–ื•ื ื“ืขืจ ืื™ืŸ ื“ืขื ืึทืจื•ื™ืกื’ืขื‘ืŸ. ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ื•ื•ืึธืก ืื™ืŸ ืคึผืจื™ื ืฆื™ืคึผ ืงืขื ืขืŸ ื’ื™ื™ืŸ ืคืึทืœืฉ ืื•ืŸ ื•ื•ืึธืก ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ืžื™ื˜ ื“ืขื‘ืขื–ื™ื•ื ืื™ืŸ ื™ืขื“ืขืจ ืคืึทืœ.

ืขืก ื–ืขื ืขืŸ ื“ืจื™ื™ ืึธืคึผื˜-ืื•ื™ืก ืึธืคึผืฆื™ืขืก:

  1. ืงืึทืคืงืึท ืงืึธื ื ืขืงื˜ ื“ื•ืจื›ืคืึทืœ. ืื•ื™ื‘ ืงืึธื ื ืขืงื˜ ืื™ื– ืงืึทื ืคื™ื’ื™ืขืจื“ ืฆื• ืึทืจื‘ืขื˜ืŸ ืื™ืŸ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืžืึธื“ืข, ื“ืึธืก ืจื™ืงื•ื•ื™ื™ืขืจื– ืงื™ื™ืคืœ ื˜ื•ืขืจืก ืฆื• ืฉื˜ืขืœืŸ ื“ื™ ื–ืขืœื‘ืข group.id. ื“ืขืจื ืึธืš, ืื•ื™ื‘ ืื™ื™ื ืขืจ ืคื•ืŸ ื–ื™ื™ ืคื™ื™ืœื–, ื“ื™ ืงืึทื ืขืงื˜ืขืจ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืจื™ืกื˜ืึทืจื˜ื™ื“ ืื•ื™ืฃ ืืŸ ืื ื“ืขืจ ืึทืจื‘ืขื˜ืขืจ ืื•ืŸ ืคืึธืจื–ืขืฆืŸ ืœื™ื™ืขื ืขืŸ ืคื•ืŸ ื“ื™ ืœืขืฆื˜ืข ืงืึทืžื™ื˜ืึทื“ ืฉื˜ืขืœืข ืื™ืŸ ื“ืขืจ ื˜ืขืžืข ืื™ืŸ ืงืึทืคืงืึท.
  2. ืึธื ื•ื•ืขืจ ืคื•ืŸ ืงืึทื ืขืงื˜ื™ื•ื•ื™ื˜ื™ ืžื™ื˜ ื“ื™ ืงืึทืคืงืึท ืงื ื•ื™ืœ. ื“ืขืจ ืงืึทื ืขืงื˜ืขืจ ื•ื•ืขื˜ ืคืฉื•ื˜ ื”ืึทืœื˜ืŸ ืœื™ื™ืขื ืขืŸ ืื™ืŸ ื“ืขืจ ืฉื˜ืขืœืข ื•ื•ืึธืก ืื™ื– ื ื™ื˜ ืึทื ื“ืขืจืฉ ืฆื• ืฉื™ืงืŸ ืฆื• ืงืึทืคืงืึท, ืื•ืŸ ื•ื•ืขื˜ ืคึผื™ืจื™ืึทื“ื™ืงืœื™ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฉื™ืงืŸ ืขืก ื•ื•ื™ื“ืขืจ ื‘ื™ื– ื“ื™ ืคึผืจื•ื•ื•ืŸ ืื™ื– ื’ืขืจืึธื˜ืŸ.
  3. ืึทื ืึทื•ื•ื™ื™ืœืึทื‘ื™ืœื™ื˜ื™ ืคื•ืŸ ื“ืึทื˜ืŸ ืžืงื•ืจ. ื“ืขืจ ืงืึทื ืขืงื˜ืขืจ ื•ื•ืขื˜ ืคึผืจื•ื•ื•ืŸ ืฆื• ืจื™ืงืึทื ืขืงื˜ ืฆื• ื“ื™ ืžืงื•ืจ ื•ื•ื™ ืงืึทื ืคื™ื’ื™ืขืจื“. ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ ืื™ื– 16 ืคืจื•ื•ื•ืŸ ื ื™ืฆืŸ ืขืงืกืคึผืึธื•ื ืขื ืฉืึทืœ ื‘ืึทืงืึธืคืฃ. ื ืึธืš ื“ื™ 16 ื ื™ื˜ ื’ืขืจืึธื˜ืŸ ืคึผืจื•ื•ื•ืŸ, ื“ื™ ืึทืจื‘ืขื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื ื’ืขืฆื™ื™ื›ื ื˜ ื•ื•ื™ ื ื™ื˜ ืึทื ื“ืขืจืฉ ืื•ืŸ ืื™ืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืžืึทื ื™ื•ืึทืœื™ ืจื™ืกื˜ืึทืจื˜ ืขืก ื“ื•ืจืš ื“ื™ Kafka Connect REST ืฆื•ื‘ื™ื ื“.
    • ืื™ืŸ ื“ืขื ืคืึทืœ ืคึผืึธืกื˜ื’ืจืขืกืงืœ ื“ื™ ื“ืึทื˜ืŸ ื•ื•ืขื˜ ื ื™ื˜ ื–ื™ื™ืŸ ืคืึทืจืคืึทืœืŸ, ื•ื•ื™ื™ึทืœ ื ื™ืฆืŸ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืกืœืึธืฅ ื•ื•ืขื˜ ืคืึทืจืžื™ื™ึทื“ืŸ ืื™ืจ ืฆื• ื•ื™ืกืžืขืงืŸ WAL ื˜ืขืงืขืก ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ืœื™ื™ืขื ืขืŸ ื“ื•ืจืš ื“ื™ ืงืึทื ืขืงื˜ืขืจ. ืื™ืŸ ื“ืขื ืคืึทืœ, ืขืก ืื™ื– ืื•ื™ืš ืึท ื“ืึทื•ื ืกื™ื™ื“ ืฆื• ื“ื™ ืžืึทื˜ื‘ื™ื™ืข: ืื•ื™ื‘ ื“ื™ ื ืขืฅ ืงืึทื ืขืงื˜ื™ื•ื•ื™ื˜ื™ ืฆื•ื•ื™ืฉืŸ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืื•ืŸ ื“ื™ DBMS ืื™ื– ื“ื™ืกืจืึทืคึผื˜ื™ื“ ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜, ืขืก ืื™ื– ืึท ืžืขื’ืœืขื›ืงื™ื™ื˜ ืึทื– ื“ื™ ื“ื™ืกืง ืคึผืœืึทืฅ ื•ื•ืขื˜ ืœื•ื™ืคืŸ ืื•ื™ืก, ืื•ืŸ ื“ืึธืก ืงืขืŸ ืคื™ืจืŸ ืฆื• ืึท ื“ื•ืจื›ืคืึทืœ ืคื•ืŸ ื“ื™ ืžืึทื˜ื‘ื™ื™ืข. ื“ื™ ื’ืื ืฆืข DBMS.
    • ืื™ืŸ ื“ืขื ืคืึทืœ ืžื™ืกืงืœ binlog ื˜ืขืงืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจืึธื•ื˜ื™ื™ื˜ื™ื“ ื“ื•ืจืš ื“ื™ DBMS ื–ื™ืš ืื™ื™ื“ืขืจ ืงืึทื ืขืงื˜ื™ื•ื•ื™ื˜ื™ ืื™ื– ื’ืขื–ื•ื ื˜. ื“ืึธืก ื•ื•ืขื˜ ืคืึทืจืฉืึทืคืŸ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืื™ืŸ ื“ื™ ื ื™ื˜ ืึทื ื“ืขืจืฉ ืฉื˜ืึทื˜, ืื•ืŸ ืฆื• ื•ืžืงืขืจืŸ ื ืึธืจืžืึทืœ ืึธืคึผืขืจืึทืฆื™ืข, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืจื™ืกื˜ืึทืจื˜ ืื™ืŸ ืขืจืฉื˜ ืžืึธืžืขื ื˜ื‘ื™ืœื“ ืžืึธื“ืข ืฆื• ืคืึธืจื–ืขืฆืŸ ืœื™ื™ืขื ืขืŸ ืคึฟื•ืŸ ื‘ื™ื ืœืึธื’ืก.
    • ืื•ื™ืฃ ืžืึธื ื’ืึธื“ื‘. ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ื–ืื’ื˜: ื“ื™ ื ืึทื˜ื•ืจ ืคื•ืŸ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืื™ืŸ ื“ื™ ื’ืขืฉืขืขื ื™ืฉ ืึทื– ืงืœืึธืฅ / ืึธืคึผืœืึธื’ ื˜ืขืงืขืก ื–ืขื ืขืŸ ืื•ื™ืกื’ืขืžืขืงื˜ ืื•ืŸ ื“ืขืจ ืงืึทื ืขืงื˜ืขืจ ืงืขืŸ ื ื™ืฉื˜ ืคืึธืจื–ืขืฆืŸ ืœื™ื™ืขื ืขืŸ ืคึฟื•ืŸ ื“ื™ ืฉื˜ืขืœืข ื•ื•ื• ืขืก ืื™ื– ืœื™ื ืงืก ืื™ื– ื“ื™ ื–ืขืœื‘ืข ืคึฟืึทืจ ืึทืœืข ื“ื‘ืžืก. ืขืก ืžื™ื˜ืœ ืึทื– ื“ื™ ืงืึทื ืขืงื˜ืขืจ ื•ื•ืขื˜ ื’ื™ื™ืŸ ืื™ืŸ ื“ื™ ืฉื˜ืึทื˜ ื ื™ื˜ ืึทื ื“ืขืจืฉ ืื•ืŸ ื•ื•ืขื˜ ื“ืึทืจืคืŸ ืจื™ืกื˜ืึทืจื˜ื™ื ื’ ืื™ืŸ ืžืึธื“ืข ืขืจืฉื˜ ืžืึธืžืขื ื˜ื‘ื™ืœื“.

      ืึธื‘ืขืจ, ืขืก ื–ืขื ืขืŸ ืื•ื™ืกื ืขืžืขืŸ. ืื•ื™ื‘ ื“ื™ ืงืึทื ืขืงื˜ืขืจ ืื™ื– ื’ืขื•ื•ืขืŸ ื“ื™ืกืงืึทื ืขืงื˜ื™ื“ ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ื˜ (ืึธื“ืขืจ ืงืขืŸ ื ื™ืฉื˜ ื“ืขืจื’ืจื™ื™ื›ืŸ ื“ืขื MongoDB ื‘ื™ื™ึทืฉืคึผื™ืœ), ืื•ืŸ ื“ื™ ืึธืคึผืœืึธื’ ืื™ื– ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ืจืึธื•ื˜ื™ื™ืฉืึทืŸ ื‘ืขืฉืึทืก ื“ืขื ืฆื™ื™ื˜, ื•ื•ืขืŸ ื“ื™ ืงืฉืจ ืื™ื– ื’ืขื–ื•ื ื˜, ื“ื™ ืงืึทื ืขืงื˜ืขืจ ื•ื•ืขื˜ ืจื•ื™ืง ืคืึธืจื–ืขืฆืŸ ืฆื• ืœื™ื™ืขื ืขืŸ ื“ืึทื˜ืŸ ืคึฟื•ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ืคืึทืจืึทื ืขืŸ ืฉื˜ืขืœืข, ื•ื•ืึธืก ืื™ื– ื•ื•ืึธืก ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื“ืึทื˜ืŸ ืื™ืŸ Kafka ืงื™ื™ืŸ ื•ื•ืขื˜ ืฉืœืึธื’ืŸ.

ืกืึธืฃ

ื“ืขื‘ืขื–ื™ื•ื ืื™ื– ืžื™ื™ืŸ ืขืจืฉื˜ืขืจ ื“ืขืจืคืึทืจื•ื ื’ ืžื™ื˜ CDC ืกื™ืกื˜ืขืžืขืŸ ืื•ืŸ ืงื•ื™ืœืขืœื“ื™ืง ื–ื™ื™ืขืจ positive. ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื•ื•ืึทืŸ ืื™ื‘ืขืจ ืžื™ื˜ ื–ื™ื™ืŸ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ื”ื•ื™ืคึผื˜ DBMSs, ื™ื– ืคื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ, ืงืœืึทืกื˜ืขืจื™ื ื’ ืฉื˜ื™ืฆืŸ ืื•ืŸ ืึทืงื˜ื™ื•ื• ืงื”ืœ. ืคึฟืึทืจ ื™ืขื ืข ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ืคื™ืจ, ืื™ืš ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืื™ืจ ืœื™ื™ืขื ืขืŸ ื“ื™ ืคื™ืจืขืจ ืคึฟืึทืจ ืงืึทืคืงืึท ืงืึธื ื ืขืงื˜ ะธ ื“ืขื‘ืขื–ื™ื•ื.

ืงืึทืžืคึผืขืจื“ ืžื™ื˜ ื“ื™ JDBC ืงืึทื ืขืงื˜ืขืจ ืคึฟืึทืจ Kafka Connect, ื“ื™ ื”ื•ื™ืคึผื˜ ืžื™ื™ึทืœืข ืคื•ืŸ โ€‹โ€‹Debezium ืื™ื– ืึทื– ืขื ื“ืขืจื•ื ื’ืขืŸ ื–ืขื ืขืŸ ืœื™ื™ืขื ืขืŸ ืคึฟื•ืŸ ื“ื™ DBMS ืœืึธื’ืก, ื•ื•ืึธืก ืึทืœืึทื•ื– ื“ืึทื˜ืŸ ืฆื• ื–ื™ื™ืŸ ื‘ืืงื•ืžืขืŸ ืžื™ื˜ ืžื™ื ื™ืžืึทืœ ืœื™ื™ื˜ืึทื ืกื™. ื“ื™ JDBC ืงืึทื ืขืงื˜ืขืจ (ืคึฟื•ืŸ Kafka Connect) ืคึฟืจืื’ืŸ ื“ื™ ืžืึธื ื™ื˜ืึธืจืขื“ ื˜ื™ืฉ ืžื™ื˜ ืึท ืคืึทืจืคืขืกื˜ื™ืงื˜ ืžืขื”ืึทืœืขืš ืื•ืŸ (ืคึฟืึทืจ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืกื™ื‘ื”) ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื ื™ืฉื˜ ืึทืจื˜ื™ืงืœืขืŸ ื•ื•ืขืŸ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ืื•ื™ืกื’ืขืžืขืงื˜ (ื•ื•ื™ ืงืขื ืขืŸ ืื™ืจ ืึธื ืคืจืขื’ ื“ืึทื˜ืŸ ื•ื•ืึธืก ื˜ืึธืŸ ื ื™ื˜ ืขืงืกื™ืกื˜ื™ืจืŸ?).

ืฆื• ืกืึธืœื•ื•ืข ืขื ืœืขืš ืคึผืจืึธื‘ืœืขืžืก, ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืฆืึธืœืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜ ืฆื• ื“ื™ ืคืืœื’ืขื ื“ืข ืกืึทืœื•ืฉืึทื ื– (ืื™ืŸ ื“ืขืจืฆื• ืฆื• ื“ืขื‘ืขื–ื™ื•ื):

ืคึผืก

ืœื™ื™ืขื ืขืŸ ืื•ื™ืš ืื•ื™ืฃ ืื•ื ื“ื–ืขืจ ื‘ืœืึธื’:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’