搬瓦工部署 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 上部署,你可以快速搭建实时数据管道。如果你还需要日志数据的收集和处理,可以参考 Vector 或 Fluentd 教程。选购搬瓦工 VPS 使用优惠码 NODESEEK2026 可享 6.77% 折扣。