0

Hướng dẫn chi tiết cách cài đặt và chạy Debezium với Kafka, PostgreSQL trên Docker

Nếu các bạn chưa biết Debezium là gì thì có thể theo dõi bài viết này trước: https://viblo.asia/p/gioi-thieu-ve-debezium-y3RL1wMp4ao

Công cụ cần thiết:

  • Docker
  • Docker compose

Các bước cài đặt

1. Tạo file docker-compose.yml

📌Tạo một thư mục, vào thư mục đó và tạo file docker-compose.yml:

version: '3.8'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    container_name: zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    ports:
      - "2181:2181"

  kafka:
    image: confluentinc/cp-kafka:latest
    container_name: kafka
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    ports:
      - "9092:9092"

  postgres:
    image: debezium/postgres:16-alpine
    container_name: postgres
    environment:
      POSTGRES_USER: debezium
      POSTGRES_PASSWORD: debezium
      POSTGRES_DB: testdb
    ports:
      - "5432:5432"

  debezium-connect:
    image: debezium/connect:2.5  # Sửa lại từ "latest" thành phiên bản cụ thể
    container_name: debezium-connect
    depends_on:
      - kafka
      - postgres
    environment:
      BOOTSTRAP_SERVERS: kafka:9092
      GROUP_ID: "1"
      CONFIG_STORAGE_TOPIC: debezium_connect_configs
      OFFSET_STORAGE_TOPIC: debezium_connect_offsets
      STATUS_STORAGE_TOPIC: debezium_connect_status
    ports:
      - "8083:8083"

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    depends_on:
      - kafka
    environment:
      KAFKA_CLUSTERS_0_NAME: local
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
    ports:
      - "8080:8080"

📌Lưu file này lại và chạy lệnh sau để khởi động Docker containers:

docker-compose up -d

2. Tạo table muốn CDC trong PostgreSQL

📌 Sau khi khởi động thành công, chúng ta sẽ vào PostgreSQL để tạo table . Ví dụ

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    product_name TEXT NOT NULL,
    status TEXT NOT NULL
);

📌 Kích hoạt Logical Replication cho PostgreSQL
Debezium sử dụng Logical Replication để theo dõi các thay đổi trong database. Do đó, chúng ta cần:
Bật chế độ logical replication trong PostgreSQL

ALTER SYSTEM SET wal_level = logical; #Cho phép PostgreSQL ghi lại dữ liệu thay đổi (change stream) dưới dạng logical, thay vì physical.
SELECT pg_reload_conf(); #Load lại cấu hình mà không cần restart database.

📌 Tạo publication cho các bảng cần theo dõi:
Tạo publication để chỉ định bảng nào cần theo dõi

CREATE PUBLICATION debezium_pub FOR TABLE orders; #Chỉ định rằng chỉ cần theo dõi bảng orders

3. Cấu hình Debezium để theo dõi PostgreSQL

Mở Gitbash lên và chạy curl :

curl -X POST "http://localhost:8083/connectors" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "postgres-connector",
    "config": {
      "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
      "database.hostname": "postgres",
      "database.port": "5432",
      "database.user": "debezium",
      "database.password": "debezium",
      "database.dbname": "testdb",
      "database.server.name": "postgres_server",
      "table.include.list": "public.orders",
      "plugin.name": "pgoutput",
      "slot.name": "debezium_slot",
      "publication.name": "debezium_pub",
      "database.history.kafka.bootstrap.servers": "kafka:9092",
      "database.history.kafka.topic": "schema-changes",
      "topic.prefix": "dbserver1" #tạo topic với prefix là dbserver1
    }
  }'

4. Thử nghiệm thêm dữ liệu

📌 Mở terminal và truy cập PostgreSQL:

docker exec -it postgres psql -U debezium -d testdb

insert vào bảng order

INSERT INTO orders (product_name, status) VALUES ('Laptop', 'PENDING');

5. Kiểm tra dữ liệu trên Kafka

📌 Mở Kafka UI tại 👉 http://localhost:8080

📌 Chọn topic postgresserver.public.orders để xem dữ liệu. Đây là topic mà debezium publish message lên : image.png

Và đây là thành quả : image.png

Các bạn cũng có thể custom lại được message này trước khi publish message lên topic.


Tớ sẽ hướng dẫn mọi người cách custom message ở bài sau.
Nếu các bạn có bất kỳ thắc mắc nào hãy comment ở bên dưới mình sẽ giải đáp. 😁😁😁😁


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí