搬瓦工部署 Debezium CDC 变更数据捕获教程

Debezium 是一款基于 Apache Kafka 的开源变更数据捕获(Change Data Capture, CDC)平台。它能够实时监控数据库的变更操作(INSERT、UPDATE、DELETE),并将这些变更事件以流的形式发送到 Kafka 主题中。Debezium 广泛应用于数据同步、事件驱动架构、审计日志和缓存失效等场景。本文将介绍如何在搬瓦工 VPS 上部署完整的 Debezium CDC 环境。部署前请确保已安装 Docker 和 Docker Compose

一、CDC 工作原理

传统的数据同步方式(如定时查询)存在延迟高、数据库负载大等问题。CDC 通过读取数据库的事务日志来捕获变更,具有以下优势:

  • 实时性:变更发生后毫秒级捕获。
  • 低侵入性:读取日志不会影响数据库性能。
  • 完整性:能捕获所有变更,包括删除操作。
  • 顺序保证:保持变更事件的原始顺序。

二、系统要求

  • 操作系统:Ubuntu 20.04+ 或 Debian 11+。
  • 内存:至少 4GB(Kafka + Debezium 内存需求较高)。
  • 磁盘:至少 20GB 可用空间。
  • Docker:已安装 Docker 和 Docker Compose。

建议选择搬瓦工高配方案,购买时使用优惠码 NODESEEK2026 可享 6.77% 折扣,购买入口:bwh81.net

三、创建项目目录

mkdir -p /opt/debezium && cd /opt/debezium

四、编写 Docker Compose 配置

cat > /opt/debezium/docker-compose.yml <<'EOF'
version: '3.8'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.5.0
    restart: always
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:7.5.0
    restart: always
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    depends_on:
      - zookeeper

  debezium-connect:
    image: debezium/connect:2.4
    restart: always
    ports:
      - "8083:8083"
    environment:
      BOOTSTRAP_SERVERS: kafka:29092
      GROUP_ID: debezium-connect
      CONFIG_STORAGE_TOPIC: debezium_configs
      OFFSET_STORAGE_TOPIC: debezium_offsets
      STATUS_STORAGE_TOPIC: debezium_statuses
      KEY_CONVERTER_SCHEMAS_ENABLE: "false"
      VALUE_CONVERTER_SCHEMAS_ENABLE: "false"
    depends_on:
      - kafka

  mysql:
    image: mysql:8.0
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: testdb
      MYSQL_USER: debezium
      MYSQL_PASSWORD: your_db_password
    command: --server-id=1 --log-bin=mysql-bin --binlog-format=ROW --binlog-row-image=FULL --gtid-mode=ON --enforce-gtid-consistency=ON
    volumes:
      - mysql_data:/var/lib/mysql

  debezium-ui:
    image: debezium/debezium-ui:2.4
    restart: always
    ports:
      - "8080:8080"
    environment:
      KAFKA_CONNECT_URIS: http://debezium-connect:8083
    depends_on:
      - debezium-connect

volumes:
  mysql_data:
EOF

五、启动服务

cd /opt/debezium
docker compose up -d

等待所有服务启动完成后,验证 Kafka Connect 状态:

curl http://localhost:8083/connectors

六、注册 MySQL 连接器

curl -X POST http://localhost:8083/connectors \
  -H "Content-Type: application/json" \
  -d '{
    "name": "mysql-connector",
    "config": {
      "connector.class": "io.debezium.connector.mysql.MySqlConnector",
      "database.hostname": "mysql",
      "database.port": "3306",
      "database.user": "debezium",
      "database.password": "your_db_password",
      "database.server.id": "1",
      "topic.prefix": "dbserver1",
      "database.include.list": "testdb",
      "schema.history.internal.kafka.bootstrap.servers": "kafka:29092",
      "schema.history.internal.kafka.topic": "schema-changes.testdb"
    }
  }'

七、验证 CDC 功能

向 MySQL 插入测试数据:

docker compose exec mysql mysql -udebezium -pyour_db_password testdb -e "
CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), email VARCHAR(100));
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
"

使用 Kafka 控制台消费者查看变更事件:

docker compose exec kafka kafka-console-consumer \
  --bootstrap-server kafka:29092 \
  --topic dbserver1.testdb.users \
  --from-beginning

八、使用 Debezium UI

访问 http://your_server_ip:8080 进入 Debezium UI,可以直观地查看连接器状态、任务分配和错误信息。

九、PostgreSQL 连接器配置

如果需要监控 PostgreSQL 数据库,首先确保目标数据库启用了逻辑复制:

# 在 postgresql.conf 中设置
wal_level = logical
max_replication_slots = 4
max_wal_senders = 4

然后注册 PostgreSQL 连接器:

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": "your_pg_host",
      "database.port": "5432",
      "database.user": "debezium",
      "database.password": "your_password",
      "database.dbname": "your_database",
      "topic.prefix": "pgserver1",
      "plugin.name": "pgoutput"
    }
  }'

十、常见问题

连接器状态为 FAILED

# 查看连接器详细状态
curl http://localhost:8083/connectors/mysql-connector/status | python3 -m json.tool

常见原因包括:数据库连接信息错误、binlog 未启用、权限不足等。

Kafka 磁盘空间增长过快

配置 Kafka 主题的数据保留策略:

docker compose exec kafka kafka-configs \
  --bootstrap-server kafka:29092 \
  --alter --topic dbserver1.testdb.users \
  --add-config retention.ms=604800000

总结

Debezium 是目前最成熟的开源 CDC 解决方案,在数据同步和事件驱动架构中扮演着核心角色。通过在搬瓦工 VPS 上部署,你可以快速搭建实时数据管道。如果你还需要日志数据的收集和处理,可以参考 VectorFluentd 教程。选购搬瓦工 VPS 使用优惠码 NODESEEK2026 可享 6.77% 折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。