Apache Kafka-āĻāϰ āϜāĻ¨ā§āϝ Debezium - CDC āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

Apache Kafka-āĻāϰ āϜāĻ¨ā§āϝ Debezium - CDC āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āφāĻŽāĻžāϰ āĻ•āĻžāĻœā§‡, āφāĻŽāĻŋ āĻĒā§āϰāĻžāϝāĻŧāĻļāχ āύāϤ⧁āύ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāĻ—āϤ āϏāĻŽāĻžāϧāĻžāύ / āϏāĻĢā§āϟāĻ“āϝāĻŧā§āϝāĻžāϰ āĻĒāĻŖā§āϝāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāχ, āϝāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϤāĻĨā§āϝ āϰāĻžāĻļāĻŋāϝāĻŧāĻžāύ-āĻ­āĻžāώ⧀ āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āϖ⧁āĻŦ āĻ•āĻŽāĨ¤ āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡, āφāĻŽāĻŋ āφāĻŽāĻžāϰ āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ• āĻ…āύ⧁āĻļā§€āϞāύ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āĻļā§‚āĻ¨ā§āϝāϤāĻž āĻĒā§‚āϰāĻŖ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŦ, āϝāĻ–āύ āφāĻŽāĻžāϕ⧇ āĻĻ⧁āϟāĻŋ āϜāύāĻĒā§āϰāĻŋāϝāĻŧ DBMSs (PostgreSQL āĻāĻŦāĻ‚ MongoDB) āĻĨ⧇āϕ⧇ Debezium āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻĢāĻ•āĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇ CDC āχāϭ⧇āĻ¨ā§āϟ āĻĒāĻžāĻ āĻžāύ⧋āϰ āϏ⧇āϟ āφāĻĒ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āφāĻŽāĻŋ āφāĻļāĻž āĻ•āϰāĻŋ āϝ⧇ āĻāχ āĻĒāĻ°ā§āϝāĻžāϞ⧋āϚāύāĻž āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋ, āϝāĻž āĻ•āĻžāĻœā§‡āϰ āĻĢāϞāĻžāĻĢāϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āωāĻĒāĻ¸ā§āĻĨāĻŋāϤ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āĻ…āĻ¨ā§āϝāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻĻāϰāĻ•āĻžāϰ⧀ āĻšāĻŦ⧇āĨ¤

āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇ Debezium āĻāĻŦāĻ‚ CDC āĻ•āĻŋ?

āĻĄā§‡āĻŦ⧇āϜāĻŋāϝāĻŧāĻžāĻŽ - āϏāĻŋāĻĄāĻŋāϏāĻŋ āϏāĻĢā§āϟāĻ“āϝāĻŧā§āϝāĻžāϰ āĻŦāĻŋāĻ­āĻžāϗ⧇āϰ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋ (āϤāĻĨā§āϝ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•ā§āϝāĻžāĻĒāϚāĻžāϰ), āĻŦāĻž āφāϰāĻ“ āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇, āĻāϟāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ DBMS-āĻāϰ āϜāĻ¨ā§āϝ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āϝāĻž Apache Kafka Connect āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖāĨ¤

āĻāχ āĻ“āĻĒ⧇āύ āϏ⧋āĻ°ā§āϏ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ, Apache License v2.0 āĻāϰ āĻ…āϧ⧀āύ⧇ āϞāĻžāχāϏ⧇āĻ¨ā§āϏāĻĒā§āϰāĻžāĻĒā§āϤ āĻāĻŦāĻ‚ Red Hat āĻĻā§āĻŦāĻžāϰāĻž āĻ¸ā§āĻĒāύāϏāϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ 2016 āϏāĻžāϞ āĻĨ⧇āϕ⧇ āωāĻ¨ā§āύāϝāĻŧāύ āϚāϞāϛ⧇ āĻāĻŦāĻ‚ āĻāχ āĻŽā§āĻšā§āĻ°ā§āϤ⧇ āĻāϟāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ DBMS-āĻāϰ āϜāĻ¨ā§āϝ āϏāϰāĻ•āĻžāϰ⧀ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇: MySQL, PostgreSQL, MongoDB, SQL āϏāĻžāĻ°ā§āĻ­āĻžāϰāĨ¤ āĻ•ā§āϝāĻžāϏāĻžāĻ¨ā§āĻĄā§āϰāĻž āĻāĻŦāĻ‚ āĻ“āϰāĻžāĻ•āϞ⧇āϰ āϜāĻ¨ā§āϝāĻ“ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āϰāϝāĻŧ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϤāĻžāϰāĻž āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ "āφāĻ°ā§āϞāĻŋ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ" āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āϰāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āύāϤ⧁āύ āϰāĻŋāϞāĻŋāϜāϗ⧁āϞāĻŋ āĻĒāĻļā§āϚāĻžāĻĻāĻĒāĻĻ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝ⧇āϰ āĻ—ā§āϝāĻžāϰāĻžāĻ¨ā§āϟāĻŋ āĻĻ⧇āϝāĻŧ āύāĻžāĨ¤

āϝāĻĻāĻŋ āφāĻŽāϰāĻž āϏāĻŋāĻĄāĻŋāϏāĻŋāϕ⧇ āϐāϤāĻŋāĻšā§āϝāĻ—āϤ āĻĒāĻĻā§āϧāϤāĻŋāϰ āϏāĻžāĻĨ⧇ āϤ⧁āϞāύāĻž āĻ•āϰāĻŋ (āϝāĻ–āύ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāϏ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧ⧇), āϤāĻŦ⧇ āĻāϰ āĻĒā§āϰāϧāĻžāύ āϏ⧁āĻŦāĻŋāϧāĻžāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ āĻ•āĻŽ āĻŦāĻŋāϞāĻŽā§āĻŦ, āωāĻšā§āϚ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝāϤāĻž āĻāĻŦāĻ‚ āĻĒā§āϰāĻžāĻĒā§āϝāϤāĻž āϏāĻš āϏāĻžāϰāĻŋ āĻ¸ā§āϤāϰ⧇ āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽāĻŋāĻ‚ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύāĨ¤ CDC āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ—ā§āϰāĻšāĻ¸ā§āĻĨāϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻžāĻĢāĻ•āĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻļ⧇āώ āĻĻ⧁āϟāĻŋ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻ…āĻ°ā§āϜāύ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āϏ⧁āĻŦāĻŋāϧāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ āϝ⧇ āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āĻŽāĻĄā§‡āϞ āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āϏāĻžā§āϚāϝāĻŧ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ, āϤāĻžāχ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋāϕ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāϏ āĻĒāϰāĻŋāϚāĻžāϞāύāĻžāϰ āϏ⧂āĻ•ā§āĻˇā§āĻŽāϤāĻž āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϚāĻŋāĻ¨ā§āϤāĻž āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āύāĻžāĨ¤

āĻ…āĻŦāĻļ⧇āώ⧇, āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ°ā§āϤāĻž āĻŦā§āϰ⧋āĻ•āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋāϰ āĻ…āύ⧁āĻ­ā§‚āĻŽāĻŋāĻ• āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻ•āϰāĻžāϰ āϏ⧁āϝ⧋āĻ— āϖ⧁āϞ⧇ āĻĻ⧇āϝāĻŧ āϝāĻž āĻĄā§‡āϟāĻžāϤ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞāĻŋ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰ⧇āĨ¤ āĻāĻ•āχ āϏāĻŽāϝāĻŧ⧇, āĻĄā§‡āϟāĻž āωāĻ¤ā§āϏ⧇āϰ āωāĻĒāϰ āĻĒā§āϰāĻ­āĻžāĻŦ āĻšā§āϰāĻžāϏ āĻ•āϰāĻž āĻšāϝāĻŧ, āϝ⧇āĻšā§‡āϤ⧁ āĻĄā§‡āϟāĻž āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāϏ āĻĨ⧇āϕ⧇ āύāϝāĻŧ, āĻ•āĻžāĻĢāĻ•āĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻžāĻĒā§āϤ āĻšāϝāĻŧāĨ¤

āĻĄā§‡āĻŦ⧇āϜāĻŋāϝāĻŧāĻžāĻŽ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇

Debezium āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻāχ āϏāĻšāϜ āĻ¸ā§āĻ•āĻŋāĻŽā§‡ āύ⧇āĻŽā§‡ āφāϏ⧇:

DBMS (āĻĄā§‡āϟāĻž āĻ‰ā§ŽāϏ āĻšāĻŋāϏ⧇āĻŦ⧇) → āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āĻŸā§‡ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ → āĻ…ā§āϝāĻžāĻĒāĻžāϚāĻŋ āĻ•āĻžāĻĢāĻ•āĻž → āĻ­ā§‹āĻ•ā§āϤāĻž

āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻšāĻŋāϏāĻžāĻŦ⧇, āφāĻŽāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻĄāĻžāϝāĻŧāĻžāĻ—ā§āϰāĻžāĻŽ āĻĻ⧇āĻŦ:

Apache Kafka-āĻāϰ āϜāĻ¨ā§āϝ Debezium - CDC āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āϝāĻžāχāĻšā§‹āĻ•, āφāĻŽāĻŋ āĻāχ āĻ¸ā§āĻ•āĻŋāĻŽāϟāĻŋ āϏāĻ¤ā§āϝāĻŋāχ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻŋ āύāĻž, āĻ•āĻžāϰāĻŖ āĻŽāύ⧇ āĻšāĻšā§āϛ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āϏāĻŋāĻ™ā§āĻ• āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āϏāĻŽā§āĻ­āĻŦāĨ¤

āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇, āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻ­āĻŋāĻ¨ā§āύ: āφāĻĒāύāĻžāϰ āĻĄā§‡āϟāĻž āϞ⧇āĻ• āĻ­āϰāĻžāϟ āĻ•āϰāĻž (āωāĻĒāϰ⧇āϰ āϚāĻŋāĻ¤ā§āϰ⧇āϰ āĻļ⧇āώ āϞāĻŋāĻ™ā§āĻ•) Debezium āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻāĻ•āĻŽāĻžāĻ¤ā§āϰ āωāĻĒāĻžāϝāĻŧ āύāϝāĻŧāĨ¤ Apache Kafka-āϤ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϤ⧇ āĻŽā§‹āĻ•āĻžāĻŦ⧇āϞāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āωāĻĻāĻžāĻšāϰāĻŖ āĻ¸ā§āĻŦāϰ⧂āĻĒ:

  • āĻ•ā§āϝāĻžāĻļ⧇ āĻĨ⧇āϕ⧇ āĻ…āĻĒā§āϰāĻžāϏāĻ™ā§āĻ—āĻŋāĻ• āϤāĻĨā§āϝ āĻ…āĻĒāϏāĻžāϰāĻŖ;
  • āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāĻ āĻžāύ⧋;
  • āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āϏ⧂āϚāĻ• āφāĻĒāĻĄā§‡āϟ;
  • āĻ•āĻŋāϛ⧁ āϧāϰāύ⧇āϰ āĻ…āĻĄāĻŋāϟ āϞāĻ—;
  • ...

āφāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āϜāĻžāĻ­āĻž āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āĻ•āĻžāĻĢāĻ•āĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϕ⧋āύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ/āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āύāĻž āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻžāĻ“ āϰāϝāĻŧ⧇āϛ⧇ āĻāĻŽāĻŦ⧇āĻĄā§‡āĻĄ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀. āϏ⧁āĻ¸ā§āĻĒāĻˇā§āϟ āĻĒā§āϞāĻžāϏ āĻšāϞ āϝ⧇ āĻāϟāĻŋāϰ āϏāĻžāĻĨ⧇ āφāĻĒāύāĻŋ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹ (āĻāĻ•āϟāĻŋ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻāĻŦāĻ‚ āĻ•āĻžāĻĢāĻ•āĻžāϰ āφāĻ•āĻžāϰ⧇) āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āϝāĻžāχāĻšā§‹āĻ•, āĻāχ āϏāĻŽāĻžāϧāĻžāύāϟāĻŋ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ 1.1 āĻĨ⧇āϕ⧇ āĻ…āĻŦāĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āφāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰāĻž āĻšāϝāĻŧ āύāĻž (āĻāϟāĻŋ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇āϰ āĻĒā§āϰāĻ•āĻžāĻļāϗ⧁āϞāĻŋāϤ⧇ āϏāϰāĻžāύ⧋ āĻšāϤ⧇ āĻĒāĻžāϰ⧇)āĨ¤

āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āϏ⧁āĻĒāĻžāϰāĻŋāĻļāĻ•ā§ƒāϤ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ āύāĻŋāϝāĻŧ⧇ āφāϞ⧋āϚāύāĻž āĻ•āϰāĻŦ⧇, āϝāĻž āĻ¤ā§āϰ⧁āϟāĻŋ āϏāĻšāύāĻļā§€āϞāϤāĻž āĻāĻŦāĻ‚ āĻŽāĻžāĻĒāϝ⧋āĻ—ā§āϝāϤāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ

āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻŽāĻžāύ - āĻĄā§‡āϟāĻž - āĻāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞāĻŋ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻž āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ:

  1. āĻĄā§‡āϟāĻž āĻ‰ā§ŽāϏ, āϝāĻž MySQL āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ 5.7 āĻĨ⧇āϕ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇, PostgreSQL 9.6+, MongoDB 3.2+ (āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϤāĻžāϞāĻŋāĻ•āĻž);
  2. āĻ…ā§āϝāĻžāĻĒāĻžāϚāĻŋ āĻ•āĻžāĻĢāĻ•āĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ
  3. āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ (āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ 1.x, 2.x);
  4. āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž Debezium āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀.

āĻĒā§āϰāĻĨāĻŽ āĻĻ⧁āϟāĻŋ āĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡ āĻ•āĻžāϜ āĻ•āϰ⧁āύ, āϝ⧇āĻŽāύ āĻāĻ•āϟāĻŋ DBMS āĻāĻŦāĻ‚ Apache Kafka āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻžāϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āϏ⧁āϝ⧋āϗ⧇āϰ āĻŦāĻžāχāϰ⧇āĨ¤ āϝāĻžāχāĻšā§‹āĻ•, āϝāĻžāϰāĻž āĻāĻ•āϟāĻŋ āĻ¸ā§āϝāĻžāĻ¨ā§āĻĄāĻŦāĻ•ā§āϏ⧇ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āϚāĻžāύ, āϤāĻžāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻ…āĻĢāĻŋāϏāĻŋāϝāĻŧāĻžāϞ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϤ⧇ āωāĻĻāĻžāĻšāϰāĻŖ āϏāĻš āĻāĻ•āϟāĻŋ āϰ⧇āĻĄāĻŋāĻŽā§‡āĻĄ āϰāϝāĻŧ⧇āϛ⧇ docker-compose.yaml.

āφāĻŽāϰāĻž āφāϰāĻ“ āĻŦāĻŋāĻļāĻĻ⧇ āĻļ⧇āώ āĻĻ⧁āϟāĻŋ āĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡ āĻĢā§‹āĻ•āĻžāϏ āĻ•āϰāĻŦāĨ¤

0. āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ

āĻāĻ–āĻžāύ⧇ āĻāĻŦāĻ‚ āĻĒāϰ⧇ āύāĻŋāĻŦāĻ¨ā§āϧ⧇, āϏāĻŽāĻ¸ā§āϤ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āωāĻĻāĻžāĻšāϰāĻŖ Debezium āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻĄāĻ•āĻžāϰ āϚāĻŋāĻ¤ā§āϰ⧇āϰ āĻĒā§āϰāϏāĻ™ā§āϗ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāϟāĻŋāϤ⧇ āϏāĻŽāĻ¸ā§āϤ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒā§āϞāĻžāĻ—āχāύ āĻĢāĻžāχāϞ (āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀) āϰāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāĻŦ⧇āĻļ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻ•āύāĻĢā§āϞ⧁āϝāĻŧ⧇āĻ¨ā§āϟ āĻĨ⧇āϕ⧇ āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻžāϕ⧇ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻ•āĻžāύ⧇āĻ•ā§āϟāϰ⧇āϰ āĻĒā§āϞāĻžāĻ—āχāύāϗ⧁āϞāĻŋāϕ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ plugin.path āĻ…āĻĨāĻŦāĻž āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāĻļā§€āϞ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏ⧇āϟ CLASSPATH. āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻ•āĻ°ā§āĻŽā§€ āĻāĻŦāĻ‚ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āϏ⧇āϟāĻŋāĻ‚āϏ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĢāĻžāχāϞ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻž āĻšāϝāĻŧ āϝāĻž āĻ•āĻ°ā§āĻŽā§€ āĻ¸ā§āϟāĻžāĻ°ā§āϟ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĒāĻžāϏ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāĻžāϰ āϜāĻ¨ā§āϝ āĻĻ⧇āϖ⧁āύ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ.

āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇ Debeizum āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻžāϰ āĻĒ⧁āϰ⧋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĻ⧁āϟāĻŋ āĻĒāĻ°ā§āϝāĻžāϝāĻŧ⧇ āϏāĻžā§āϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧāĨ¤ āφāϏ⧁āύ āϤāĻžāĻĻ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āϝāĻžāĻ•:

1. āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻž

Apache Kafka āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇ āĻĄā§‡āϟāĻž āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ āĻ•āϰāϤ⧇, āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏ⧇āϟ āĻ•āϰāĻž āĻšāϝāĻŧ, āϝ⧇āĻŽāύ:

  • āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āϏāĻ‚āϝ⧋āĻ— āϏ⧇āϟāĻŋāĻ‚āϏ,
  • āĻŦāĻŋāώāϝāĻŧāϗ⧁āϞāĻŋāϰ āύāĻžāĻŽ āϝ⧇āĻ–āĻžāύ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āύāĻŋāĻœā§‡āχ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāĻŦ⧇,
  • āϝ⧇ āĻ—ā§āϰ⧁āĻĒ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āϚāϞāϛ⧇ āϤāĻžāϰ āύāĻžāĻŽ (āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āĻŽā§‹āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇)āĨ¤

āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻ…āĻĢāĻŋāϏāĻŋāϝāĻŧāĻžāϞ āĻĄāĻ•āĻžāϰ āχāĻŽā§‡āϜ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇āϰ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇ - āĻāϟāĻŋāχ āφāĻŽāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦāĨ¤ āϤ⧋ āϚāϞ⧁āύ āĻ›āĻŦāĻŋāϟāĻŋ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻŋāσ

docker pull debezium/connect

āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒāϰāĻŋāĻŦ⧇āĻļ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ⧇āϰ āĻ¨ā§āϝ⧂āύāϤāĻŽ āϏ⧇āϟ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ:

  • BOOTSTRAP_SERVERS=kafka-1:9092,kafka-2:9092,kafka-3:9092 - āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āϏāĻĻāĻ¸ā§āϝāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϤāĻžāϞāĻŋāĻ•āĻž āĻĒ⧇āϤ⧇ āĻ•āĻžāĻĢāĻ•āĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āϤāĻžāϞāĻŋāĻ•āĻž;
  • 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 āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰāĻ•āĻžāϰ⧀āϰ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻšāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻžāĻ°ā§āϤāĻžāϗ⧁āϞāĻŋāϕ⧇ āϏāĻŋāϰāĻŋāϝāĻŧāĻžāϞāĻžāχāϜ āĻ•āϰāĻž āĻ…āĻ­ā§āϰ āĻāĻ•āϟāĻŋ āĻŦāĻžāχāύāĻžāϰāĻŋ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇, āϝāĻž Apache Kafka-āϤ⧇ I/O āϏāĻžāĻŦāϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϞ⧋āĻĄ āĻšā§āϰāĻžāϏ āĻ•āϰ⧇āĨ¤

āĻ…āĻ­ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻ¸ā§āĻ•āĻŋāĻŽāĻž-āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ (āĻ¸ā§āĻ•āĻŋāĻŽ āϏāĻ‚āϰāĻ•ā§āώāϪ⧇āϰ āϜāĻ¨ā§āϝ)āĨ¤ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻāχ āĻŽāϤ āĻĻ⧇āĻ–āĻžāĻŦ⧇:

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

āĻ…āĻ­ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāĻŦāĻ‚ āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻžāϰ āĻŦāĻŋāĻļāĻĻ āĻŦāĻŋāĻŦāϰāĻŖ āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āϏ⧁āϝ⧋āϗ⧇āϰ āĻŦāĻžāχāϰ⧇ - āφāϰāĻ“, āĻ¸ā§āĻĒāĻˇā§āϟāϤāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻŽāϰāĻž JSON āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦāĨ¤

2. āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āύāĻŋāĻœā§‡āχ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻž

āĻāĻ–āύ āφāĻĒāύāĻŋ āϏāϰāĻžāϏāϰāĻŋ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ, āϝāĻž āĻ‰ā§ŽāϏ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧāĻŦ⧇āĨ¤

āφāϏ⧁āύ āĻĻ⧁āϟāĻŋ DBMS-āĻāϰ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻ⧇āĻ–āĻŋ: PostgreSQL āĻāĻŦāĻ‚ MongoDB, āϝāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāϰ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āφāϛ⧇ āĻāĻŦāĻ‚ āϝāĻžāϰ āϜāĻ¨ā§āϝ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āϰāϝāĻŧ⧇āϛ⧇ (āϛ⧋āϟ āĻšāϞ⧇āĻ“, āϤāĻŦ⧇ āĻ•āĻŋāϛ⧁ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϤāĻžā§ŽāĻĒāĻ°ā§āϝāĻĒā§‚āĻ°ā§āĻŖ!)

āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϟāĻŋ JSON āĻ¸ā§āĻŦāϰāϞāĻŋāĻĒāĻŋāϤ⧇ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ POST āĻ…āύ⧁āϰ⧋āϧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āĻŸā§‡ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

2.1āĨ¤ āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āĻāϏāĻ•āĻŋāωāĻāϞ

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"
  }
}

āĻāχ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āĻĒāϰ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āĻ…āĻĒāĻžāϰ⧇āĻļāύ⧇āϰ āύ⧀āϤāĻŋāϟāĻŋ āĻŦ⧇āĻļ āϏāĻšāϜ:

  • āĻĒā§āϰāĻĨāĻŽ āĻļ⧁āϰ⧁āϤ⧇, āĻāϟāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻž āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŽā§‹āĻĄā§‡ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻ¸ā§āĻ¨ā§āϝāĻžāĻĒāĻļāϟ, āĻļāĻ°ā§āϤāϏāĻžāĻĒ⧇āĻ•ā§āώ⧇ āĻĒā§āϰāĻžāĻĒā§āϤ āĻĄā§‡āϟāĻžāϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āϏ⧇āϟ āĻ•āĻžāĻĢāĻ•āĻžāϕ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āĻšāĻšā§āϛ⧇ SELECT * FROM table_name.
  • āφāϰāĻŽā§āĻ­ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ PostgreSQL WAL āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻĨ⧇āϕ⧇ āĻĒāĻĄāĻŧāĻžāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻŽā§‹āĻĄā§‡ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰ⧇āĨ¤

āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇:

  • name — āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āϝāĻžāϰ āϜāĻ¨ā§āϝ āύ⧀āĻšā§‡ āĻŦāĻ°ā§āĻŖāĻŋāϤ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇; āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇, āĻāχ āύāĻžāĻŽāϟāĻŋ āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ REST API-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāĻŦ⧇ (āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻĻ⧇āϖ⧁āύ / āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ / āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ);
  • connector.class — āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§ƒāϤ DBMS āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻļā§āϰ⧇āĻŖā§€;
  • plugin.name WAL āĻĢāĻžāχāϞ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻžāϰ āϝ⧌āĻ•ā§āϤāĻŋāĻ• āĻĄāĻŋāϕ⧋āĻĄāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϞāĻžāĻ—āχāύāϟāĻŋāϰ āύāĻžāĻŽāĨ¤ āĻĨ⧇āϕ⧇ āϚāϝāĻŧāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āωāĻĒāϞāĻŦā§āϧ wal2json, decoderbuffs и pgoutput. āĻĒā§āϰāĻĨāĻŽ āĻĻ⧁āϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāϏ⧇ āωāĻĒāϝ⧁āĻ•ā§āϤ āĻāĻ•ā§āϏāĻŸā§‡āύāĻļāύ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ, āĻāĻŦāĻ‚ pgoutput PostgreSQL āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ 10 āĻāĻŦāĻ‚ āωāĻšā§āϚāϤāϰ āϜāĻ¨ā§āϝ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻŽā§āϝāĻžāύāĻŋāĻĒ⧁āϞ⧇āĻļāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ āύāĻž;
  • database.* — āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāĻžāϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ, āϝ⧇āĻ–āĻžāύ⧇ database.server.name - āĻ•āĻžāĻĢāĻ•āĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇ āĻŦāĻŋāώāϝāĻŧ⧇āϰ āύāĻžāĻŽ āĻ—āĻ āύ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ PostgreSQL āωāĻĻāĻžāĻšāϰāϪ⧇āϰ āύāĻžāĻŽ;
  • 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 - āϏāϰāĻžāϏāϰāĻŋ āφāĻŽāϰāĻž āĻ•āĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻŋāĨ¤

āĻšāĻžāĻ°ā§āϟāĻŦāĻŋāϟ āĻāĻŦāĻ‚ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“

āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇, āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋāĻŦāĻĻā§āϧ āϞ⧇āύāĻĻ⧇āύ⧇āϰ āϜāĻ¨ā§āϝ āĻ•āĻžāĻĢāĻ•āĻžāϰ āĻ•āĻžāϛ⧇ āĻĄā§‡āϟāĻž āĻĒāĻžāĻ āĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻŦāĻŋāώāϝāĻŧ⧇ āϤāĻžāϰ LSN (āϞāĻ— āϏāĻŋāϕ⧋āϝāĻŧ⧇āĻ¨ā§āϏ āύāĻŽā§āĻŦāϰ) āϞāĻŋāϖ⧇ āĻĻ⧇āϝāĻŧāĨ¤ offset. āϤāĻŦ⧇ āĻ•āĻŋ āĻšāĻŦ⧇ āϝāĻĻāĻŋ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĒāĻĄāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ āύāĻž, āϤāĻŦ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϤāĻžāϰ āĻŸā§‡āĻŦāĻŋāϞ⧇āϰ āĻāĻ•āϟāĻŋ āĻ…āĻ‚āĻļ (āϝāĻžāϤ⧇ āĻĄā§‡āϟāĻž āĻ•āĻĻāĻžāϚāĻŋā§Ž āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž āĻšāϝāĻŧ)?

  • āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ WAL āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻĒāĻĄāĻŧāĻŦ⧇ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āϞ⧇āύāĻĻ⧇āύ⧇āϰ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻŦ⧇ āύāĻž āϝ⧇ āĻŸā§‡āĻŦāĻŋāϞāϗ⧁āϞāĻŋ āĻāϟāĻŋ āύāĻŋāϰ⧀āĻ•ā§āώāĻŖ āĻ•āϰ⧇⧎
  • āĻ…āϤāĻāĻŦ, āĻāϟāĻŋ āĻŦāĻŋāώāϝāĻŧ āĻŦāĻž āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻ¸ā§āϞāĻŸā§‡ āϤāĻžāϰ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻŦ⧇ āύāĻžāĨ¤
  • āĻāϰ āĻĢāϞ⧇, WAL āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻĄāĻŋāĻ¸ā§āϕ⧇ "āφāϟāϕ⧇" āϝāĻžāĻŦ⧇ āĻāĻŦāĻ‚ āϏāĻŽā§āĻ­āĻŦāϤ āĻĄāĻŋāĻ¸ā§āϕ⧇āϰ āĻ¸ā§āĻĨāĻžāύ āĻĢ⧁āϰāĻŋāϝāĻŧ⧇ āϝāĻžāĻŦ⧇āĨ¤

āĻāĻŦāĻ‚ āĻāĻ–āĻžāύ⧇ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āωāĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āφāϏ⧇āĨ¤ heartbeat.interval.ms и heartbeat.action.query. āĻœā§‹āĻĄāĻŧāĻžāϝāĻŧ āĻœā§‹āĻĄāĻŧāĻžāϝāĻŧ āĻāχ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻšāĻžāĻ°ā§āϟāĻŦāĻŋāϟ āĻŽā§‡āϏ⧇āϜ āĻĒāĻžāĻ āĻžāύ⧋ āĻšāϞ⧇ āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āĻŸā§‡āĻŦāĻŋāϞ⧇ āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āϰāĻž āϏāĻŽā§āĻ­āĻŦ āĻ•āϰ⧇āĨ¤ āĻāχāĻ­āĻžāĻŦ⧇, āϝ⧇ LSNāϟāĻŋāϤ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϟāĻŋ āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāϤ (āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻ¸ā§āϞāĻŸā§‡) āϤāĻž āĻ•ā§āϰāĻŽāĻžāĻ—āϤ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻāϟāĻŋ DBMS āϕ⧇ WAL āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āϏāϰāĻžāϤ⧇ āĻĻ⧇āϝāĻŧ āϝāĻž āφāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχ⧎ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, āĻĻ⧇āϖ⧁āύ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ.

āϘāύāĻŋāĻˇā§āĻ  āĻŽāύ⧋āϝ⧋āĻ— āĻĒā§āϰāĻžāĻĒā§āϝ āφāϰ⧇āĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻšāϝāĻŧ transforms. āϝāĻĻāĻŋāĻ“ āĻāϟāĻŋ āϏ⧁āĻŦāĻŋāϧāĻž āĻāĻŦāĻ‚ āϏ⧌āĻ¨ā§āĻĻāĻ°ā§āϝ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ ...

āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇, Debezium āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āύāĻžāĻŽāĻ•āϰāĻŖ āύ⧀āϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻŋāώāϝāĻŧ āϤ⧈āϰāĻŋ āĻ•āϰ⧇: serverName.schemaName.tableName. āĻāϟāĻŋ āϏāĻŦāϏāĻŽāϝāĻŧ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āύāĻžāĻ“ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻ…āĻĒāĻļāύ transforms āϰ⧇āϗ⧁āϞāĻžāϰ āĻāĻ•ā§āϏāĻĒā§āϰ⧇āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āφāĻĒāύāĻŋ āĻŸā§‡āĻŦāĻŋāϞ⧇āϰ āĻāĻ•āϟāĻŋ āϤāĻžāϞāĻŋāĻ•āĻž āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝāĻžāϰ āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āύāĻžāĻŽā§‡āϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻŋāώāϝāĻŧ⧇ āϰāĻžāωāϟ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻ transforms āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤāϟāĻŋ āϘāĻŸā§‡: āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻž āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĨ⧇āϕ⧇ āϏāĻŽāĻ¸ā§āϤ CDC āχāϭ⧇āĻ¨ā§āϟ āύāĻžāĻŽ āϏāĻš āϟāĻĒāĻŋāϕ⧇ āϝāĻžāĻŦ⧇ data.cdc.dbname. āĻ…āĻ¨ā§āϝāĻĨāĻžāϝāĻŧ (āĻāχ āϏ⧇āϟāĻŋāĻ‚āϏ āĻ›āĻžāĻĄāĻŧāĻž), Debezium āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇ āĻĢāĻ°ā§āĻŽā§‡āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŸā§‡āĻŦāĻŋāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦāĻŋāώāϝāĻŧ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ⧇: pg-dev.public.<table_name>.

āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž

PostgreSQL āĻāϰ āϜāĻ¨ā§āϝ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻžāϰ āĻļ⧇āώ⧇, āĻāϟāĻŋāϰ āĻ•āĻžāĻœā§‡āϰ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ / āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāĻž āĻŽā§‚āĻ˛ā§āϝāĻŦāĻžāύ:

  1. PostgreSQL-āĻāϰ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰāĻŋāϤāĻž āϞāϜāĻŋāĻ•ā§āϝāĻžāϞ āĻĄāĻŋāϕ⧋āĻĄāĻŋāĻ‚āϝāĻŧ⧇āϰ āϧāĻžāϰāĻŖāĻžāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇āĨ¤ āϤāĻžāχ āϏ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āĻ—āĻ āύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰ⧇ āύāĻž (DDL) - āϏ⧇āχ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€, āĻāχ āĻĄā§‡āϟāĻž āĻŦāĻŋāώāϝāĻŧāϗ⧁āϞāĻŋāϤ⧇ āĻĨāĻžāĻ•āĻŦ⧇ āύāĻžāĨ¤
  2. āϝ⧇āĻšā§‡āϤ⧁ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻ¸ā§āϞāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ, āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āϏāĻ‚āϝ⧋āĻ— āϏāĻŽā§āĻ­āĻŦ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻŽāĻžāĻ¸ā§āϟāĻžāϰ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāϏ āωāĻĻāĻžāĻšāϰāϪ⧇āĨ¤
  3. āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϝāĻĻāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĒāĻĄāĻŧāĻžāϰ āĻ…āϧāĻŋāĻ•āĻžāϰ āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āĻĒā§āϰāĻĨāĻŽ āϞāĻžā§āĻšā§‡āϰ āφāϗ⧇, āφāĻĒāύāĻžāϕ⧇ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞāĻŋ āĻāĻ•āϟāĻŋ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻ¸ā§āϞāϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āĻāĻ•āϟāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āϤāĻžāĻšāϞ⧇ āφāϏ⧁āύ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϟāĻŋ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϤ⧇ āϞ⧋āĻĄ āĻ•āϰāĻŋ:

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

āφāĻŽāϰāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻŋ āϝ⧇ āĻĄāĻžāωāύāϞ⧋āĻĄ āϏāĻĢāϞ āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ⧇āϛ⧇:

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

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

āĻĻ⧁āĻ°ā§āĻĻāĻžāĻ¨ā§āϤ: āĻāϟāĻŋ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āϝ⧇āϤ⧇ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ⧎ āĻāĻ–āύ āφāϏ⧁āύ āĻāĻ•āϜāύ āĻ­ā§‹āĻ•ā§āϤāĻž āĻšāĻ“āϝāĻŧāĻžāϰ āĻ­āĻžāύ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻ•āĻžāĻĢāĻ•āĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāĻŋ, āϤāĻžāϰāĻĒāϰ⧇ āφāĻŽāϰāĻž āĻŸā§‡āĻŦāĻŋāϞ⧇ āĻāĻ•āϟāĻŋ āĻāĻ¨ā§āĻŸā§āϰāĻŋ āϝ⧋āĻ— āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻŋ:

$ kafka/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', 'foo@bar.com');
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":"foo@bar.com"
    },
    "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":"foo@bar.com"
    },
    "after":{
      "id":1005,
      "first_name":"egg",
      "last_name":"bar",
      "email":"foo@bar.com"
    },
    "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 āĻŽāĻ™ā§āĻ—ā§‹āĻĄāĻŋāĻŦāĻŋ

āĻāχ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϟāĻŋ DBMS āĻĒā§āϰāĻžāχāĻŽāĻžāϰāĻŋ āύ⧋āĻĄā§‡āϰ āĻ…āĻĒāϞāĻ— āĻĨ⧇āϕ⧇ āϤāĻĨā§āϝ āĻĒāĻĄāĻŧāĻž āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ MongoDB āϰ⧇āĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŽā§‡āĻ•āĻžāύāĻŋāϜāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤

āĻāĻ•āχāĻ­āĻžāĻŦ⧇ 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 āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻ°ā§āĻŽā§€āĻĻ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āϤāĻžāϰāĻĒāϰ, āϝāĻĻāĻŋ āϤāĻžāĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ, āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻ…āĻ¨ā§āϝ āĻ•āĻ°ā§āĻŽā§€āϰ āωāĻĒāϰ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ Kafka āĻŦāĻŋāώāϝāĻŧ⧇āϰ āĻļ⧇āώ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋāĻŦāĻĻā§āϧ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻĨ⧇āϕ⧇ āĻĒāĻĄāĻŧāĻž āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝāĻžāĻŦ⧇āĨ¤
  2. āĻ•āĻžāĻĢāĻ•āĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ. āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϟāĻŋ āĻ•āĻžāĻĢāĻ•āĻžāϕ⧇ āĻĒāĻžāĻ āĻžāϤ⧇ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāĻ“āϝāĻŧāĻž āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ⧇ āĻĒāĻĄāĻŧāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰāĻŦ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻž āϏāĻĢāϞ āύāĻž āĻšāĻ“āϝāĻŧāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻĒāĻ°ā§āϝāĻžāϝāĻŧāĻ•ā§āϰāĻŽā§‡ āĻāϟāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒāĻžāĻ āĻžāύ⧋āϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŦ⧇āĨ¤
  3. āĻĄā§‡āϟāĻž āĻ‰ā§ŽāϏ āĻ…āύ⧁āĻĒāϞāĻŦā§āϧ. āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ āĻ‰ā§ŽāϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŦ⧇āĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻšāϞ 16āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻž āϏ⧂āϚāϕ⧀āϝāĻŧ āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ. 16 āϤāĻŽ āĻŦā§āϝāĻ°ā§āĻĨ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻžāϰ āĻĒāϰ⧇, āϟāĻžāĻ¸ā§āĻ•āϟāĻŋ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰāĻž āĻšāĻŦ⧇⧎ āĻŦā§āϝāĻ°ā§āĻĨ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ REST āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞāĻŋ āϰāĻŋāĻ¸ā§āϟāĻžāĻ°ā§āϟ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤
    • āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰāĻŋ āĻĄā§‡āϟāĻž āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϝāĻžāĻŦ⧇ āύāĻž, āĻ•āĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻ¸ā§āϞāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻĻā§āĻŦāĻžāϰāĻž āĻĒāĻĄāĻŧāĻž āĻšāϝāĻŧāύāĻŋ āĻāĻŽāύ WAL āĻĢāĻžāχāϞ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻ•āϰāĻŦ⧇āĨ¤ āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻāĻ•āϟāĻŋ āύ⧇āϤāĻŋāĻŦāĻžāϚāĻ• āĻĻāĻŋāĻ• āϰāϝāĻŧ⧇āϛ⧇: āϝāĻĻāĻŋ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻāĻŦāĻ‚ DBMS-āĻāϰ āĻŽāĻ§ā§āϝ⧇ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϏāĻ‚āϝ⧋āĻ— āĻĻā§€āĻ°ā§āϘ āϏāĻŽāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻžāĻšāϤ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āĻĄāĻŋāĻ¸ā§āϕ⧇āϰ āĻ¸ā§āĻĨāĻžāύ āĻĢ⧁āϰāĻŋāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻžāϰ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āϰāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ DBMS-āĻāϰ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻĻāĻŋāϕ⧇ āύāĻŋāϝāĻŧ⧇ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤
    • āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŽāĻžāχāĻāϏāĻ•āĻŋāωāĻāϞ āϏāĻ‚āϝ⧋āĻ— āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻžāϰ āφāϗ⧇ binlog āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ DBMS āύāĻŋāĻœā§‡āχ āĻ˜ā§‹āϰāĻžāύ⧋ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāϰ āĻĢāϞ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻŦā§āϝāĻ°ā§āĻĨ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āϚāϞ⧇ āϝāĻžāĻŦ⧇ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āĻŦāĻŋāύāϞāĻ— āĻĨ⧇āϕ⧇ āĻĒāĻĄāĻŧāĻž āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝ⧇āϤ⧇ āĻāϟāĻŋāϕ⧇ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻ¸ā§āĻ¨ā§āϝāĻžāĻĒāĻļāϟ āĻŽā§‹āĻĄā§‡ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤
    • āωāĻĒāϰ MongoDB. āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ⧇ āĻŦāϞāĻž āĻšāϝāĻŧ⧇āϛ⧇: āϞāĻ—/āĻ…āĻĒāϞāĻ— āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āφāϚāϰāĻŖ āĻāĻŦāĻ‚ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āϝ⧇ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻĨ⧇āϕ⧇ āĻĒāĻĄāĻŧāĻž āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž āϤāĻž āϏāĻŦ DBMS-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āχāĨ¤ āĻāϟāĻž āϏāĻ¤ā§āϝ āϝ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āϰāĻžāĻˇā§āĻŸā§āϰ āϝ⧇āϤ⧇ āĻšāĻŦ⧇ āĻŦā§āϝāĻ°ā§āĻĨ āĻāĻŦāĻ‚ āĻŽā§‹āĻĄā§‡ āĻāĻ•āϟāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻ¸ā§āĻ¨ā§āϝāĻžāĻĒāĻļāϟ.

      āϝāĻžāχāĻšā§‹āĻ•, āĻŦā§āϝāϤāĻŋāĻ•ā§āϰāĻŽ āφāϛ⧇. āϝāĻĻāĻŋ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϟāĻŋ āĻĻā§€āĻ°ā§āϘ āϏāĻŽāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻ‚āϝ⧋āĻ— āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇ (āĻŦāĻž āĻŽāĻ™ā§āĻ—ā§‹āĻĄāĻŋāĻŦāĻŋ āωāĻĻāĻžāĻšāϰāϪ⧇ āĻĒ⧌āρāĻ›āĻžāϤ⧇ āĻĒāĻžāϰ⧇āύāĻŋ), āĻāĻŦāĻ‚ āĻāχ āϏāĻŽāϝāĻŧ⧇ āĻ…āĻĒāϞāĻ—āϟāĻŋ āĻ˜ā§‹āϰāĻžāύ⧋ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āϤāĻ–āύ āϏāĻ‚āϝ⧋āĻ—āϟāĻŋ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻž āĻšāϞ⧇, āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻļāĻžāĻ¨ā§āϤāĻ­āĻžāĻŦ⧇ āĻĒā§āϰāĻĨāĻŽ āωāĻĒāϞāĻŦā§āϧ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧāϤ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤ , āϝ⧇ āĻ•āĻžāϰāϪ⧇ āĻ•āĻžāĻĢāĻ•āĻžāϰ āĻ•āĻŋāϛ⧁ āϤāĻĨā§āϝ āύāĻž āφāϘāĻžāϤ āĻ•āϰāĻŦ⧇

āωāĻĒāϏāĻ‚āĻšāĻžāϰ

Debezium āĻšāϞ CDC āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϏāĻžāĻĨ⧇ āφāĻŽāĻžāϰ āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āĻāĻŦāĻ‚ āϏāĻžāĻŽāĻ—ā§āϰāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϖ⧁āĻŦāχ āχāϤāĻŋāĻŦāĻžāϚāĻ•āĨ¤ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋ āĻĒā§āϰāϧāĻžāύ DBMS-āĻāϰ āϏāĻŽāĻ°ā§āĻĨāύ, āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āϏāĻšāϜāϤāĻž, āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻŽāĻ°ā§āĻĨāύ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āϏāĻŽā§āĻĒā§āϰāĻĻāĻžāϝāĻŧāϕ⧇ āϘ⧁āώ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇āĨ¤ āĻ…āύ⧁āĻļā§€āϞāύ⧇ āφāĻ—ā§āϰāĻšā§€āĻĻ⧇āϰ āϜāĻ¨ā§āϝ, āφāĻŽāĻŋ āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰāĻ›āĻŋ āϝ⧇ āφāĻĒāύāĻŋ āĻ—āĻžāχāĻĄāϗ⧁āϞāĻŋ āĻĒāĻĄāĻŧ⧁āύ āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ и āĻĄā§‡āĻŦ⧇āϜāĻŋāϝāĻŧāĻžāĻŽ.

āĻ•āĻžāĻĢāĻ•āĻž āϏāĻ‚āϝ⧋āϗ⧇āϰ āϜāĻ¨ā§āϝ JDBC āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āϤ⧁āϞāύāĻžāϝāĻŧ, Debezium-āĻāϰ āĻĒā§āϰāϧāĻžāύ āϏ⧁āĻŦāĻŋāϧāĻž āĻšāϞ āϝ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞāĻŋ DBMS āϞāĻ—āϗ⧁āϞāĻŋ āĻĨ⧇āϕ⧇ āĻĒāĻĄāĻŧāĻž āĻšāϝāĻŧ, āϝāĻž āĻ¨ā§āϝ⧂āύāϤāĻŽ āĻŦāĻŋāϞāĻŽā§āĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āĻĄā§‡āϟāĻž āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧāĨ¤ JDBC āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ (āĻ•āĻžāĻĢāĻ•āĻž āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻĻā§āĻŦāĻžāϰāĻž āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰāĻž) āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦā§āϝāĻŦāϧāĻžāύ⧇ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻž āĻŸā§‡āĻŦāĻŋāϞāϟāĻŋ āϜāĻŋāĻœā§āĻžāĻžāϏāĻž āĻ•āϰ⧇ āĻāĻŦāĻ‚ (āĻāĻ•āχ āĻ•āĻžāϰāϪ⧇) āĻĄā§‡āϟāĻž āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āϏāĻŽāϝāĻŧ āĻŦāĻžāĻ°ā§āϤāĻž āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āύāĻž (āϝ⧇āϟāĻŋ āύ⧇āχ āĻāĻŽāύ āĻĄā§‡āϟāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ?)āĨ¤

āĻ…āύ⧁āϰ⧂āĻĒ āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ, āφāĻĒāύāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āϏāĻŽāĻžāϧāĻžāύāϗ⧁āϞāĻŋāϤ⧇ āĻŽāύ⧋āϝ⧋āĻ— āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύ (āĻĄā§‡āĻŦ⧇āϜāĻŋāϝāĻŧāĻžāĻŽ āĻ›āĻžāĻĄāĻŧāĻžāĻ“):

āĻĻā§āϰāĻˇā§āϟāĻŦā§āϝ

āφāĻŽāĻžāĻĻ⧇āϰ āĻŦā§āϞāϗ⧇āĻ“ āĻĒāĻĄāĻŧ⧁āύ:

āωāĻ¤ā§āϏ: www.habr.com