$type=ticker$cols=4

$type=slider$meta=0$snip=0$rm=0

Membangun Pipeline CDC PostgreSQL ke Apache Kafka KRaft dengan Debezium

Arsitektur data modern menuntut integrasi data bernilai bisnis tinggi secara real-time dari database transaksional (OLTP) ke sistem analit...

Ilustrasi AI infrastruktur server pipeline CDC

Arsitektur data modern menuntut integrasi data bernilai bisnis tinggi secara real-time dari database transaksional (OLTP) ke sistem analitik hilir, data lakehouse, dan microservices. Pendekatan integrasi data konvensional berbasis polling query periodik (SELECT * WHERE updated_at > ...) memiliki kelemahan mendasar: menimbulkan lonjakan latensi, risiko query locking, dan pemborosan CPU pada database sumber. Change Data Capture (CDC) berbasis log transaksi menawarkan pendekatan efisien dengan membaca mutasi data langsung dari Write-Ahead Log (WAL) PostgreSQL, meminimalkan query locking kendati proses decoding WAL tetap membutuhkan alokasi CPU, I/O, dan kapasitas disk server.

Dengan transisi ekosistem Apache Kafka menuju mode KRaft (Kafka Raft Metadata mode) yang mengeliminasi dependensi Apache ZooKeeper, arsitektur streaming kini menjadi jauh lebih ramping dan mudah dikelola. Artikel ini menyajikan panduan teknis langkah demi langkah untuk membangun pipeline CDC real-time dari PostgreSQL 16 menuju kluster Apache Kafka 3.8 (KRaft mode) menggunakan Debezium Connector 2.7 pada lingkungan lab pengujian terisolasi.

1. Konsep Arsitektur CDC Berbasis WAL dan KRaft Mode

Sebelum masuk ke tahap konfigurasi, penting untuk memahami bagaimana data bermutasi dan mengalir melalui lapisan-lapisan pipeline:

Topologi Aliran Data CDC:

[Aplikasi OLTP] --(DML SQL)--> [PostgreSQL 16 Engine] --(Tulis WAL)--> [pgoutput Plugin] --(Logical Decoding)--> [Replication Slot] --(Streaming)--> [Debezium 2.7 Connect] --(JSON/Avro Envelope)--> [Kafka KRaft Broker] --(Internal 29092)--> [Consumer Container]

  • PostgreSQL Write-Ahead Logging (WAL): Setiap transaksi INSERT, UPDATE, atau DELETE dicatat ke file WAL sebelum ditulis ke tabel data. Pada tingkat wal_level = logical, informasi baris data disimpan secara terperinci sehingga dapat didekode menjadi aliran perubahan logis.
  • Plugin pgoutput: Plugin bawaan PostgreSQL sejak versi 10 yang mendekode perubahan WAL langsung ke format streaming standar tanpa memerlukan kompilasi ekstensi pihak ketiga.
  • Debezium Connect 2.7: Menjalankan task Kafka Connect yang mengonsumsi stream dari replication slot PostgreSQL dan menerjemahkannya menjadi Kafka event messages.
  • Apache Kafka KRaft Mode: Menghilangkan kebutuhan kluster eksternal ZooKeeper. Konsensus metadata kluster, penugasan partisi, dan pemilihan controller dikelola secara internal menggunakan protokol konsensus Raft terdistribusi.

2. Konfigurasi Sumber Data (PostgreSQL 16)

Langkah awal adalah mengonfigurasi mesin PostgreSQL agar mendukung logical replication, mengatur autentikasi jaringan, serta menerapkan prinsip least-privilege untuk user CDC.

2.1 Parameter postgresql.conf

Buka berkas postgresql.conf dan pastikan parameter replikasi logis berikut disetel:

# Mengaktifkan level informasi logis pada Write-Ahead Log
wal_level = logical

# Jumlah maksimum replication slot yang dapat dialokasikan (sesuaikan kebutuhan konektor)
max_replication_slots = 5

# Jumlah maksimum proses walsender yang berjalan bersamaan
max_wal_senders = 5

# Batas retensi WAL yang ditahan oleh replication slot sebelum di-invalidasi
# CATATAN: Parameter ini bertindak sebagai safety-valve per-slot dan BUKAN jaminan mutlak anti-disk full
max_slot_wal_keep_size = 8192MB
Penting Mengenai max_slot_wal_keep_size:

Parameter max_slot_wal_keep_size menetapkan ambang batas akumulasi WAL oleh suatu replication slot tertentu. Namun, parameter ini bukan hard cap kapasitas disk server dan bukan jaminan mutlak mencegah kehabisan kapasitas disk (disk exhaustion). Jika laju penulisan transaksi sangat tinggi sebelum checkpoint dieksekusi, atau bila proses archiving WAL eksternal (archive_command) mengalami kemacetan, partisi disk tetap berisiko penuh. Selain itu, jika batas ini terlampaui, PostgreSQL akan membatalkan slot (wal_status = 'lost') demi menyelamatkan ketersediaan database, yang berakibat konektor Debezium gagal dan menuntut prosedur snapshot ulang.

2.2 Konfigurasi Izin Akses Jaringan pada pg_hba.conf

PostgreSQL membedakan koneksi database standar (untuk query relasional katalog skema) dengan koneksi streaming replikasi melalui walsender. Pada berkas pg_hba.conf, kata kunci replication pada kolom database merupakan kata kunci protokol khusus tingkat kluster fisik untuk walsender, bukan nama database relasional logis. Debezium membutuhkan kedua jenis izin akses tersebut:

# /etc/postgresql/16/main/pg_hba.conf
# 1. Izinkan koneksi relasional reguler ke database target untuk query katalog metadata
host    enterprise_db   cdc_debezium    <CIDR_SUBNET_LAB>       scram-sha-256

# 2. Izinkan koneksi protokol streaming replikasi fisik/kluster (walsender)
host    replication     cdc_debezium    <CIDR_SUBNET_LAB>       scram-sha-256
Catatan Jaringan dan Subnet:

Nilai <CIDR_SUBNET_LAB> (misalnya 172.18.0.0/16 pada bridge Docker tertentu) bukanlah subnet universal. Subnet dan gateway alokasi Docker berbeda di setiap mesin host tergantung pada urutan pembuatan network dan konfigurasi daemon. Pastikan untuk memeriksa CIDR bridge aktual Anda (misalnya via docker network inspect bridge) atau gunakan IP host tepercaya.

Setelah mengedit kedua berkas tersebut, muat ulang konfigurasi PostgreSQL:

sudo systemctl restart postgresql

2.3 Urutan DDL Tabel, Hak Akses (Least Privilege), dan Publikasi

Untuk menghindari kegagalan otorisasi, tabel target harus dibuat terlebih dahulu sebelum hak akses (GRANT) diberikan. Selanjutnya, gunakan ALTER DEFAULT PRIVILEGES secara eksplisit untuk role pemilik objek agar tabel masa depan otomatis dapat diakses oleh user CDC.

-- Masuk ke database target: enterprise_db
\c enterprise_db

-- 1. Buat role cdc_debezium dengan atribut REPLICATION
-- PENTING: Ganti placeholder <POSTGRES_CDC_PASSWORD> dengan kredensial rahasia yang kuat
CREATE USER cdc_debezium WITH REPLICATION PASSWORD '<POSTGRES_CDC_PASSWORD>';
GRANT CONNECT ON DATABASE enterprise_db TO cdc_debezium;

-- 2. Buat tabel transaksi TERLEBIH DAHULU sebelum mengeksekusi perintah GRANT
CREATE TABLE IF NOT EXISTS public.customer_transactions (
    id SERIAL PRIMARY KEY,
    customer_id INT NOT NULL,
    amount NUMERIC(12, 2) NOT NULL,
    status VARCHAR(30) DEFAULT 'PENDING',
    created_at TIMESTAMPTZ DEFAULT clock_timestamp()
);

-- Atur REPLICA IDENTITY FULL agar WAL mencatat nilai baris lengkap sebelum mutasi (before) saat UPDATE/DELETE
ALTER TABLE public.customer_transactions REPLICA IDENTITY FULL;

-- 3. Berikan izin baca (SELECT) pada skema dan tabel yang telah dibuat
GRANT USAGE ON SCHEMA public TO cdc_debezium;
GRANT SELECT ON TABLE public.customer_transactions TO cdc_debezium;

-- 4. Atur ALTER DEFAULT PRIVILEGES untuk role postgres (atau role pemilik tabel)
-- agar tabel baru yang dibuat di masa mendatang otomatis memberikan izin SELECT ke cdc_debezium
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public 
    GRANT SELECT ON TABLES TO cdc_debezium;

-- 5. Buat publikasi replikasi secara eksplisit (Best Practice Least-Privilege)
CREATE PUBLICATION debezium_pg_pub FOR TABLE public.customer_transactions;

3. Penerapan Kafka KRaft dan Debezium Connect (Docker Lab Terisolasi)

Pada arsitektur lab terisolasi ini, kita menjalankan broker Apache Kafka dengan controller internal berbasis KRaft dan kontainer Debezium Connect.

Batasan Keamanan Lingkungan Lab:

Konfigurasi di bawah ini dirancang khusus untuk lingkungan lab pengujian lokal terisolasi. Port host di-bind secara eksplisit ke antarmuka loopback 127.0.0.1 agar tidak terekspos ke jaringan publik. Protokol PLAINTEXT dan HTTP REST tanpa enkripsi tidak boleh digunakan di lingkungan produksi multi-tenant. Lingkungan produksi wajib menerapkan enkripsi TLS/mTLS, autentikasi SASL/SCRAM, serta pembatasan akses firewall/reverse-proxy pada REST API Kafka Connect.

3.1 Berkas docker-compose.yml

Simpan konfigurasi berikut sebagai docker-compose.yml:

version: '3.8'

services:
  kafka:
    image: apache/kafka:3.8.0
    container_name: kafka-kraft
    ports:
      - "127.0.0.1:9092:9092"   # Loopback host binding untuk pengujian klien lokal
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: INTERNAL://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:29092,EXTERNAL://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_LOG_RETENTION_HOURS: 168
    volumes:
      - kafka-data:/var/lib/kafka/data
    restart: unless-stopped

  debezium:
    image: debezium/connect:2.7.3.Final
    container_name: debezium-connect
    depends_on:
      - kafka
    ports:
      - "127.0.0.1:8083:8083"   # Loopback host binding untuk Kafka Connect REST API
    environment:
      BOOTSTRAP_SERVERS: kafka:29092
      GROUP_ID: 1
      CONFIG_STORAGE_TOPIC: _connect_configs
      OFFSET_STORAGE_TOPIC: _connect_offsets
      STATUS_STORAGE_TOPIC: _connect_statuses
      CONFIG_STORAGE_REPLICATION_FACTOR: 1
      OFFSET_STORAGE_REPLICATION_FACTOR: 1
      STATUS_STORAGE_REPLICATION_FACTOR: 1
      KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      KEY_CONVERTER_SCHEMAS_ENABLE: "false"
      VALUE_CONVERTER_SCHEMAS_ENABLE: "false"
    volumes:
      - debezium-data:/kafka/data
    restart: unless-stopped

volumes:
  kafka-data:
  debezium-data:

Jalankan stack kontainer lab dan verifikasi kesiapan endpoint Kafka Connect:

# Menjalankan kontainer di latar belakang
docker compose up -d

# Periksa status kesiapan endpoint REST Kafka Connect (port 8083 pada loopback)
curl -s http://127.0.0.1:8083/ | jq .

4. Mendaftarkan Debezium PostgreSQL Connector

Pendaftaran konektor dilakukan dengan mengirimkan payload JSON melalui HTTP POST ke REST API Kafka Connect. Debezium akan terhubung ke PostgreSQL, memvalidasi publication, dan membuat replication slot bernama debezium_pg_slot.

4.1 Registrasi Payload JSON Connector melalui REST API

curl -X POST -H "Content-Type: application/json" --data '{
  "name": "pg-transactions-cdc",
  "config": {
    "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
    "tasks.max": "1",
    "plugin.name": "pgoutput",
    "database.hostname": "<DOCKER_GATEWAY_OR_HOST_IP>",
    "database.port": "5432",
    "database.user": "cdc_debezium",
    "database.password": "<POSTGRES_CDC_PASSWORD>",
    "database.dbname": "enterprise_db",
    "topic.prefix": "cdc_prod",
    "table.include.list": "public.customer_transactions",
    "slot.name": "debezium_pg_slot",
    "publication.name": "debezium_pg_pub",
    "publication.autocreate.mode": "disabled",
    "decimal.handling.mode": "string",
    "tombstones.on.delete": "false"
  }
}' http://127.0.0.1:8083/connectors
Penjelasan Parameter Kunci:
  • database.hostname: Masukkan alamat IP gateway antarmuka Docker bridge atau IP host PostgreSQL yang dapat dijangkau dari dalam kontainer. Perlu diingat bahwa alamat gateway subnet bukan universal; periksa rute gateway aktual mesin Anda (misal via ip route atau docker network inspect).
  • tasks.max: PostgreSQL logical decoding dibatasi 1 task per replication slot untuk menjamin urutan event mutasi data.
  • publication.autocreate.mode: Disetel ke disabled karena publikasi debezium_pg_pub telah dikelola dan dibuat secara eksplisit oleh DBA.
  • decimal.handling.mode: Disetel ke string. Nilai double dapat memicu ketidaktepatan presisi floating-point pada kalkulasi moneter. Opsi string menjaga integritas angka desimal tanpa pembulatan tidak terduga.

4.2 Verifikasi Status Kesehatan Konektor

Pastikan konektor dan task berada dalam status RUNNING:

# Periksa status detail worker dan task konektor
curl -s http://127.0.0.1:8083/connectors/pg-transactions-cdc/status | jq .

5. Verifikasi Replikasi Event Mutasi Data

Lakukan simulasi manipulasi data pada database sumber untuk menguji tangkapan event secara komprehensif pada operasi INSERT, UPDATE, dan DELETE.

5.1 Uji Simulasi DML (INSERT, UPDATE, DELETE)

Jalankan transaksi pengujian di PostgreSQL:

-- 1. Eksekusi transaksi INSERT (Pembuatan baris baru)
INSERT INTO public.customer_transactions (customer_id, amount, status) 
VALUES (101, 750000.00, 'PAID');

-- 2. Eksekusi transaksi UPDATE (Modifikasi baris yang ada)
UPDATE public.customer_transactions 
SET status = 'COMPLETED', amount = 745000.00 
WHERE customer_id = 101;

-- 3. Eksekusi transaksi DELETE (Penghapusan baris)
DELETE FROM public.customer_transactions 
WHERE customer_id = 101;

5.2 Konsumsi Topik Kafka

Untuk mengonsumsi event streaming dari dalam jaringan kontainer Docker, consumer wajib menggunakan listener internal kafka:29092:

# Konsumsi topik dari dalam kontainer Kafka (menggunakan listener internal kafka:29092)
docker compose exec kafka /opt/kafka/bin/kafka-console-consumer.sh \
  --bootstrap-server kafka:29092 \
  --topic cdc_prod.public.customer_transactions \
  --from-beginning

# Catatan: Bila mengonsumsi dari aplikasi klien pada host lokal mesin (luar kontainer),
# gunakan antarmuka loopback yang diekspos: --bootstrap-server 127.0.0.1:9092

5.3 Struktur Envelope JSON Debezium

Debezium menghasilkan struktur envelope standar yang memuat status sebelum mutasi (before), status setelah mutasi (after), identifier operasi (op), serta metadata posisi log transaksi (lsn, txId). Karakteristik representasi tiap operasi mutasi adalah sebagai berikut:

  • Operasi Create (INSERT): Menghasilkan op: "c". Blok before bernilai null, dan blok after berisi data baris baru yang di-insert.
  • Operasi Update (UPDATE): Menghasilkan op: "u". Blok before memuat nilai baris lama (tersedia lengkap berkat pengaturan REPLICA IDENTITY FULL), dan blok after memuat nilai baris terbaru setelah pembaruan.
  • Operasi Delete (DELETE): Menghasilkan op: "d". Blok before memuat data baris terakhir sebelum dihapus, dan blok after bernilai null.

Contoh struktur payload envelope JSON pada operasi UPDATE (dengan nilai skema sederhana tanpa converter schemas):

{
  "before": {
    "id": 1,
    "customer_id": 101,
    "amount": "750000.00",
    "status": "PAID",
    "created_at": 1700000000000000
  },
  "after": {
    "id": 1,
    "customer_id": 101,
    "amount": "745000.00",
    "status": "COMPLETED",
    "created_at": 1700000000000000
  },
  "source": {
    "version": "2.7.3.Final",
    "connector": "postgresql",
    "name": "cdc_prod",
    "ts_ms": 1700000010000,
    "db": "enterprise_db",
    "schema": "public",
    "table": "customer_transactions",
    "txId": 1002,
    "lsn": 248902848
  },
  "op": "u",
  "ts_ms": 1700000010050
}

5.4 Mitigasi Bahaya WAL Bloat dan Disk Exhaustion

Replication slot di PostgreSQL menahan segmen file WAL di disk agar tidak dihapus hingga Debezium mengonfirmasi (ACK) posisi LSN yang telah berhasil diproses. Jika Debezium terhenti berhari-hari sementara transaksi database terus berjalan masif, direktori pg_wal dapat membengkak hingga menghabiskan seluruh sisa kapasitas disk server.

Pantau kesehatan slot replikasi secara periodik dengan query diagnostik berikut:

SELECT 
    slot_name, 
    plugin, 
    active, 
    wal_status, 
    pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal_bytes
FROM pg_replication_slots;

Jika kolom wal_status menunjukkan nilai extended atau unreserved, segera investigasi konektivitas Kafka Connect sebelum slot ter-invalidasi menjadi lost.

6. Hardening Keamanan Produksi dan Batasan Panduan

Sebelum menerapkan pipeline CDC ke lingkungan produksi multi-tenant, terapkan tiga pilar perlindungan operasional berikut:

6.1 Masking Data Sensitif (PII) dengan Single Message Transforms (SMT)

Hindari mengalirkan atribut sensitif (seperti data finansial rahasia atau identitas pribadi) ke broker Kafka secara mentah. Konfigurasikan SMT org.apache.kafka.connect.transforms.MaskField pada konfigurasi connector untuk menutupi atribut sensitif sebelum payload event meninggalkan memori worker.

6.2 Proteksi Kredensial dan Enkripsi Jaringan

Hindari menyertakan password secara plain-text dalam payload cURL. Manfaatkan framework Kafka Connect ConfigProvider (seperti DirectoryConfigProvider) untuk menginjeksikan variabel kredensial dari file berizin terbatas atau secrets management vault. Aktifkan enkripsi in-transit TLS dan autentikasi SASL SCRAM-SHA-512 untuk komunikasi jaringan non-localhost.

6.3 Isolasi Network Endpoint Kafka Connect REST API

Port 8083 mengekspos endpoint manajemen konfigurasi konektor. Batasi akses port 8083 hanya pada subnet administratif internal atau reverse proxy dengan proteksi autentikasi ketat agar pihak tidak berwenang tidak dapat mengubah konfigurasi koneksi database.

6.4 Ruang Lingkup dan Batasan Panduan

Catatan Transparansi Evaluasi: Konfigurasi dan sintaks logical replication pada artikel ini disusun mengacu pada dokumentasi resmi PostgreSQL 16, Debezium 2.7, dan Apache Kafka 3.8. Panduan ini berfokus pada arsitektur integrasi dasar dalam lingkungan lab pengujian lokal terisolasi. Metrik throughput throughput maksimum pesan per detik, latensi under-load, dan overhead CPU riil belum diuji secara empiris dalam panduan ini karena performa sangat bergantung pada karakteristik beban kerja (workload), spesifikasi storage I/O, serta kapasitas jaringan kluster. Selalu lakukan pengujian beban (load testing) mandiri pada lingkungan staging sebelum deployment produksi.

Referensi dan Sumber Resmi

COMMENTS

Name

1clickInstall,1,404,1,Access Management,1,Analytics Engineering,1,android,1,Ansible,1,Apache Airflow,1,Apache Flink,1,Apache Iceberg,1,Apache Kafka,1,Apache Parquet,1,Apache2,1,API Telegram,1,Apple,3,Automation,1,AWS,1,Backup,2,bapak internet indonesia,1,Big Data,7,blkid,1,booting,1,BorgBackup,1,brainware,1,calc,1,can't mount,3,can't read superblock,1,cara mengatasi disk failure,1,cara mengatasi disk penuh,1,cara mengatasi error disk,1,cara mengatasi error proxmox,1,cara mengatasi log full,1,centOS,1,Ceph,1,certificate,1,Chrome,1,Cilium,1,cinta sang penguasa,1,CLI,1,ClickHouse,1,Cloud,4,Cloud Computing,10,Cloud Native,1,Cloud Storage,6,Clustering,1,Codec,1,CodeIgniter,2,computare,4,computer,4,Container,1,Cybersecurity,13,dakwah,16,Data Engineering,9,Data Lineage,1,Data Mining,3,Data Quality,2,dbt,1,dd,1,Debezium,1,Debian,2,Deepin Linux,1,DevOps,8,DevSecOps,1,digital,1,Docker,13,dosa,1,dosa besar,1,DuckDB,2,eBPF,1,Enkripsi,1,era digital,1,error certificate,1,error path,1,error subscription,1,excel,1,failed subscription,1,Fedora,1,fedora26,1,Feeder,1,Firewall,1,fstab,1,ftp server,1,fujitsu,1,gambar,1,ghibah,1,Git,2,GitHub,2,gitignore,1,gitignore not work,1,Google,2,Google Chrome,1,Google Cloud,1,Google Drive,2,google-drive-ocamlfuse,1,Harbor,1,Harddisk,1,Hardware,1,Hashing,1,HCI,1,HDD,2,history,1,Homelab,1,host,1,Hostname,1,how to,2,IaC,1,IAM,1,igmp proxy,1,Ilmu Komputer,1,impress,1,indihome,1,INDUKSI MATEMATIKA,1,instalasi,3,install,10,install GIT,1,install linux,6,internet,2,islam,17,javascript,1,K-Means,1,K3s,1,Kafka,1,KDE Plasma,1,keamanan,1,Keamanan Cloud,2,keamanan data,1,Keamanan Jaringan,1,keynote,1,kodi,1,komputer,5,Kubernetes,3,kuliah,1,Lakehouse,1,Latte-dock,1,leap,7,leap 42.3,1,LibreOffice,1,Linux,64,linux ringan,3,Linux Server,2,Machine Learning,3,machintos,4,macOS,5,mageia,1,mandriva,1,mate,1,microsoft office,2,microsoft windows,4,microsoft word,1,Mikrotik,3,mint,1,Monitoring,1,mount,4,mounting,1,Multimedia Codec,1,Netwatch,1,network,1,network security,1,Networking,11,Nextcloud,1,Nginx,1,node js,1,NTFS,3,ntfsfix,2,numbers,1,office,5,OLAP,1,Online Account,1,onno,1,onnowpurbo,1,Open Source,3,OpenLineage,1,OpenMandriva,1,OpenOffice,2,openoffice calc,1,openoffice writer,1,openSUSE,11,operating system,1,OPNsense,1,ownCloud,1,ownCloud Client,1,PAGES,1,PDDikti,1,pemikir islam,1,pengguna,1,perangkat keras,1,Perangkat Lunak,2,PHP,1,PHP 5,1,PKI,1,Polars,1,port 80,1,port 8082,1,postel sevice award,1,PostgreSQL,1,Powerpoint,1,presentasi,1,presentation,1,Privacy,1,Proxmox,16,PVE,1,Python,3,q4os,1,Redpanda,1,remaja islam,2,review,7,rezeki,1,s1300i,1,scanner,1,scansnap,1,Security,12,sejarah,1,Server,23,setting,1,Sistem Operasi,2,Software,2,spreadsheet,1,SQL,1,SSH,2,SSO,1,stb,1,Storage,8,Stream Processing,1,sukses dunia akhirat,1,Sysadmin,18,systemd,1,Tailscale,1,Telegram,1,Teleport,1,telkom,1,tesseract,1,text,1,Trino,1,Tutorial,31,tv box,1,Ubuntu,3,Unsupervised Learning,1,usb drive,1,useetv,1,user,1,VBA,1,version control,1,virtual machine,2,Virtualization,4,Visual basic,1,Visual Basic for Applications,1,VLC,2,VLC Media Player,1,VPN,1,vsftpd,1,Wazuh,1,whatsapp api,1,winbox,1,Windows,7,Windows 7,1,word,1,WORD PROCESSOR,2,workstation,1,WPS Office,1,Zero Trust,1,zypper,1,
ltr
item
zhato TECH: Membangun Pipeline CDC PostgreSQL ke Apache Kafka KRaft dengan Debezium
Membangun Pipeline CDC PostgreSQL ke Apache Kafka KRaft dengan Debezium
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkVRUVNFGy1enNsHRQgoQxfSx0BJ1HxeZK8bH3cx5Zv1KBJf-IWw0Q6QHS_ry6k4bt2nrdqznNeEpSLLKSQutbvqX2_HCs25vF_0GDp3ugr-Xi074zneksEeveYkIAHm0OAzt76Ocwo6Hdz3bzpRF5ZGK0RXA0_3-uPh1UWJB7f_Kzqis65he9lfYxFoY/s1600/image.webp
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkVRUVNFGy1enNsHRQgoQxfSx0BJ1HxeZK8bH3cx5Zv1KBJf-IWw0Q6QHS_ry6k4bt2nrdqznNeEpSLLKSQutbvqX2_HCs25vF_0GDp3ugr-Xi074zneksEeveYkIAHm0OAzt76Ocwo6Hdz3bzpRF5ZGK0RXA0_3-uPh1UWJB7f_Kzqis65he9lfYxFoY/s72-c/image.webp
zhato TECH
http://www.zhato-tech.id/2026/11/membangun-pipeline-cdc-postgresql-ke.html
http://www.zhato-tech.id/
http://www.zhato-tech.id/
http://www.zhato-tech.id/2026/11/membangun-pipeline-cdc-postgresql-ke.html
true
740282316614930842
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content