рдорд╛рдЭреНрдпрд╛ рдХрд╛рдорд╛рдд, рдорд▓рд╛ рдЕрдиреЗрдХрджрд╛ рдирд╡реАрди рддрд╛рдВрддреНрд░рд┐рдХ рдЙрдкрд╛рдп/рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдЙрддреНрдкрд╛рджрдиреЗ рдЖрдврд│рддрд╛рдд, рдЬреНрдпрд╛рдЪреА рдорд╛рд╣рд┐рддреА рд░рд╢рд┐рдпрди-рднрд╛рд╖реЗрдЪреНрдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рдлрд╛рд░рдЪ рдХрдореА рдЖрд╣реЗ. рдпрд╛ рд▓реЗрдЦрд╛рджреНрд╡рд╛рд░реЗ, рдореА рдорд╛рдЭреНрдпрд╛ рдЕрд▓реАрдХрдбреАрд▓ рд╕рд░рд╛рд╡рд╛рддреАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╣ рдЕрд╢реА рдПрдХ рдкреЛрдХрд│реА рднрд░реВрди рдХрд╛рдврдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрди, рдЬреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рджреЛрди рд▓реЛрдХрдкреНрд░рд┐рдп DBMSs (PostgreSQL рдЖрдгрд┐ MongoDB) рдордзреВрди Debezium рд╡рд╛рдкрд░реВрди рдХрд╛рдлреНрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░рд╡рд░ CDC рдЗрд╡реНрд╣реЗрдВрдЯ рдкрд╛рдард╡рдгреЗ рд╕реЗрдЯ рдХрд░рд╛рдпрдЪреЗ рд╣реЛрддреЗ. рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣рд╛ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рд▓реЗрдЦ, рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХрд╛рдорд╛рдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореА рджрд┐рд╕рд▓рд╛, рдЗрддрд░рд╛рдВрд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдард░реЗрд▓.
рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рдбреЗрдмреЗрдЭрд┐рдпрдо рдЖрдгрд┐ рд╕реАрдбреАрд╕реА рдореНрд╣рдгрдЬреЗ рдХрд╛рдп?
рдпрд╛
рдЬрд░ рдЖрдкрдг CDC рдЪреА рддреБрд▓рдирд╛ рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рд╢реА рдХреЗрд▓реА (рдЬреЗрд╡реНрд╣рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдереЗрдЯ DBMS рд╡рд░реВрди рдбреЗрдЯрд╛ рд╡рд╛рдЪрддреЛ), рддрд░ рддреНрдпрд╛рдЪреНрдпрд╛ рдореБрдЦреНрдп рдлрд╛рдпрджреНрдпрд╛рдВрдордзреНрдпреЗ рдХрдореА рд╡рд┐рд▓рдВрдмрддрд╛, рдЙрдЪреНрдЪ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣рддрд╛ рдЖрдгрд┐ рдЙрдкрд▓рдмреНрдзрддреЗрд╕рд╣ рдкрдВрдХреНрддреА рд╕реНрддрд░рд╛рд╡рд░ рдбреЗрдЯрд╛ рдмрджрд▓ рдкреНрд░рд╡рд╛рд╣рд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ. рд╕реАрдбреАрд╕реА рдЗрд╡реНрд╣реЗрдВрдЯреНрд╕рд╕рд╛рдареА рднрд╛рдВрдбрд╛рд░ рдореНрд╣рдгреВрди рдХрд╛рдлреНрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░ рд╡рд╛рдкрд░реВрди рд╢реЗрд╡рдЯрдЪреЗ рджреЛрди рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.
рдЖрдгрдЦреА рдПрдХ рдлрд╛рдпрджрд╛ рд╣рд╛ рдЖрд╣реЗ рдХреА рдПрдХрдЪ рдореЙрдбреЗрд▓ рдЗрд╡реНрд╣реЗрдВрдЯреНрд╕ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ, рддреНрдпрд╛рдореБрд│реЗ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдбреАрдмреАрдПрдордПрд╕ рдСрдкрд░реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдмрд╛рд░рдХрд╛рд╡реЗрдмрджреНрджрд▓ рдХрд╛рд│рдЬреА рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.
рд╢реЗрд╡рдЯреА, рдореЗрд╕реЗрдЬ рдмреНрд░реЛрдХрд░ рд╡рд╛рдкрд░реВрди рдбреЗрдЯрд╛рдордзреАрд▓ рдмрджрд▓рд╛рдВрдЪреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдгрд╛рд░реНтАНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рдирд╛ рдХреНрд╖реИрддрд┐рдЬрд░рд┐рддреНрдпрд╛ рд╕реНрдХреЗрд▓ рдЖрдЙрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЕрдиреБрдорддреА рдорд┐рд│рддреЗ. рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рдбреЗрдЯрд╛ рд╕реНрддреНрд░реЛрддрд╛рд╡рд░реАрд▓ рдкреНрд░рднрд╛рд╡ рдХрдореА рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдХрд╛рд░рдг рдбреЗрдЯрд╛ рдереЗрдЯ DBMS рдХрдбреВрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХрд╛рдлреНрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░рдХрдбреВрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЛ.
рдбреЗрдмреЗрдЭрд┐рдпрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрджреНрджрд▓
рдбреЗрдмреЗрдЭрд┐рдпрдо рд╡рд╛рдкрд░рдгреЗ рдпрд╛ рд╕реЛрдкреНрдпрд╛ рдпреЛрдЬрдиреЗрдд рдпреЗрддреЗ:
DBMS (рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдореНрд╣рдгреВрди) тЖТ рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ тЖТ рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ тЖТ рдЧреНрд░рд╛рд╣рдХ рдордзреАрд▓ рдХрдиреЗрдХреНрдЯрд░
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди, рдпреЗрдереЗ рдкреНрд░рдХрд▓реНрдк рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░реАрд▓ рдПрдХ рдЖрдХреГрддреА рдЖрд╣реЗ:
рддрдерд╛рдкрд┐, рдорд▓рд╛ рд╣реА рдпреЛрдЬрдирд╛ рдЦрд░реЛрдЦрд░ рдЖрд╡рдбрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рдХреЗрд╡рд│ рд╕рд┐рдВрдХ рдХрдиреЗрдХреНрдЯрд░рдЪрд╛ рд╡рд╛рдкрд░ рд╢рдХреНрдп рдЖрд╣реЗ.
рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд, рдкрд░рд┐рд╕реНрдерд┐рддреА рд╡реЗрдЧрд│реА рдЖрд╣реЗ: рддреБрдордЪрд╛ рдбреЗрдЯрд╛ рддрд▓рд╛рд╡ рднрд░рдгреЗ (рд╡рд░реАрд▓ рдЪрд┐рддреНрд░рд╛рддреАрд▓ рд╢реЗрд╡рдЯрдЪреА рд▓рд┐рдВрдХ) рдбреЗрдмреЗрдЭрд┐рдпрдо рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рд╣рд╛ рдПрдХрдореЗрд╡ рдорд╛рд░реНрдЧ рдирд╛рд╣реА. Apache Kafka рд▓рд╛ рдкрд╛рдард╡рд▓реЗрд▓реЗ рдЗрд╡реНрд╣реЗрдВрдЯ рддреБрдордЪреНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рджреНрд╡рд╛рд░реЗ рд╡рд┐рд╡рд┐рдз рдкрд░рд┐рд╕реНрдерд┐рддреА рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде:
- рдХреЕрд╢реЗрдордзреВрди рдЕрд╕рдВрдмрджреНрдз рдбреЗрдЯрд╛ рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ;
- рд╕реВрдЪрдирд╛ рдкрд╛рдард╡рдгреЗ;
- рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрджреНрдпрддрдиреЗ рд╢реЛрдзрд╛;
- рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪреЗ рдСрдбрд┐рдЯ рд▓реЙрдЧ;
- ...
рдЬрд░ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЬрд╛рд╡рд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрд╕реЗрд▓ рдЖрдгрд┐ рдХрд╛рдлреНрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ/рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рдирд╕реЗрд▓, рддрд░ рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреА рджреЗрдЦреАрд▓ рд╢рдХреНрдпрддрд╛ рдЖрд╣реЗ
рд╣рд╛ рд▓реЗрдЦ рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдиреА рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдЪреА рдЪрд░реНрдЪрд╛ рдХрд░реЗрд▓, рдЬреЗ рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдЖрдгрд┐ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ.
рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди
рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рддреАрд▓ рдмрджрд▓рд╛рдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА - рдбреЗрдЯрд╛ - рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:
- рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд, рдЬреЛ рдЖрд╡реГрддреНрддреА 5.7, PostgreSQL 9.6+, MongoDB 3.2+ рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдгрд╛рд░рд╛ MySQL рдЕрд╕реВ рд╢рдХрддреЛ (
рд╕рдВрдкреВрд░реНрдг рдпрд╛рджреА ); - рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░;
- рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ рдЙрджрд╛рд╣рд░рдг (рдЖрд╡реГрддреНрддреНрдпрд╛ 1.x, 2.x);
- рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реЗ рдбреЗрдмреЗрдЭрд┐рдпрдо рдХрдиреЗрдХреНрдЯрд░.
рдкрд╣рд┐рд▓реНрдпрд╛ рджреЛрди рдореБрджреНрдпрд╛рдВрд╡рд░ рдХрд╛рдо рдХрд░рд╛, рдореНрд╣рдгрдЬреЗ. DBMS рдЖрдгрд┐ Apache Kafka рдЪреА рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╡реНрдпрд╛рдкреНрддреАрдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рдЬреНрдпрд╛рдВрдирд╛ рд╕рдБрдбрдмреЙрдХреНрд╕рдордзреНрдпреЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ, рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╕рд╣ рдЕрдзрд┐рдХреГрдд рднрд╛рдВрдбрд╛рд░ рддрдпрд╛рд░ рдЖрд╣реЗ
рдЖрдореНрд╣реА рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рджреЛрди рдореБрджреНрджреНрдпрд╛рдВрд╡рд░ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд░рд╛рд╣реВ.
0. рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ
рдпреЗрдереЗ рдЖрдгрд┐ рдирдВрддрд░ рд▓реЗрдЦрд╛рдд, рд╕рд░реНрд╡ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдгреЗ рдбреЗрдмреЗрдЭрд┐рдпрдо рдбреЗрд╡реНрд╣рд▓рдкрд░реНрд╕рджреНрд╡рд╛рд░реЗ рд╡рд┐рддрд░рд┐рдд рдбреЙрдХрд░ рдкреНрд░рддрд┐рдореЗрдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд▓реА рдЬрд╛рддрд╛рдд. рдпрд╛рдордзреНрдпреЗ рд╕рд░реНрд╡ рдЖрд╡рд╢реНрдпрдХ рдкреНрд▓рдЧрдЗрди рдлрд╛рдЗрд▓реНрд╕ (рдХрдиреЗрдХреНрдЯрд░) рдЖрд╣реЗрдд рдЖрдгрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╡рд╛рдкрд░реВрди рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ.
рдЬрд░ рддреБрдореНтАНрд╣рд╛рд▓рд╛ Confluent рд╡рд░реВрди Kafka Connect рд╡рд╛рдкрд░рдгреНтАНрдпрд╛рдЪрд╛ рдЗрд░рд╛рджрд╛ рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНтАНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНтАНрдпрдХ рдХрдиреЗрдХреНтАНрдЯрд░реНрд╕рдЪреЗ рдкреНрд▓рдЧрдЗрди рд╕реНтАНрд╡рдд: рдореНтАНрд╣рдгреВрди рдирд┐рд░реНрджреЗрд╢реАрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдЬреЛрдбрд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓. plugin.path
рдХрд┐рдВрд╡рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рджреНрд╡рд╛рд░реЗ рд╕реЗрдЯ рдХрд░рд╛ CLASSPATH
. рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ рд╡рд░реНрдХрд░ рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯрд░реНрд╕рд╕рд╛рдареА рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕рджреНрд╡рд╛рд░реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЬреНрдпрд╛ рд╡рд░реНрдХрд░ рд▓реЙрдиреНрдЪ рдХрдорд╛рдВрдбрд▓рд╛ рд╡рд┐рддрд░реНрдХ рдореНрд╣рдгреВрди рдкрд╛рд╕ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд. рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╛рдВрд╕рд╛рдареА, рдкрд╣рд╛
рдХрдиреЗрдХреНрдЯрд░ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдбреЗрдмреАрдЭрдо рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЛрди рдЯрдкреНрдкреНрдпрд╛рдВрдд рдХреЗрд▓реА рдЬрд╛рддреЗ. рдЪрд▓рд╛ рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдХрдбреЗ рдкрд╛рд╣реВрдпрд╛:
1. рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗрдЯ рдХрд░рдгреЗ
рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХрдордзреНрдпреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд, рдЬрд╕реЗ рдХреА:
- рдХреНрд▓рд╕реНрдЯрд░рд▓рд╛ рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕,
- рд╡рд┐рд╖рдпрд╛рдВрдЪреА рдирд╛рд╡реЗ рдЬреНрдпрд╛рдд рдХрдиреЗрдХреНрдЯрд░рдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реНрд╡рддрдГрдЪ рдереЗрдЯ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓,
- рдЧрдЯрд╛рдЪреЗ рдирд╛рд╡ рдЬреНрдпрд╛рдордзреНрдпреЗ рдХрдиреЗрдХреНрдЯрд░ рдЪрд╛рд▓реВ рдЖрд╣реЗ (рдЬрд░ рд╡рд┐рддрд░рд┐рдд рдореЛрдб рд╡рд╛рдкрд░рд▓рд╛ рдЕрд╕реЗрд▓).
рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рдЕрдзрд┐рдХреГрдд рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╡рд╛рдкрд░реВрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд▓рд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ - рд╣реЗ рдЖрдореНрд╣реА рд╡рд╛рдкрд░рдгрд╛рд░ рдЖрд╣реЛрдд. рддрд░, рдкреНрд░рддрд┐рдорд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛:
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
Avro рдмрджреНрджрд▓ рдЯреАрдк
рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░, рдбреЗрдмреЗрдЭрд┐рдпрдо 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. рдХрдиреЗрдХреНрдЯрд░ рд╕реНрд╡рддрдГ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ
рдЖрддрд╛ рдЖрдкрдг рдереЗрдЯ рдХрдиреЗрдХреНрдЯрд░рдЪреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╡рд░ рдЬрд╛рдК рд╢рдХрддрд╛, рдЬреЗ рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди рдбреЗрдЯрд╛ рд╡рд╛рдЪреЗрд▓.
рджреЛрди DBMS рд╕рд╛рдареА рдХрдиреЗрдХреНрдЯрд░рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ: PostgreSQL рдЖрдгрд┐ MongoDB, рдЬреНрдпрд╛рдордзреНрдпреЗ рдорд▓рд╛ рдЕрдиреБрднрд╡ рдЖрд╣реЗ рдЖрдгрд┐ рдЬреНрдпрд╛рдд рдлрд░рдХ рдЖрд╣реЗрдд (рд▓рд╣рд╛рди рдЕрд╕рд▓реЗ рддрд░реА, рдкрд░рдВрддреБ рдХрд╛рд╣реА рдмрд╛рдмрддреАрдд рд▓рдХреНрд╖рдгреАрдп!).
рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рд╡рд░реНрдгрди JSON рдиреЛрдЯреЗрд╢рдирдордзреНрдпреЗ рдХреЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ POST рд╡рд┐рдирдВрддреА рд╡рд╛рдкрд░реВрди Kafka Connect рд╡рд░ рдЕрдкрд▓реЛрдб рдХреЗрд▓реЗ рдЖрд╣реЗ.
реи.рез. 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"
}
}
рдпрд╛ рд╕реЗрдЯрдЕрдкрдирдВрддрд░ рдХрдиреЗрдХреНрдЯрд░рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ:
- рдкрд╣рд┐рд▓реНрдпрд╛ рдкреНрд░рд╛рд░рдВрднреА, рддреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕рд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рдЖрдгрд┐ рдореЛрдбрдордзреНрдпреЗ рд╕реБрд░реВ рд╣реЛрддреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдиреЕрдкрд╢реЙрдЯ, рдХрдВрдбрд┐рд╢рдирд▓ рд╡рд╛рдкрд░реВрди рдорд┐рд│рд╡рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдЪрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрдЪ рдХрд╛рдлреНрдХрд╛рд▓рд╛ рдкрд╛рдард╡рдд рдЖрд╣реЗ
SELECT * FROM table_name
. - рдЖрд░рдВрднрд┐рдХрд░рдг рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░, PostgreSQL WAL рдлрд╛рдЗрд▓реНрд╕рдордзреАрд▓ рдмрджрд▓ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдХрдиреЗрдХреНрдЯрд░ рдореЛрдбрдордзреНрдпреЗ рдЬрд╛рддреЛ.
рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рдВрдмрджреНрджрд▓:
-
name
тАФ рдХрдиреЗрдХреНрдЯрд░рдЪреЗ рдирд╛рд╡ рдЬреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реА рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд╛рдкрд░рд▓реЗ рдЖрд╣реЗ; рднрд╡рд┐рд╖реНрдпрд╛рдд, рд╣реЗ рдирд╛рд╡ рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ REST API рджреНрд╡рд╛рд░реЗ рдХрдиреЗрдХреНрдЯрд░рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА (рдореНрд╣рдгрдЬреЗ рд╕реНрдерд┐рддреА рдкрд╣рд╛ / рд░реАрд╕реНрдЯрд╛рд░реНрдЯ / рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА) рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдИрд▓; -
connector.class
тАФ рдбреАрдмреАрдПрдордПрд╕ рдХрдиреЗрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕ рдЬреЛ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХрдиреЗрдХреНрдЯрд░рджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдИрд▓; -
plugin.name
тАФ WAL рдлрд╛рдЗрд▓реНрд╕рдордзреАрд▓ рдбреЗрдЯрд╛рдЪреНрдпрд╛ рддрд╛рд░реНрдХрд┐рдХ рдбреАрдХреЛрдбрд┐рдВрдЧрд╕рд╛рдареА рдкреНрд▓рдЧрдЗрдирдЪреЗ рдирд╛рд╡. рдирд┐рд╡рдбрдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдзwal2json
,decoderbuffs
╨╕pgoutput
. рдкрд╣рд┐рд▓реНрдпрд╛ рджреЛрди DBMS рдордзреНрдпреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╕реНрддрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЖрдгрд┐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 рд╕рд╛рдареА рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рд╡рд░реНрдгрди рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рдЦрд╛рд▓реАрд▓ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдмрджреНрджрд▓/рдорд░реНрдпрд╛рджрд╛рдВрдмрджреНрджрд▓ рдмреЛрд▓рдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ:
- PostgreSQL рд╕рд╛рдареА рдХрдиреЗрдХреНрдЯрд░рдЪреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓реЙрдЬрд┐рдХрд▓ рдбреАрдХреЛрдбрд┐рдВрдЧрдЪреНрдпрд╛ рд╕рдВрдХрд▓реНрдкрдиреЗрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ. рддреНрдпрд╛рдореБрд│реЗ рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдмрджрд▓рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдд рдирд╛рд╣реА (DDL) - рддреНрдпрд╛рдиреБрд╕рд╛рд░, рд╣рд╛ рдбреЗрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрдордзреНрдпреЗ рдирд╕реЗрд▓.
- рдкреНрд░рддрд┐рдХреГрддреА рд╕реНрд▓реЙрдЯ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдХрдиреЗрдХреНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ рдлрдХреНрдд рдЕрдЧреНрд░рдЧрдгреНрдп DBMS рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА.
- рдЬреНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рдХрдиреЗрдХреНрдЯрд░ рдбреЗрдЯрд╛рдмреЗрд╕рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддреЛ рддреНрдпрд╛рд▓рд╛ рдХреЗрд╡рд│-рд╡рд╛рдЪрдгреНрдпрд╛рдЪреЗ рдЕрдзрд┐рдХрд╛рд░ рдЕрд╕рд▓реНрдпрд╛рд╕, рдкреНрд░рдердо рд▓реЙрдиреНрдЪ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рдкреНрд░рддрд┐рдХреГрддреА рд╕реНрд▓реЙрдЯ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕рд╡рд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдд рдЖрд╣реЗ
рддрд░, рдЖрдордЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХрдиреЗрдХреНрдЯрд░рдордзреНрдпреЗ рд▓реЛрдб рдХрд░реВрдпрд╛:
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', '[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
}
}
рджреЛрдиреНрд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рд░реЗрдХреЙрд░реНрдбрдордзреНрдпреЗ рдмрджрд▓рд▓реЗрд▓реНрдпрд╛ рд░реЗрдХреЙрд░реНрдбрдЪреА рдХреА (рдкреАрдХреЗ) рдЖрдгрд┐ рдмрджрд▓рд╛рдВрдЪреЗ рд╕рд╛рд░ рдЕрд╕рддреЗ: рд░реЗрдХреЙрд░реНрдб рдЖрдзреА рдХрд╛рдп рд╣реЛрддреЗ рдЖрдгрд┐ рдирдВрддрд░ рдХрд╛рдп рдЭрд╛рд▓реЗ.
- рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд
INSERT
: рдЖрдзреА рдореВрд▓реНрдп (before
) рдмрд░реЛрдмрд░реАnull
, рдЖрдгрд┐ рдирдВрддрд░ - рдШрд╛рддрд▓реЗрд▓реА рдУрд│. - рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд
UPDATE
: рдпреЗрдереЗpayload.before
рдУрд│реАрдЪреА рдорд╛рдЧреАрд▓ рд╕реНрдерд┐рддреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рдордзреНрдпреЗpayload.after
тАФ рдмрджрд▓рд╛рдВрдЪреНрдпрд╛ рд╕рд╛рд░рд╛рд╕рд╣ рдирд╡реАрди.
2.2 MongoDB
рд╣рд╛ рдХрдиреЗрдХреНрдЯрд░ рдорд╛рдирдХ рдореЛрдВрдЧреЛрдбреАрдмреА рдкреНрд░рддрд┐рдХреГрддреА рдпрдВрддреНрд░рдгрд╛ рд╡рд╛рдкрд░рддреЛ, рдкреНрд░рд╛рдердорд┐рдХ DBMS рдиреЛрдбрдЪреНрдпрд╛ 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>
.
рдЪреБрдХреАрдЪреА рд╕рд╣рдирд╢реАрд▓рддрд╛
рдЖрдордЪреНрдпрд╛ рдХрд╛рд│рд╛рддреАрд▓ рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдЖрдгрд┐ рдЙрдЪреНрдЪ рдЙрдкрд▓рдмреНрдзрддрд╛ рд╣реА рд╕рдорд╕реНрдпрд╛ рдиреЗрд╣рдореАрдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рддреАрд╡реНрд░ рдЖрд╣реЗ - рд╡рд┐рд╢реЗрд╖рдд: рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдбреЗрдЯрд╛ рдЖрдгрд┐ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрдмрджреНрджрд▓ рдмреЛрд▓рддреЛ рдЖрдгрд┐ рдбреЗрдЯрд╛ рдмрджрд▓ рдЯреНрд░реЕрдХрд┐рдВрдЧ рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдмрд╛рдЬреВрд▓рд╛ рдирд╛рд╣реА. рддрддреНрддреНрд╡рддрдГ рдХрд╛рдп рдЪреВрдХ рд╣реЛрдК рд╢рдХрддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдмрддреАрдд рдбреЗрдмреЗрдЭрд┐рдпрдордЪреЗ рдХрд╛рдп рд╣реЛрдИрд▓ рддреЗ рдкрд╛рд╣реВрдпрд╛.
рддреАрди рдирд┐рд╡рдб рд░рджреНрдж рдХрд░рдгреНрдпрд╛рдЪреЗ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд:
- рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ рдЕрдпрд╢рд╕реНрд╡реА. Connect рд╡рд┐рддрд░рд┐рдд рдореЛрдбрдордзреНрдпреЗ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдпрд╛рд╕рд╛рдареА рдПрдХрд╛рдзрд┐рдХ рдХрд╛рдордЧрд╛рд░рд╛рдВрдирд╛ рд╕рдорд╛рди group.id рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреНрдпрд╛рдирдВрддрд░, рддреНрдпрд╛рдкреИрдХреА рдПрдХ рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕, рдХрдиреЗрдХреНрдЯрд░ рджреБрд╕рд░реНрдпрд╛ рдХрд╛рд░реНрдпрдХрд░реНрддреНрдпрд╛рд╡рд░ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдХрд╛рдлреНрдХрд╛рдордзреАрд▓ рд╡рд┐рд╖рдпрд╛рддреАрд▓ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рд╡рдЪрдирдмрджреНрдз рд╕реНрдерд┐рддреАрдкрд╛рд╕реВрди рд╡рд╛рдЪрди рд╕реБрд░реВ рдареЗрд╡реЗрд▓.
- рдХрд╛рдлреНрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░рд╢реА рд╕рдВрдкрд░реНрдХ рддреБрдЯрд▓рд╛. рдХрдиреЗрдХреНрдЯрд░ рдлрдХреНрдд рдХрд╛рдлреНрдХрд╛рд▓рд╛ рдкрд╛рдард╡рдгреНрдпрд╛рдд рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рд╕реНрдерд┐рддреАрд╡рд░ рд╡рд╛рдЪрди рдерд╛рдВрдмрд╡реЗрд▓ рдЖрдгрд┐ рдкреНрд░рдпрддреНрди рдпрд╢рд╕реНрд╡реА рд╣реЛрдИрдкрд░реНрдпрдВрдд рд╡реЗрд│реЛрд╡реЗрд│реА рддреЗ рдкреБрдиреНрд╣рд╛ рдкрд╛рдард╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрд▓.
- рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдЕрдиреБрдкрд▓рдмреНрдзрддрд╛. рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ рд╕реНрддреНрд░реЛрддрд╛рд╢реА рдкреБрдиреНрд╣рд╛ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрд▓. рдбреАрдлреЙрд▓реНрдЯ рд╡рд╛рдкрд░реВрди 16 рдкреНрд░рдпрддреНрди рдЖрд╣реЗ
рдШрд╛рддрд╛рдВрдХреАрдп рдмреЕрдХрдСрдл . 16 рд╡реНрдпрд╛ рдЕрдпрд╢рд╕реНрд╡реА рдкреНрд░рдпрддреНрдирд╛рдирдВрддрд░, рдХрд╛рд░реНрдп рдореНрд╣рдгреВрди рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдЕрдпрд╢рд╕реНрд╡реА рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ REST рдЗрдВрдЯрд░рдлреЗрд╕рджреНрд╡рд╛рд░реЗ рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓.- рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдкреЛрд╕реНрдЯрдЧреНрд░реЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛ рдЧрдорд╛рд╡рд▓рд╛ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА, рдХрд╛рд░рдг рдкреНрд░рддрд┐рдХреГрддреА рд╕реНрд▓реЙрдЯ рд╡рд╛рдкрд░рд▓реНрдпрд╛рдиреЗ рдХрдиреЗрдХреНрдЯрд░рджреНрд╡рд╛рд░реЗ рди рд╡рд╛рдЪрд▓реЗрд▓реНрдпрд╛ WAL рдлрд╛рдЗрд▓реНрд╕ рд╣рдЯрд╡рдгреНрдпрд╛рдкрд╛рд╕реВрди рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╣реЛрдИрд▓. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдирд╛рдгреНрдпрд╛рд▓рд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд╛рдЬреВ рджреЗрдЦреАрд▓ рдЖрд╣реЗ: рдЬрд░ рдХрдиреЗрдХреНрдЯрд░ рдЖрдгрд┐ рдбреАрдмреАрдПрдордПрд╕ рджрд░рдореНрдпрд╛рди рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрдЯрд┐рд╡реНрд╣рд┐рдЯреА рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рд╕рд╛рдареА рд╡реНрдпрддреНрдпрдп рдЖрдгрд▓реА рдЕрд╕реЗрд▓, рддрд░ рдбрд┐рд╕реНрдХрдЪреА рдЬрд╛рдЧрд╛ рд╕рдВрдкрдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдЖрд╣реЗ рдЖрдгрд┐ рдпрд╛рдореБрд│реЗ рдЕрдпрд╢рд╕реНрд╡реА рд╣реЛрдК рд╢рдХрддреЗ. рд╕рдВрдкреВрд░реНрдг DBMS.
- рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд , MySQL рдХрдиреЗрдХреНрдЯрд┐рд╡реНрд╣рд┐рдЯреА рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рд╣реЛрдгреНрдпрд╛рдкреВрд░реНрд╡реА рдмрд┐рдирд▓реЙрдЧ рдлрд╛рдЗрд▓реНрд╕ рдбреАрдмреАрдПрдордПрд╕рджреНрд╡рд╛рд░реЗрдЪ рдлрд┐рд░рд╡рд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдпрд╛рдореБрд│реЗ рдХрдиреЗрдХреНрдЯрд░ рдЕрдпрд╢рд╕реНрд╡реА рд╕реНрдерд┐рддреАрдд рдЬрд╛рдИрд▓ рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдмрд┐рдирд▓реЙрдЧреНрд╕рдордзреВрди рд╡рд╛рдЪрди рд╕реБрд░реВ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдиреЕрдкрд╢реЙрдЯ рдореЛрдбрдордзреНрдпреЗ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
- рд╡рд░ MongoDB. рджрд╕реНрддрдРрд╡рдЬрд╛рдд рдирдореВрдж рдХреЗрд▓реЗ рдЖрд╣реЗ: рд▓реЙрдЧ/рдСрдкрд▓реЙрдЧ рдлрд╛рдЗрд▓реНрд╕ рд╣рдЯрд╡рд┐рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛рд╕ рдХрдиреЗрдХреНрдЯрд░рдЪреЗ рд╡рд░реНрддрди рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯрд░ рдЬреНрдпрд╛ рд╕реНрдерд┐рддреАрддреВрди рд╕реЛрдбрд▓реЗ рдЖрд╣реЗ рддрд┐рдереВрди рд╡рд╛рдЪрдгреЗ рд╕реБрд░реВ рдареЗрд╡реВ рд╢рдХрдд рдирд╛рд╣реА рд╕рд░реНрд╡ DBMS рд╕рд╛рдареА рд╕рд╛рд░рдЦреЗрдЪ рдЖрд╣реЗ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдХрдиреЗрдХреНрдЯрд░ рд░рд╛рдЬреНрдпрд╛рдд рдЬрд╛рдИрд▓ рдЕрдпрд╢рд╕реНрд╡реА рдЖрдгрд┐ рдореЛрдбрдордзреНрдпреЗ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдиреЕрдкрд╢реЙрдЯ.
рддрдерд╛рдкрд┐, рдЕрдкрд╡рд╛рдж рдЖрд╣реЗрдд. рдЬрд░ рдХрдиреЗрдХреНрдЯрд░ рдмрд░рд╛рдЪ рдХрд╛рд│ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдЕрд╡рд╕реНрдереЗрдд рдЕрд╕реЗрд▓ (рдХрд┐рдВрд╡рд╛ рдореЛрдВрдЧреЛрдбреАрдмреА рдЙрджрд╛рд╣рд░рдгрд╛рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪреВ рд╢рдХрд▓рд╛ рдирд╛рд╣реА), рдЖрдгрд┐ рдпрд╛ рд╡реЗрд│реА oplog рдлрд┐рд░рд╡рд▓рд╛ рдЧреЗрд▓рд╛ рдЕрд╕реЗрд▓, рддрд░ рдХрдиреЗрдХреНрд╢рди рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХреЗрд▓реНрдпрд╛рд╡рд░, рдХрдиреЗрдХреНрдЯрд░ рд╢рд╛рдВрддрдкрдгреЗ рдкрд╣рд┐рд▓реНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╕реНрдерд┐рддреАрддреВрди рдбреЗрдЯрд╛ рд╡рд╛рдЪрдгреЗ рд╕реБрд░реВ рдареЗрд╡реЗрд▓. , рдореНрд╣рдгреВрдирдЪ рдХрд╛рдлреНрдХрд╛рдордзреАрд▓ рдХрд╛рд╣реА рдбреЗрдЯрд╛ рдирд╛рд╣реА рдорд╛рд░реЗрд▓.
рдирд┐рд╖реНрдХрд░реНрд╖
рдбреЗрдмреЗрдЭрд┐рдпрдо рд╣рд╛ рд╕реАрдбреАрд╕реА рд╕рд┐рд╕реНрдЯреАрдордЪрд╛ рдорд╛рдЭрд╛ рдкрд╣рд┐рд▓рд╛ рдЕрдиреБрднрд╡ рдЖрд╣реЗ рдЖрдгрд┐ рдПрдХреВрдгрдЪ рдЦреВрдк рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЖрд╣реЗ. рдкреНрд░рдореБрдЦ рдбреАрдмреАрдПрдордПрд╕, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реБрд▓рднрддрд╛, рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рд╕рдорд░реНрдерди рдЖрдгрд┐ рд╕рдХреНрд░рд┐рдп рд╕рдореБрджрд╛рдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рдорд░реНрдердирд╛рд╕рд╣ рдкреНрд░рдХрд▓реНрдк рдЬрд┐рдВрдХрд▓рд╛. рд╕рд░рд╛рд╡ рдордзреНрдпреЗ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛рдВрд╕рд╛рдареА, рдореА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ рдХреА рдЖрдкрдг рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рд╡рд╛рдЪрд╛
Kafka Connect рд╕рд╛рдареА JDBC рдХрдиреЗрдХреНрдЯрд░рдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд, Debezium рдЪрд╛ рдореБрдЦреНрдп рдлрд╛рдпрджрд╛ рд╣рд╛ рдЖрд╣реЗ рдХреА DBMS рд▓реЙрдЧрдордзреВрди рдмрджрд▓ рд╡рд╛рдЪрд▓реЗ рдЬрд╛рддрд╛рдд, рдЬреЗ рдХрдореАрддрдХрдореА рд▓реЗрдЯрдиреНрд╕реАрд╕рд╣ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддрд╛рдд. JDBC рдХрдиреЗрдХреНрдЯрд░ (рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ рдХрдбреВрди) рдПрдХрд╛ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рдиреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЯреЗрдмрд▓рдЪреА рдЪреМрдХрд╢реА рдХрд░рддреЛ рдЖрдгрд┐ (рддреНрдпрд╛рдЪ рдХрд╛рд░рдгрд╛рд╕рд╛рдареА) рдЬреЗрд╡реНрд╣рд╛ рдбреЗрдЯрд╛ рд╣рдЯрд╡рд▓рд╛ рдЬрд╛рддреЛ рддреЗрд╡реНрд╣рд╛ рд╕рдВрджреЗрд╢ рддрдпрд╛рд░ рдХрд░рдд рдирд╛рд╣реА (рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдЪреА рддреБрдореНрд╣реА рдЪреМрдХрд╢реА рдХрд╢реА рдХрд░реВ рд╢рдХрддрд╛?).
рддрддреНрд╕рдо рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрдг рдЦрд╛рд▓реАрд▓ рдЙрдкрд╛рдпрд╛рдВрдХрдбреЗ рд▓рдХреНрд╖ рджреЗрдК рд╢рдХрддрд╛ (рдбреЗрдмреЗрдЭрд┐рдпрдо рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд):
-
рдЬреЗрдбреАрдмреАрд╕реА рдХрдиреЗрдХреНрдЯрд░ рдХрд╛рдлреНрдХрд╛ рдХрдиреЗрдХреНрдЯ; - рдлрдХреНрдд MySQL рд╕рд╛рдареА рдЕрдиреЗрдХ рдЙрдкрд╛рдп:
-
рдУрд░реЕрдХрд▓ рдЧреЛрд▓реНрдбрдирдЧреЗрдЯ , рдкрд░рдВрддреБ рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рднрд┐рдиреНрди "рд╡рдЬрди рд╢реНрд░реЗрдгреА" рдЖрд╣реЗ.
PS
рдЖрдордЪреНрдпрд╛ рдмреНрд▓реЙрдЧрд╡рд░ рджреЗрдЦреАрд▓ рд╡рд╛рдЪрд╛:
- ┬л
рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдордзреАрд▓ рдХрд╛рдлреНрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░рд╕рд╛рдареА рдпреЛрдЧреНрдп рдЖрдХрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреЗ "; - ┬л
рдЖрдордЪреНрдпрд╛ SRE рджреИрдирдВрджрд┐рди рдЬреАрд╡рдирд╛рддреАрд▓ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрдерд╛. рднрд╛рдЧ 2 "; - ┬л
Kubernetes рд╕рд╛рдареА PostgreSQL рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕, рдЖрдордЪреНрдпрд╛ рдирд┐рд╡рдбреА рдЖрдгрд┐ рдЕрдиреБрднрд╡рд╛рдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди ┬╗.
рд╕реНрддреНрд░реЛрдд: www.habr.com