﻿
{"id":24601,"date":"2022-03-30T19:20:44","date_gmt":"2022-03-30T19:20:44","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=24601"},"modified":"2022-03-30T19:20:44","modified_gmt":"2022-03-30T19:20:44","slug":"debeziumcdc-ile-veritabanlarindaki-degisiklikleri-yakalama-postgresql-mssql-mongodb","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/debeziumcdc-ile-veritabanlarindaki-degisiklikleri-yakalama-postgresql-mssql-mongodb\/","title":{"rendered":"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL &#8211; MSSQL &#8211; MongoDB"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde birden \u00e7ok veri kayna\u011f\u0131nda ger\u00e7ek zamanl\u0131 olu\u015fan de\u011fi\u015fikliklerin yakalanmas\u0131n\u0131 ve stream edilmesini sa\u011flayan, open source ve distributed bir ara\u00e7 olan Debezium CDC(Change Data Capture)&#8217;yi inceliyor olaca\u011f\u0131z.<\/p>\n<h4 style=\"color: #e83e8c;\">CDC(Change Data Capture) Nedir?<\/h4>\n<p>Veritaban\u0131nda insert, update ve delete i\u015flemleri neticesinde nihai olarak \u00f6ncesinden farkl\u0131 olan, bir ba\u015fka deyi\u015fle de\u011fi\u015fiklik g\u00f6steren verileri yakalamam\u0131z\u0131, izlememizi ve i\u015flem yapabilmemizi sa\u011flayan bir tasar\u0131m modelidir. Bu model sayesinde verilerin ilk ve son hallerini elde edebilir ve t\u00fcrl\u00fc operasyonlar ger\u00e7ekle\u015ftirebiliriz. Tabi ki de CDC&#8217;yi kullanabilmek i\u00e7in ilgili veritaban\u0131 taraf\u0131ndan destekleniyor olmas\u0131 gerekmektedir.<\/p>\n<p><strong><em>La hoca! Veritaban\u0131ndaki verisel de\u011fi\u015fiklikleri izleyebilmek i\u00e7in trigger kullanamaz m\u0131y\u0131z?<\/em><\/strong><br \/>\nTabi ki de trigger ile bu i\u015flemleri ger\u00e7ekle\u015ftirebilirsiniz. Lakin CDC ile ihtiyaca d\u00f6n\u00fck operasyonlar\u0131 daha h\u0131zl\u0131 bir \u015fekilde i\u015fleyebilirsiniz. \u00c7\u00fcnk\u00fc CDC verilere dair t\u00fcm bilgileri veritaban\u0131 loglar\u0131ndan toplayarak hizmet sa\u011flamaktad\u0131r. Bu sebepten dolay\u0131 trigger&#8217;lara nazaran daha performansl\u0131 ve az maliyetli bir i\u015f s\u00fcreci sa\u011flam\u0131\u015f bulunmaktad\u0131r. Ayr\u0131ca CDC sayesinden, veritaban\u0131nda istenilen tablonun tamam\u0131 yahut istek do\u011frultusunda bir k\u0131sm\u0131 \u00fczerinde yap\u0131lan de\u011fi\u015fiklikler takip edilerek s\u00fcre\u00e7teki verisel ak\u0131\u015f filtrelenebilmekte ve arzu edinildi\u011fi \u015fekilde y\u00f6netilebilmektedir.<\/p>\n<h4 style=\"color: #e83e8c;\">Debezium Nedir?<\/h4>\n<p>Giri\u015f paragraf\u0131nda bahsedildi\u011fi \u00fczere Debezium, veritaban\u0131 \u00fczerinde yap\u0131lan de\u011fi\u015fiklikleri yakalayarak bunlar\u0131 stream eden, open source ve distributed platform olan Change Data Capture(CDC) arac\u0131d\u0131r.<\/p>\n<p>Debezium, veritaban\u0131nda istenilen tabloda yahut o tablonun istenilen kolonlar\u0131nda olan t\u00fcm verisel de\u011fi\u015fiklikleri yakalayarak Kafka&#8217;ya aktar\u0131r. Bu de\u011fi\u015fiklikleri yakalama s\u00fcreci, Debezium&#8217;un \u00e7al\u0131\u015fmad\u0131\u011f\u0131 s\u00fcre\u00e7lerde de pasif bir \u015fekilde de ger\u00e7ekle\u015ftirilebilmektedir.<\/p>\n<p>Debezium, bir \u00fcstteki paragrafta bahsedildi\u011fi gibi veritaban\u0131nda olu\u015fan de\u011fi\u015fikliklere istinaden yakalad\u0131\u011f\u0131 verilerin dayan\u0131kl\u0131l\u0131\u011f\u0131 ve g\u00fcvenilirli\u011fi i\u00e7in Kafka ve Kafka Connect&#8217;ten yararlanmaktad\u0131r.<\/p>\n<h4 style=\"color: #e83e8c;\">Kafka Nedir?<\/h4>\n<p>Binlerce yaz\u0131l\u0131m projesi ve \u015firket taraf\u0131ndan kullan\u0131lan, publisher\/subscriber tabanl\u0131 olan open source distributed streaming platformudur. Temelde bilinmesi gereken Producer, Consumer, Broker ve Topic olmak \u00fczere d\u00f6rt terminolojik terimi mevcuttur;<\/p>\n<ul style=\"font-size: 12px;\">\n<li><em>Producer<\/em>, publisher rol\u00fcndedir. Subscriber&#8217;lara mesaj g\u00f6nderir.<\/li>\n<li><em>Consumer<\/em>, subscriber rol\u00fcndedir. Producer&#8217;lar\u0131n \u00fcretti\u011fi mesajlar\u0131 dinlemekte ve t\u00fcketmektedir.<\/li>\n<li><em>Topic<\/em>, Kafka&#8217;da mesajlar\u0131n tutuldu\u011fu yap\u0131d\u0131r.<\/li>\n<li><em>Broker<\/em>, Topic&#8217;leri bar\u0131nd\u0131ran sunuculard\u0131r.<\/li>\n<\/ul>\n<p>Debezium ile veritaban\u0131nda yakalanan de\u011fi\u015fikliklerin Kafka&#8217;ya aktar\u0131labilmesi i\u00e7in verilerin bunun anlayabilece\u011fi dilden bir formata d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi gerekmektedir. Bunun i\u00e7in Kafka Connect tool&#8217;unu kullan\u0131yor olaca\u011f\u0131z.<\/p>\n<p><strong>Kafka Connect Nedir?<\/strong><br \/>\nKafka&#8217;n\u0131n veritabanlar\u0131na, consule yahut eleasticsearch gibi yap\u0131lara ba\u011flanabilmesini ve metrikleri alabilmesini sa\u011flayan bir tool&#8217;dur. Hususi olarak i\u00e7eri\u011fimiz \u00e7er\u00e7evesinde de\u011ferlendirirsek e\u011fer Kafka ile Debezium aras\u0131nda veri ak\u0131\u015f\u0131n\u0131 sa\u011flayacak olan k\u00f6pr\u00fc g\u00f6revi g\u00f6ren yap\u0131lanmad\u0131r diyebiliriz.<\/p>\n<h4 style=\"color: #e83e8c;\">ZooKeeper Nedir?<\/h4>\n<p>Bir\u00e7ok yap\u0131land\u0131rma bilgisinin, distributed mimariler taraf\u0131ndan \u015fu veya bu \u015fekilde kullan\u0131ld\u0131\u011f\u0131n\u0131 biliyoruz. Tabi bu bilgilerin y\u00f6netimi manuel bir \u015fekilde yap\u0131ld\u0131\u011f\u0131 taktirde uygulanmalar\u0131n\u0131n zorlu\u011fu nedeniyle insani durumlardan kaynakl\u0131 hatalar ka\u00e7\u0131n\u0131lmaz olabilmektedir. Hadi diyelim do\u011fru bir \u015fekilde y\u00f6netildiler, bu sefer de uygulamalar da\u011f\u0131t\u0131ld\u0131\u011f\u0131nda y\u00f6netim karma\u015fas\u0131 gibi durumlarla kar\u015f\u0131la\u015f\u0131labilmektedir. \u0130\u015fte ZooKeeper, t\u00fcm bu riskleri g\u00f6zard\u0131 edip g\u00fcvenilir distributed yap\u0131land\u0131rma yapmam\u0131z\u0131 sa\u011flamaktad\u0131r.<\/p>\n<p>Haliyle, Kafka&#8217;n\u0131n yap\u0131land\u0131rma bilgilerini depolamak, adland\u0131rmak, senkronizasyonunu sa\u011flamak ve koordine etmek i\u00e7in ZooKeeper yaz\u0131l\u0131m\u0131n\u0131 kullan\u0131yor olaca\u011f\u0131z.<\/p>\n<blockquote><p><em style=\"color: green;\">Debezium entegrasyonlar\u0131nda ZooKeeper, temel kurulum d\u0131\u015f\u0131nda derinlemesine anla\u015f\u0131lmay\u0131 gerektirmemektedir.<\/em><\/p><\/blockquote>\n<p>\u015eimdi, temel enstr\u00fcmanlar\u0131 ve kullanaca\u011f\u0131m\u0131z teknolojileri teoride inceledi\u011fimize g\u00f6re art\u0131k pratikte Debezium&#8217;u inceleyebiliriz. Bunun i\u00e7in hedefledi\u011fim \u00fc\u00e7 farkl\u0131 veritaban\u0131 \u00fczerinden<span style=\"font-size: 11px;\">(PostgreSQL, MSSQL ve MongoDB)<\/span> \u00e7al\u0131\u015fma sergiliyor olaca\u011f\u0131z. Hadi buyrun, fazla vakit kaybetmeksizin ilk olarak PostgreSQL&#8217;den ba\u015flayal\u0131m.<\/p>\n<h4 style=\"color: #e83e8c;\">Debezium \u0130le PostgreSQL&#8217;de Change Data Capture(CDC) Nas\u0131l Yap\u0131l\u0131r?<\/h4>\n<p>\u0130lk olarak Debezium&#8217;u hangi veritaban\u0131yla kullan\u0131rsak kullanal\u0131m temelde Kafka ve Debezium \u00e7al\u0131\u015ft\u0131r\u0131lmal\u0131 ve ZooKeeper ile yap\u0131land\u0131rmalar ayarlanmal\u0131d\u0131r. T\u00fcm bu yaz\u0131l\u0131mlar\u0131m aya\u011fa kald\u0131r\u0131lmas\u0131 i\u00e7in Docker&#8217;dan istifade ediyor olaca\u011f\u0131z. \u015eimdi gelin ihtiyac\u0131m\u0131z olan ara\u00e7lar\u0131 h\u0131zl\u0131ca olu\u015fturup, aya\u011fa kald\u0131ral\u0131m.<\/p>\n<p><em>docker-compose-postgres.yaml<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nversion: '3.1'\r\nservices:\r\n  zookeeper:\r\n    image: debezium\/zookeeper\r\n    ports:\r\n      - &quot;2181:2181&quot;\r\n      - &quot;2888:2888&quot;\r\n      - &quot;3888:3888&quot;\r\n  kafka:\r\n    image: debezium\/kafka\r\n    ports:\r\n      - &quot;9092:9092&quot;\r\n      - &quot;29092:29092&quot;\r\n    depends_on:\r\n      - zookeeper\r\n    environment:\r\n      - ZOOKEEPER_CONNECT=zookeeper:2181\r\n      - KAFKA_ADVERTISED_LISTENERS=LISTENER_EXT:\/\/localhost:29092,LISTENER_INT:\/\/kafka:9092\r\n      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=LISTENER_INT:PLAINTEXT,LISTENER_EXT:PLAINTEXT\r\n      - KAFKA_LISTENERS=LISTENER_INT:\/\/0.0.0.0:9092,LISTENER_EXT:\/\/0.0.0.0:29092\r\n      - KAFKA_INTER_BROKER_LISTENER_NAME=LISTENER_INT\r\n  postgres:\r\n    image: debezium\/postgres\r\n    ports:\r\n      - 5432:5432\r\n    environment:\r\n      - POSTGRES_USER=postgres\r\n      - POSTGRES_PASSWORD=123456\r\n      - POSTGRES_DB=DebeziumDB\r\n  connect:\r\n    image: debezium\/connect\r\n    ports:\r\n      - 8083:8083\r\n    environment:\r\n      - BOOTSTRAP_SERVERS=kafka:9092\r\n      - GROUP_ID=1\r\n      - CONFIG_STORAGE_TOPIC=my_connect_configs\r\n      - OFFSET_STORAGE_TOPIC=my_connect_offsets\r\n      - STATUS_STORAGE_TOPIC=my_connect_statuses\r\n    depends_on:\r\n      - zookeeper\r\n      - kafka\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki docker compose dosyas\u0131na bakarsan\u0131z e\u011fer ihtiya\u00e7 do\u011frultusundaki ilgili t\u00fcm ara\u00e7lar\u0131 bar\u0131nd\u0131rmaktad\u0131r. T\u00fcm image&#8217;lar da debezium&#8217;lu versiyonlar\u0131 kullanmam\u0131z\u0131n nedeni debezium ile \u00e7al\u0131\u015fmalar\u0131 i\u00e7in gerekli ayarlar\u0131n\u0131n etkin gelmesindendir. PostgreSQL&#8217;de ise debezium&#8217;un sa\u011fl\u0131kl\u0131 \u00e7al\u0131\u015fabilmesi i\u00e7in <code>wal_level<\/code> konfig\u00fcrasyonuna &#8216;logical&#8217; de\u011feri verilmelidir.  Bunun nedeni, PostgreSQL&#8217;de herhangi bir transaction y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fcnde \u00f6ncelikle bu i\u015flem <em>Write-ahead logging(WAL)<\/em> ad\u0131 verilen yerde ger\u00e7ekle\u015ftirilmektedir. Debezium&#8217;da gerekli verileri WAL&#8217;dan toplayaca\u011f\u0131 i\u00e7in bu \u015fekilde ayarlanmas\u0131 gerekmektedir. Haliyle <code>debezium\/postgres<\/code> bu konfig\u00fcrasyon temellerinde gelmektedir. \u015eimdi PostgreSQL sunucusunun yap\u0131land\u0131rmalar\u0131na bir g\u00f6z at\u0131p \u00f6yle devam edelim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24673\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-5.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"921\" height=\"455\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-5.png 921w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-5-300x148.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-5-768x379.png 768w\" sizes=\"auto, (max-width: 921px) 100vw, 921px\" \/><\/a><\/p>\n<blockquote><p><em style=\"color:orange;\">Logical, WAL verilerini harici sistemlerin t\u00fcketebilmesi i\u00e7in gerekli izin konfig\u00fcrasyonunu sa\u011flar.<\/em><\/p><\/blockquote>\n<p>\u015eimdi bu docker compose dosyas\u0131n\u0131<br \/>\n<code style=\"color: red;\"><strong><em>docker-compose -f docker-compose-postgres.yaml up<\/em><\/strong><\/code><br \/>\ntalimat\u0131 e\u015fli\u011finde \u00e7al\u0131\u015ft\u0131ral\u0131m.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24624\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-1.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"812\" height=\"128\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-1.png 812w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-1-300x47.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-1-768x121.png 768w\" sizes=\"auto, (max-width: 812px) 100vw, 812px\" \/><\/a>T\u00fcm y\u00fcklemelerin bitip, container&#8217;lar\u0131n aya\u011fa kald\u0131r\u0131ld\u0131\u011f\u0131ndan emin olal\u0131m.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24627\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-2.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"409\" height=\"314\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-2.png 409w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-2-300x230.png 300w\" sizes=\"auto, (max-width: 409px) 100vw, 409px\" \/><\/a><\/p>\n<p>\u015eimdi PostgreSQL sunucusunda yukar\u0131daki <em style=\"font-size: 12px;\">docker-compose-postgres.yaml<\/em> dosyas\u0131nda olu\u015fturulan &#8216;DebeziumDB&#8217; veritaban\u0131 i\u00e7erisinde a\u015fa\u011f\u0131daki \u00f6rnek tabloyu ve \u015femay\u0131 olu\u015ftural\u0131m ve ard\u0131ndan \u00f6rnek bir ka\u00e7 veri insert edelim.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ncreate  schema exampleschema\r\nset search_path TO exampleschema,public;\r\ncreate table exampleschema.exampletable (\r\n    column1 int,\r\n    column2 int,\r\n    column3 varchar(150),\r\n    primary key(column1)\r\n);\r\nalter table exampleschema.exampletable replica identity FULL;\r\ninsert into exampleschema.exampletable values (1000, 2000, 'example value');\r\ninsert into exampleschema.exampletable values (1001, 2001, 'example value 2');\r\n<\/pre>\n<\/div>\n<p>\u015eimdi ise debezzium connector&#8217;\u0131n bizlere sunmu\u015f oldu\u011fu API arac\u0131l\u0131\u011f\u0131yla dinlenecek olan veritaban\u0131 ve tablo bilgilerinin verilmesi gerekmektedir. Bunun i\u00e7in a\u015fa\u011f\u0131daki gibi bir .json dosyas\u0131 olu\u015fturarak gerekli bilgileri i\u00e7erisinde tan\u0131mlamam\u0131z gerekmektedir.<\/p>\n<p><em>register-postgres.json<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n    &quot;name&quot;: &quot;example-connector&quot;,\r\n    &quot;config&quot;: {\r\n        &quot;connector.class&quot;: &quot;io.debezium.connector.postgresql.PostgresConnector&quot;,\r\n        &quot;tasks.max&quot;: &quot;1&quot;,\r\n        &quot;database.hostname&quot;: &quot;postgres&quot;,\r\n        &quot;database.port&quot;: &quot;5432&quot;,\r\n        &quot;database.user&quot;: &quot;postgres&quot;,\r\n        &quot;database.password&quot;: &quot;123456&quot;,\r\n        &quot;database.dbname&quot; : &quot;DebeziumDB&quot;,\r\n        &quot;database.server.name&quot;: &quot;exampleserver&quot;,\r\n        &quot;schema.include.list&quot;: &quot;exampleschema&quot;,\r\n        &quot;table.whitelist&quot;: &quot;exampleschema.exampletable&quot;\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Bu bilgileri tan\u0131mlad\u0131ktan sonra <code>curl<\/code> \u00fczerinden a\u015fa\u011f\u0131daki post iste\u011fini g\u00f6ndermemiz yeterlidir.<br \/>\n<code style=\"color: red;\"><strong><em>curl -i -X POST -H \"Accept:application\/json\" -H  \"Content-Type:application\/json\" http:\/\/localhost:8083\/connectors\/ -d @register-postgres.json<\/em><\/strong><\/code><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-3.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"963\" height=\"206\" class=\"aligncenter size-full wp-image-24689\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-3.png 963w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-3-300x64.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-3-768x164.png 768w\" sizes=\"auto, (max-width: 963px) 100vw, 963px\" \/><\/a>B\u00f6ylece bu son hamle e\u015fli\u011finde bir connector tan\u0131mlayarak debezium&#8217;u etkinle\u015ftirmi\u015f bulunmaktay\u0131z. Connector&#8217;\u0131 etkinle\u015ftirme neticesinde yukar\u0131daki g\u00f6rselde tek sat\u0131r halinde gelen result&#8217;\u0131 do\u011fru d\u00fczg\u00fcn g\u00f6rmek isteyenler i\u00e7in formatland\u0131r\u0131p a\u015fa\u011f\u0131ya b\u0131rak\u0131yorum;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n   &quot;name&quot;:&quot;example-connector&quot;,\r\n   &quot;config&quot;:{\r\n      &quot;connector.class&quot;:&quot;io.debezium.connector.postgresql.PostgresConnector&quot;,\r\n      &quot;tasks.max&quot;:&quot;1&quot;,\r\n      &quot;database.hostname&quot;:&quot;postgres&quot;,\r\n      &quot;database.port&quot;:&quot;5432&quot;,\r\n      &quot;database.user&quot;:&quot;postgres&quot;,\r\n      &quot;database.password&quot;:&quot;123456&quot;,\r\n      &quot;database.dbname&quot;:&quot;DebeziumDB&quot;,\r\n      &quot;database.server.name&quot;:&quot;exampleserver&quot;,\r\n      &quot;schema.include.list&quot;:&quot;exampleschema&quot;,\r\n      &quot;table.whitelist&quot;:&quot;exampleschema.exampletable&quot;,\r\n      &quot;name&quot;:&quot;example-connector&quot;\r\n   },\r\n   &quot;tasks&quot;:&#x5B;\r\n      \r\n   ],\r\n   &quot;type&quot;:&quot;source&quot;\r\n}\r\n<\/pre>\n<\/div>\n<p>Ve \u015fimdi ise debezium connector ile takip edilen veritaban\u0131 sunucusundaki ilgili tablodaki veri de\u011fi\u015fikliklerinin izlemesini ger\u00e7ekle\u015ftirelim. Bunun i\u00e7in a\u015fa\u011f\u0131daki docker talimat\u0131n\u0131n verilmesi yeterlidir.<\/p>\n<p><code style=\"color: red;\"><strong><em>docker-compose -f docker-compose-postgres.yaml exec kafka \/kafka\/bin\/kafka-console-consumer.sh --bootstrap-server kafka:9092 --from-beginning --property print.key=true --topic exampleserver.exampleschema.exampletable<\/em><\/strong><\/code><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-4.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"1092\" height=\"396\" class=\"aligncenter size-full wp-image-24701\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-4.png 1092w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-4-300x109.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-4-1024x371.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-4-768x279.png 768w\" sizes=\"auto, (max-width: 1092px) 100vw, 1092px\" \/><\/a>Evet, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere PostgreSQL veritaban\u0131ndaki yap\u0131lan de\u011fi\u015fiklikler yakalanm\u0131\u015f bulunmaktad\u0131r. Hatta debezium connector ba\u011flanmadan \u00f6nce girilen \u00f6rnek veriler bile \u00f6nceki paragraflarda bildirildi\u011fi \u00fczere debezium \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131ktan sonra yakalanm\u0131\u015f ve elde edilmi\u015ftir. \u015eimdi gelen json verileri d\u00fczg\u00fcn formata getirip, inceleyelim.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n   &quot;schema&quot;:{\r\n      &quot;type&quot;:&quot;struct&quot;,\r\n      &quot;fields&quot;:&#x5B;\r\n         {\r\n            &quot;type&quot;:&quot;int32&quot;,\r\n            &quot;optional&quot;:false,\r\n            &quot;field&quot;:&quot;column1&quot;\r\n         }\r\n      ],\r\n      &quot;optional&quot;:false,\r\n      &quot;name&quot;:&quot;exampleserver.exampleschema.exampletable.Key&quot;\r\n   },\r\n   &quot;payload&quot;:{\r\n      &quot;column1&quot;:1000\r\n   }\r\n}{\r\n   &quot;schema&quot;:{\r\n      &quot;type&quot;:&quot;struct&quot;,\r\n      &quot;fields&quot;:&#x5B;\r\n         {\r\n            &quot;type&quot;:&quot;struct&quot;,\r\n            &quot;fields&quot;:&#x5B;\r\n               {\r\n                  &quot;type&quot;:&quot;int32&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;column1&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;int32&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;field&quot;:&quot;column2&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;field&quot;:&quot;column3&quot;\r\n               }\r\n            ],\r\n            &quot;optional&quot;:true,\r\n            &quot;name&quot;:&quot;exampleserver.exampleschema.exampletable.Value&quot;,\r\n            &quot;field&quot;:&quot;before&quot;\r\n         },\r\n         {\r\n            &quot;type&quot;:&quot;struct&quot;,\r\n            &quot;fields&quot;:&#x5B;\r\n               {\r\n                  &quot;type&quot;:&quot;int32&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;column1&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;int32&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;field&quot;:&quot;column2&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;field&quot;:&quot;column3&quot;\r\n               }\r\n            ],\r\n            &quot;optional&quot;:true,\r\n            &quot;name&quot;:&quot;exampleserver.exampleschema.exampletable.Value&quot;,\r\n            &quot;field&quot;:&quot;after&quot;\r\n         },\r\n         {\r\n            &quot;type&quot;:&quot;struct&quot;,\r\n            &quot;fields&quot;:&#x5B;\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;version&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;connector&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;name&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;int64&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;ts_ms&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;name&quot;:&quot;io.debezium.data.Enum&quot;,\r\n                  &quot;version&quot;:1,\r\n                  &quot;parameters&quot;:{\r\n                     &quot;allowed&quot;:&quot;true,last,false,incremental&quot;\r\n                  },\r\n                  &quot;default&quot;:&quot;false&quot;,\r\n                  &quot;field&quot;:&quot;snapshot&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;db&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;field&quot;:&quot;sequence&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;schema&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;table&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;int64&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;field&quot;:&quot;txId&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;int64&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;field&quot;:&quot;lsn&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;int64&quot;,\r\n                  &quot;optional&quot;:true,\r\n                  &quot;field&quot;:&quot;xmin&quot;\r\n               }\r\n            ],\r\n            &quot;optional&quot;:false,\r\n            &quot;name&quot;:&quot;io.debezium.connector.postgresql.Source&quot;,\r\n            &quot;field&quot;:&quot;source&quot;\r\n         },\r\n         {\r\n            &quot;type&quot;:&quot;string&quot;,\r\n            &quot;optional&quot;:false,\r\n            &quot;field&quot;:&quot;op&quot;\r\n         },\r\n         {\r\n            &quot;type&quot;:&quot;int64&quot;,\r\n            &quot;optional&quot;:true,\r\n            &quot;field&quot;:&quot;ts_ms&quot;\r\n         },\r\n         {\r\n            &quot;type&quot;:&quot;struct&quot;,\r\n            &quot;fields&quot;:&#x5B;\r\n               {\r\n                  &quot;type&quot;:&quot;string&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;id&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;int64&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;total_order&quot;\r\n               },\r\n               {\r\n                  &quot;type&quot;:&quot;int64&quot;,\r\n                  &quot;optional&quot;:false,\r\n                  &quot;field&quot;:&quot;data_collection_order&quot;\r\n               }\r\n            ],\r\n            &quot;optional&quot;:true,\r\n            &quot;field&quot;:&quot;transaction&quot;\r\n         }\r\n      ],\r\n      &quot;optional&quot;:false,\r\n      &quot;name&quot;:&quot;exampleserver.exampleschema.exampletable.Envelope&quot;\r\n   },\r\n   &quot;payload&quot;:{\r\n      &quot;before&quot;:null,\r\n      &quot;after&quot;:{\r\n         &quot;column1&quot;:1000,\r\n         &quot;column2&quot;:2000,\r\n         &quot;column3&quot;:&quot;example value&quot;\r\n      },\r\n      &quot;source&quot;:{\r\n         &quot;version&quot;:&quot;1.8.1.Final&quot;,\r\n         &quot;connector&quot;:&quot;postgresql&quot;,\r\n         &quot;name&quot;:&quot;exampleserver&quot;,\r\n         &quot;ts_ms&quot;:1647763176365,\r\n         &quot;snapshot&quot;:&quot;true&quot;,\r\n         &quot;db&quot;:&quot;DebeziumDB&quot;,\r\n         &quot;sequence&quot;:&quot;&#x5B;null,\\&quot;23723656\\&quot;]&quot;,\r\n         &quot;schema&quot;:&quot;exampleschema&quot;,\r\n         &quot;table&quot;:&quot;exampletable&quot;,\r\n         &quot;txId&quot;:557,\r\n         &quot;lsn&quot;:23723656,\r\n         &quot;xmin&quot;:null\r\n      },\r\n      &quot;op&quot;:&quot;r&quot;,\r\n      &quot;ts_ms&quot;:1647763176368,\r\n      &quot;transaction&quot;:null\r\n   }\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki json datay\u0131 incelerseniz e\u011fer 177 ile 200. sat\u0131r aral\u0131\u011f\u0131nda de\u011fi\u015fiklik olan verileri i\u00e7eren &#8216;payload&#8217; alan\u0131 mevcuttur. Yakalanan verilerin hangi aksiyona tabii tutuldu\u011funu 198. sat\u0131rdaki &#8216;op&#8217; alan\u0131ndaki <code>c<\/code>, <code>u<\/code>, <code>d<\/code> ve <code>r<\/code> de\u011ferleri ifade etmektedir.<\/p>\n<table>\n<tr>\n<td style=\"width:5%;background-color:pink;color:white;\"><strong>c<\/strong><\/td>\n<td style=\"text-align:left;\">Yakalanan verinin eklendi\u011fini ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"width:5%;background-color:pink;color:white;\"><strong>u<\/strong><\/td>\n<td style=\"text-align:left;\">Yakalanan verinin g\u00fcncellendi\u011fini ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"width:5%;background-color:pink;color:white;\"><strong>d<\/strong><\/td>\n<td style=\"text-align:left;\">Yakalanan verinin silindi\u011fini ifade eder.<\/td>\n<\/tr>\n<tr>\n<td style=\"width:5%;background-color:pink;color:white;\"><strong>r<\/strong><\/td>\n<td style=\"text-align:left;\">Yakalanan verinin zaten var oldu\u011funu ifade eder.<\/td>\n<\/tr>\n<\/table>\n<p><strong><em>Peki hoca, gelen json data&#8217;da ki di\u011fer alanlar neyin nesi?<\/em><\/strong> diye sorarsan\u0131z e\u011fer \u015f\u00f6yle cevaplayal\u0131m;<\/p>\n<ul>\n<li><em>schema<\/em>; takip edilen tablonun yap\u0131s\u0131 ve kolonlarla ilgili bilgiler ta\u015f\u0131yan k\u0131s\u0131md\u0131r.<\/li>\n<li><em>payload<\/em>; yukar\u0131da g\u00f6r\u00fcd\u00fc\u011f\u00fcm\u00fcz \u00fczere de\u011fi\u015fiklikler neticesinde akan verilere dair bilgi veren k\u0131s\u0131md\u0131r.<\/li>\n<li><em>before<\/em>; de\u011fi\u015fiklik olan verilerin, de\u011fi\u015fiklik olmadan \u00f6nceki hallerini ta\u015f\u0131yan k\u0131s\u0131md\u0131r. Insert haricinde update ve delete sorgular\u0131nda dolu gelmektedir.<\/li>\n<li><em>after<\/em>; de\u011fi\u015fiklik olan verilerdeki son de\u011ferleri veren k\u0131s\u0131md\u0131r. Delete hari\u00e7 di\u011fer sorgularda dolu gelmektedir.<\/li>\n<\/ul>\n<p>\u015eimdi test ama\u00e7l\u0131 a\u015fa\u011f\u0131daki veritaban\u0131 sorgular\u0131n\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nupdate exampleschema.exampletable\r\nset\r\ncolumn1 = 5000,\r\ncolumn2 = 6000,\r\ncolumn3 = 'updated example value'\r\nwhere column1 = 1000\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-6.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"1083\" height=\"398\" class=\"aligncenter size-full wp-image-24710\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-6.png 1083w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-6-300x110.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-6-1024x376.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-6-768x282.png 768w\" sizes=\"auto, (max-width: 1083px) 100vw, 1083px\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere \u00e7al\u0131\u015ft\u0131r\u0131lan sorgu update sorgusu ise veritaban\u0131 a\u00e7\u0131s\u0131ndan bu bir delete ve insert i\u015flemi oldu\u011fu i\u00e7in \u00f6nce &#8216;op&#8217; de\u011feri &#8216;d&#8217; sonra da &#8216;c&#8217; olan iki kay\u0131t yakalanmaktad\u0131r. Haliyle &#8216;before&#8217; ve &#8216;after&#8217; alanlar\u0131ndan update yap\u0131lan sorguya dair verileri rahatl\u0131kla yakalayabilmekteyiz.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndelete from exampleschema.exampletable\r\nwhere column1 = 5000\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-7.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"1084\" height=\"210\" class=\"aligncenter size-full wp-image-24712\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-7.png 1084w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-7-300x58.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-7-1024x198.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-7-768x149.png 768w\" sizes=\"auto, (max-width: 1084px) 100vw, 1084px\" \/><\/a>Delete sorgusunda da ayn\u0131 mant\u0131k silinecek veriye dair \u00f6nceki kay\u0131tlar elde edilebilmektedir.<\/p>\n<p>B\u00f6ylece PostgreSQL ile CDC \u00e7al\u0131\u015fmas\u0131n\u0131 ger\u00e7ekle\u015ftirmi\u015f olduk. Mevzu bahis, Debezium ile yakalanan verilerin Kafka \u00fczerinden .NET Core ortam\u0131nda okunmas\u0131na gelmeden \u00f6nce MSSQL ve MongoDB \u00fczerinden de CDC entegrasyonunu ele alal\u0131m. Nihayetinde t\u00fcm \u00f6rneklendirmeler Kafka kullanaca\u011f\u0131ndan dolay\u0131 i\u00e7eri\u011fimizin sonlar\u0131na do\u011fru .NET Core ortam\u0131nda m\u00fc\u015fterek bir uygulama olu\u015fturarak konuyu tek elden \u00f6rneklendirebiliriz.<\/p>\n<h4 style=\"color: #e83e8c;\">Debezium \u0130le MSSQL&#8217;de Change Data Capture(CDC) Nas\u0131l Yap\u0131l\u0131r?<\/h4>\n<p>\u0130lk olarak MSSQL veritaban\u0131yla birlikte ilgili image&#8217;lar\u0131 aya\u011fa kald\u0131rabilmek i\u00e7in a\u015fa\u011f\u0131daki docker compose dosyas\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<p><em>docker-compose-sqlserver.yaml<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nversion: '3.1'\r\nservices:\r\n  zookeeper:\r\n    image: debezium\/zookeeper\r\n    ports:\r\n      - &quot;2181:2181&quot;\r\n      - &quot;2888:2888&quot;\r\n      - &quot;3888:3888&quot;\r\n  kafka:\r\n    image: debezium\/kafka\r\n    ports:\r\n      - &quot;9092:9092&quot;\r\n      - &quot;29092:29092&quot;\r\n    depends_on:\r\n      - zookeeper\r\n    environment:\r\n      - ZOOKEEPER_CONNECT=zookeeper:2181\r\n      - KAFKA_ADVERTISED_LISTENERS=LISTENER_EXT:\/\/localhost:29092,LISTENER_INT:\/\/kafka:9092\r\n      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=LISTENER_INT:PLAINTEXT,LISTENER_EXT:PLAINTEXT\r\n      - KAFKA_LISTENERS=LISTENER_INT:\/\/0.0.0.0:9092,LISTENER_EXT:\/\/0.0.0.0:29092\r\n      - KAFKA_INTER_BROKER_LISTENER_NAME=LISTENER_INT\r\n  sqlserver:\r\n    image: mcr.microsoft.com\/mssql\/server\r\n    ports:\r\n      - 1433:1433\r\n    environment:\r\n      - ACCEPT_EULA=Y\r\n      - MSSQL_PID=Standard\r\n      - SA_PASSWORD=1q2w3e4r!^+\r\n      - MSSQL_AGENT_ENABLED=true\r\n  connect:\r\n    image: debezium\/connect\r\n    ports:\r\n      - 8083:8083\r\n    environment:\r\n      - BOOTSTRAP_SERVERS=kafka:9092\r\n      - GROUP_ID=1\r\n      - CONFIG_STORAGE_TOPIC=my_connect_configs\r\n      - OFFSET_STORAGE_TOPIC=my_connect_offsets\r\n      - STATUS_STORAGE_TOPIC=my_connect_statuses\r\n    depends_on:\r\n      - zookeeper\r\n      - kafka\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki talimat e\u015fli\u011finde ilgili dosyay\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m.<br \/>\n<code style=\"color: red;\"><strong><em>docker-compose -f docker-compose-sqlserver.yaml up<\/em><\/strong><\/code><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-8.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"354\" height=\"295\" class=\"aligncenter size-full wp-image-24723\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-8.png 354w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-8-300x250.png 300w\" sizes=\"auto, (max-width: 354px) 100vw, 354px\" \/><\/a>\u015eimdi SQL Server&#8217;da \u00f6rnek bir veritaban\u0131 ve tablo olu\u015ftural\u0131m.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate database DebeziumDB\r\ngo\r\nuse DebeziumDB\r\ngo\r\ncreate schema exampleschema\r\ngo\r\ncreate table exampleschema.exampletable\r\n(\r\n\tcolumn1 int primary key identity(1,1),\r\n\tcolumn2 int,\r\n\tcolumn3 nvarchar(max)\r\n)\r\n<\/pre>\n<\/div>\n<p>Akabinde olu\u015fturulan veritaban\u0131 i\u00e7erisinde verisel de\u011fi\u015fiklikleri yakalayabilmek i\u00e7in gerekli CDC aktifle\u015ftirme konfig\u00fcrasyonunu ger\u00e7ekle\u015ftirelim.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nuse DebeziumDB\r\ngo\r\nexec sys.sp_cdc_enable_db\r\n<\/pre>\n<\/div>\n<p>Bu veritaban\u0131 seviyesinde bir CDC aktifle\u015ftirmeyken,<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nuse DebeziumDB\r\ngo\r\nexec sys.sp_cdc_enable_table \r\n@source_schema = N'exampleschema', \r\n@source_name = N'exampletable', \r\n@role_name = NULL, \r\n@filegroup_name = N'', \r\n@supports_net_changes = 0 \r\n<\/pre>\n<\/div>\n<p>bu ise tablo seviyesinde CDC aktifle\u015ftirmesidir.<\/p>\n<p>Bu i\u015flemlerden sonra s\u0131ra debezium i\u00e7in bir connector tan\u0131mlamas\u0131nda bulunmaya gelmi\u015ftir. Bunun i\u00e7in a\u015fa\u011f\u0131daki register konfig\u00fcrasyonlar\u0131n\u0131 bar\u0131nd\u0131ran .json dosyas\u0131n\u0131 curl \u00fczerinden verilen talimat e\u015fli\u011finde post edilmesi yeterlidir.<\/p>\n<p><em>register-sqlserver.json<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n    &quot;name&quot;: &quot;example-connector&quot;,\r\n    &quot;config&quot;: {\r\n        &quot;connector.class&quot;: &quot;io.debezium.connector.sqlserver.SqlServerConnector&quot;,\r\n        &quot;tasks.max&quot;: &quot;1&quot;,\r\n        &quot;database.hostname&quot;: &quot;sqlserver&quot;,\r\n        &quot;database.port&quot;: &quot;1433&quot;,\r\n        &quot;database.user&quot;: &quot;sa&quot;,\r\n        &quot;database.password&quot;: &quot;1q2w3e4r!^+&quot;,\r\n        &quot;database.dbname&quot;: &quot;DebeziumDB&quot;,\r\n        &quot;database.server.name&quot;: &quot;exampleserver&quot;,\r\n        &quot;schema.include.list&quot;: &quot;exampleschema&quot;,\r\n        &quot;table.whitelist&quot;: &quot;exampleschema.exampletable&quot;,\r\n        &quot;database.history.kafka.bootstrap.servers&quot;: &quot;kafka:9092&quot;,\r\n        &quot;database.history.kafka.topic&quot;: &quot;dbhistory.fullfillment&quot;\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p><code style=\"color: red;\"><strong><em>curl -i -X POST -H \"Accept:application\/json\" -H  \"Content-Type:application\/json\" http:\/\/localhost:8083\/connectors\/ -d @register-sqlserver.json<\/em><\/strong><\/code><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-9.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"965\" height=\"222\" class=\"aligncenter size-full wp-image-24726\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-9.png 965w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-9-300x69.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-9-768x177.png 768w\" sizes=\"auto, (max-width: 965px) 100vw, 965px\" \/><\/a>Yukar\u0131daki g\u00f6rseli incelerseniz e\u011fer connector olu\u015fturma neticesinde result&#8217;unu bizlere d\u00f6nd\u00fcrm\u00fc\u015f vaziyettedir. Result&#8217;un do\u011fru formatland\u0131r\u0131lm\u0131\u015f halini bir \u00f6nceki PostgreSQL \u00f6rneklendirmesinde sundu\u011fum i\u00e7in burada l\u00fczum g\u00f6rmemekteyim.<\/p>\n<p>Art\u0131k debezium ile ba\u011flant\u0131s\u0131 kurulan SQL Server&#8217;\u0131n \u00fczerinde yap\u0131lan de\u011fi\u015fikliklerin yakalan\u0131p, yakalanmad\u0131\u011f\u0131n\u0131 a\u015fa\u011f\u0131daki talimat e\u015fli\u011finde takip edebiliriz.<br \/>\n<code style=\"color: red;\"><strong><em>docker-compose -f docker-compose-sqlserver.yaml exec kafka \/kafka\/bin\/kafka-console-consumer.sh --bootstrap-server kafka:9092 --from-beginning --property print.key=true --topic exampleserver.exampleschema.exampletable<\/em><\/strong><\/code><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB.gif\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"800\" height=\"574\" class=\"aligncenter size-full wp-image-24728\" \/><\/a><\/p>\n<p>Evet&#8230; SQL Server ile de CDC \u00e7al\u0131\u015fmas\u0131n\u0131 tamamlam\u0131\u015f bulunmaktay\u0131z. \u015eimdi s\u0131rada NoSQL yakla\u015f\u0131m\u0131na sahip olan MongoDB var \ud83d\ude42<\/p>\n<h4 style=\"color: #e83e8c;\">Debezium \u0130le MongoDB&#8217;de Change Data Capture(CDC) Nas\u0131l Yap\u0131l\u0131r?<\/h4>\n<p>MongoDB i\u00e7in \u00f6rneklendirmede biraz h\u0131zl\u0131 ilerliyor olaca\u011f\u0131z. \u015eimdi a\u015fa\u011f\u0131daki docker compose i\u00e7eri\u011fini verilen talimat e\u015fli\u011finde \u00e7al\u0131\u015ft\u0131rarak ba\u015flayal\u0131m.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nversion: '2'\r\nservices:\r\n  zookeeper:\r\n    image: quay.io\/debezium\/zookeeper\r\n    ports:\r\n     - 2181:2181\r\n     - 2888:2888\r\n     - 3888:3888\r\n  kafka:\r\n    image: quay.io\/debezium\/kafka\r\n    ports:\r\n     - 9092:9092\r\n    links:\r\n     - zookeeper\r\n    environment:\r\n     - ZOOKEEPER_CONNECT=zookeeper:2181\r\n  mongodb:\r\n    image: quay.io\/debezium\/example-mongodb\r\n    hostname: mongodb\r\n    ports:\r\n     - 27017:27017\r\n    environment:\r\n     - MONGODB_USER=debezium\r\n     - MONGODB_PASSWORD=dbz\r\n  connect:\r\n    image: quay.io\/debezium\/connect\r\n    ports:\r\n     - 8083:8083\r\n    links:\r\n     - kafka\r\n     - mongodb\r\n    environment:\r\n     - BOOTSTRAP_SERVERS=kafka:9092\r\n     - GROUP_ID=1\r\n     - CONFIG_STORAGE_TOPIC=my_connect_configs\r\n     - OFFSET_STORAGE_TOPIC=my_connect_offsets\r\n     - STATUS_STORAGE_TOPIC=my_connect_statuses\r\n<\/pre>\n<\/div>\n<p><code style=\"color: red;\"><strong><em>docker-compose -f docker-compose-mongodb.yaml up<\/em><\/strong><\/code><\/p>\n<p>Akabinde MongoDB replika setini ba\u015flatal\u0131m ve test verileri ekleyelim.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndocker-compose -f docker-compose-mongodb.yaml exec mongodb bash -c '\/usr\/local\/bin\/init-inventory.sh'\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki i\u00e7eri\u011fe sahip olan connector&#8217;u verilen talimat e\u015fli\u011finde ba\u015flatal\u0131m.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n    &quot;name&quot;: &quot;inventory-connector&quot;,\r\n    &quot;config&quot;: {\r\n        &quot;connector.class&quot; : &quot;io.debezium.connector.mongodb.MongoDbConnector&quot;,\r\n        &quot;tasks.max&quot; : &quot;1&quot;,\r\n        &quot;mongodb.hosts&quot; : &quot;rs0\/mongodb:27017&quot;,\r\n        &quot;mongodb.name&quot; : &quot;dbserver1&quot;,\r\n        &quot;mongodb.user&quot; : &quot;debezium&quot;,\r\n        &quot;mongodb.password&quot; : &quot;dbz&quot;,\r\n        &quot;database.include.list&quot; : &quot;inventory&quot;,\r\n        &quot;database.history.kafka.bootstrap.servers&quot; : &quot;kafka:9092&quot;\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p><code style=\"color: red;\"><strong><em>curl -i -X POST -H \"Accept:application\/json\" -H  \"Content-Type:application\/json\" http:\/\/localhost:8083\/connectors\/ -d @register-mongodb.json<\/em><\/strong><\/code><\/p>\n<p>Yap\u0131lan bu \u00e7al\u0131\u015fmalar kafidir. <em>example-mongodb<\/em> image&#8217;i sayesinde \u00f6rnek bir veritaban\u0131 olu\u015fturulmu\u015f vaziyettedir. Haliyle bu veritaban\u0131 i\u00e7erisindeki verisel de\u011fi\u015fiklikleri yakalayan kafka&#8217;ya ba\u011flanarak verileri t\u00fcketebiliriz. Bunun i\u00e7in a\u015fa\u011f\u0131daki talimat\u0131n verilmesi yeterlidir.<br \/>\n<code style=\"color: red;\"><strong><em>docker-compose -f docker-compose-mongodb.yaml exec kafka \/kafka\/bin\/kafka-console-consumer.sh --bootstrap-server kafka:9092 --from-beginning --property print.key=true --topic dbserver1.inventory.customers<\/em><\/strong><\/code><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-10.png\" alt=\"Debezium(CDC) \u0130le Veritabanlar\u0131ndaki De\u011fi\u015fiklikleri Yakalama | PostgreSQL - MSSQL - MongoDB\" width=\"1086\" height=\"275\" class=\"aligncenter size-full wp-image-24743\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-10.png 1086w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-10-300x76.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-10-1024x259.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumCDC-Ile-Veritabanlarindaki-Degisiklikleri-Yakalama-PostgreSQL-MSSQL-MongoDB-10-768x194.png 768w\" sizes=\"auto, (max-width: 1086px) 100vw, 1086px\" \/><\/a>Vee i\u015fte MongoDB&#8217;dende yap\u0131lan verisel de\u011fi\u015fikliklerin yakaland\u0131\u011f\u0131n\u0131 hep birlikte g\u00f6r\u00fcyoruz \ud83d\ude42<\/p>\n<p>\u015eimdi veritabanlar\u0131nda yap\u0131lan de\u011fi\u015fikliklerin CDC ile yakalan\u0131p kafka&#8217;ya g\u00f6nderilen datalar\u0131n\u0131 C# \u00fczerinden nas\u0131l okuyabilece\u011fimizi basit olarak ele alman\u0131n vakti geldi.<\/p>\n<h4 style=\"color: #e83e8c;\">Debezium \u0130le PostgreSQL, MSSQL veya MongoDB&#8217;den Change Data Capture(CDC) \u0130le Yakalanan Verilerin C# Taraf\u0131ndan Okunmas\u0131<\/h4>\n<p>Bunun i\u00e7in a\u015fa\u011f\u0131daki gibi <a href=\"https:\/\/www.nuget.org\/packages\/Confluent.Kafka\/\" rel=\"noopener\" target=\"_blank\">Confluent.Kafka<\/a> k\u00fct\u00fcphanesini kullanarak basit bir consumer olu\u015fturabiliriz.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Confluent.Kafka;\r\n\r\nConsumerConfig config = new()\r\n{\r\n    GroupId = &quot;exampleserver.exampleschema.exampletable&quot;,\r\n    BootstrapServers = &quot;localhost:29092&quot;,\r\n    AutoOffsetReset = AutoOffsetReset.Earliest,\r\n\r\n};\r\n\r\nusing IConsumer&lt;Ignore, string&gt; consumer = new ConsumerBuilder&lt;Ignore, string&gt;(config).Build();\r\nconsumer.Subscribe(&quot;exampleserver.exampleschema.exampletable&quot;);\r\n\r\nCancellationTokenSource source = new CancellationTokenSource();\r\nConsole.CancelKeyPress += (_, e) =&gt;\r\n{\r\n    e.Cancel = true;\r\n    source.Cancel();\r\n};\r\nwhile (true)\r\n{\r\n    ConsumeResult&lt;Ignore, string&gt; result = consumer.Consume(source.Token);\r\n    Console.WriteLine($&quot;Topic Name : {result.TopicPartitionOffset}&quot;);\r\n    Console.WriteLine($&quot;Message : {result.Value}&quot;);\r\n}\r\n<\/pre>\n<\/div>\n<h4 style=\"color: #e83e8c;\">Ekstra Bilgiler<\/h4>\n<p>Misal, Kafka&#8217;da herhangi bir topic olu\u015fturuldu mu? ya da yukar\u0131 sat\u0131rlarda olu\u015fturdu\u011fumuz connector&#8217;lar hala ayakta m\u0131? Bunun i\u00e7in a\u015fa\u011f\u0131daki talimatlar e\u015fli\u011finde sorgulama yapabiliyoruz&#8230;<\/p>\n<table>\n<tr>\n<td style=\"text-align:left;width:10%;\">Mevcut connectorlar<\/td>\n<td>:<\/td>\n<td style=\"text-align:left;\"><code>http:\/\/localhost:8083\/connectors\/<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;width:10%;\">Topic list<\/td>\n<td>:<\/td>\n<td style=\"text-align:left;\"><code>docker-compose -f docker-compose-postgres.yaml exec kafka \/kafka\/bin\/kafka-topics.sh --list --bootstrap-server kafka:9092<\/code><br \/>\nya da<br \/>\n<code>bin\/kafka-topics.sh --list --bootstrap-server kafka:9092<\/code><\/td>\n<\/tr>\n<\/table>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek dosyalar\u0131 a\u015fa\u011f\u0131daki linklere t\u0131klayarak indirebilirsiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/MongoDB.zip\">MongoDB<\/a>, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/SQLServer.zip\">SQLServer<\/a>, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Postgres.zip\">Postgres<\/a>, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/DebeziumExample.zip\">DebeziumExample<\/a><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde birden \u00e7ok veri kayna\u011f\u0131nda ger\u00e7ek zamanl\u0131 olu\u015fan de\u011fi\u015fikliklerin yakalanmas\u0131n\u0131 ve stream edilmesini sa\u011flayan, open source ve distributed bir ara\u00e7 olan Debezium CDC(Change Data Capture)&#8217;yi inceliyor olaca\u011f\u0131z. CDC(Change Data Capture) Nedir? Veritaban\u0131nda&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":24620,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4536],"tags":[4540,4541,4539,4542,4544,4546,4545,4543,4551,4549,4550,4548,4547],"class_list":["post-24601","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-debezium","tag-cdk","tag-change-data-capture","tag-debezium","tag-debezium-nedir","tag-kafka","tag-kafka-connect","tag-kafka-connect-nedir","tag-kafka-nedir","tag-wal","tag-wal2json","tag-write-ahead-logging","tag-zookeeper","tag-zookeeper-nedir"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=24601"}],"version-history":[{"count":133,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24601\/revisions"}],"predecessor-version":[{"id":24759,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24601\/revisions\/24759"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/24620"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=24601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=24601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=24601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}