一、Debezium介绍
Debezium是用于捕获变更数据的开源工具。可以响应数据库的所有插入,更新和删除操作.
它是一种CDC(Change Data Capture)工具,工作原理与大家所熟知的Canal, Maxwell一样,均是通过抽取数据库日志来获取变更的。
Debezium构建在Apache Kafka之上,并提供Kafka连接器来监视特定的数据库管理系统。
更多介绍参考官网: https://debezium.io/
二、Debezium特点
- 简单. 使用简单, 容易上手
- 快速稳定. 构建于Kafka之上, 可扩展,经官方验证可处理大容量的数据。
- 能监控多种数据库. 目前支持的数据库包括Mysql, Oracle, MongoDB, PostgreSQL, SQL Server, Db2, Cassandra, Vitess.
三、Debezium架构
3.1 基于Kafka Connector 部署Debezium

Kafka连接器包含两种:
-
source connector: 负责把数据库中的记录发送到Kafka(Debezium)
-
sink connector: 负责把kafka topic中的数据发送到其他系统,如es等(flume等)
3.2 使用Debezium Server部署Debezium
Debezium 服务器是一个可配置的、随时可用的应用程序,它将变化数据从源数据库流式传输到其他系统.(目前只支持sink到kinesis)

3.3 嵌入式引擎
另外一种使用方式:Debezium作为嵌入式引擎, 内置到其他应用中, 然后就可以实时读取数据库的变化数据了.目前比较火的 Flink的CDC, 就是内置了Debezium.
四、Kafka 4.0 + Debezium 3.2 实时 CDC 集成
4.1 环境说明
- Kafka 版本:4.0.0(自带 connect-distributed.sh )
- Debezium 版本:3.2.0(MySQL connector)
- MySQL:xx.xx.xx.xxx 端口 3306(5.7.44版本)
- 目标:把 mydb 的所有表实时同步到 Kafka topic,前缀为 dbserver1
4.2 前期准备
给 debezium 用户授权允许 xx.xx.xx.% 网段 在 MySQL 主机(xx.xx.xx.xx1)以 root 执行:
-- 登录MySQL
mysql -uroot -p
-- binlog 格式
SET GLOBAL binlog_format = ROW;
-- 如果用户还不存在,先创建
CREATE USER 'debezium'@'xx.xx.xx.%' IDENTIFIED BY 'xxxxxx';
-- 授权
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'xx.xx.xx.%';
--刷新
FLUSH PRIVILEGES;
确认连通:
mysql -hxx.xx.xx.xx -udebezium -p'xxxxxxx' -e "SELECT 1;"
4.3两种部署方式
4.3.1 第一种方法:
4.3.1.1部署 Debezium 插件(xx.xx.xx1)
cd ~/kafka_2.13-4.0.0
#将在官网下载的jar包上传至kafka的目录下
tar -xf debezium-connector-mysql-3.2.0.Final-plugin.tar.gz -C ~/kafka_2.13-4.0.0/connect-plugins/debezium
备份connect-distributed.properties
cp config/connect-distributed.properties config/debezium-distributed.properties
启动 Kafka Connect
bin/connect-distributed.sh -daemon config/debezium-distributed.properties
4.3.1.2 创建 Debezium Source Connector
创建mysql-source.json:
cat > mysql-source.json <<'EOF'
{
"name": "mysql-source",
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"tasks.max": "1",
"database.hostname": "xx.xx.xx.xx",
"database.port": "3306",
"database.user": "debezium",
"database.password": "xxxxxxx",
"database.server.id": "184054",
"topic.prefix": "dbserver1",
"database.include.list": "mydb",
"schema.history.internal.kafka.bootstrap.servers": "xx.xx.xx.xx1:9092,xx.xx.xx.xx2:9092,xx.xx.xx3:9092",
"schema.history.internal.kafka.topic": "dbhistory-mydb"
}
}
EOF
手动创建 schema-history topic(避免 compacted 坑):
bin/kafka-topics.sh --bootstrap-server xx.xx.xx.xx1:9092 \
--create --topic dbhistory-mydb \
--partitions 1 --replication-factor 2
注册并启动
curl -X POST -H "Content-Type: application/json" \
http://localhost:8083/connectors \
-d @mysql-source.json
验证运行
查看状态
curl http://localhost:8083/connectors/mysql-source/status
期望:connector & task 均为 RUNNING
查看生成的 topic
bin/kafka-topics.sh --bootstrap-server xx.xx.xx.xx1:9092 --list | grep dbserver1
# 示例:
# dbserver1
# dbhistory-mydb
# dbserver1.mydb.orders

4.3.1.3 在 MySQL 里创建 mydb
-- 在 xx.xx.xx 上登录 root 或具备建库权限的账号
mysql -uroot -p
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE test_orders (
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(10,2),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO test_orders (amount) VALUES (99.9);
--确认表存在
mysql -hxx.xx.xx.xx -udebezium -p'xxxxxx' -e "USE mydb; SHOW TABLES;"

查看生成的 topic
bin/kafka-topics.sh --bootstrap-server xx.xx.xx.xx1:9092 --list | grep dbserver1
实时消费验证
bin/kafka-console-consumer.sh \
--bootstrap-server xx.xx.xx.xx1:9092 \
--topic dbserver1.mydb.test_orders \
--from-beginning --max-messages 1

4.3.2第二种方法(推荐):
4.3.2.1部署 Debezium 插件(xx.xx.xx.xx1)
官方文档下载 Debezium (3.2)
cd ~/kafka_2.13-4.0.0
# 将在官网下载的jar包上传至kafka的目录下
tar -xf debezium-connector-mysql-3.2.0.Final-plugin.tar.gz -C ~/kafka_2.13-4.0.0/connect-plugins/debezium
4.3.2.2配置 Kafka Connect(Standalone 模式)
在所有节点上编辑 Kafka Connect 的 standalone 配置文件:
vim /home/bigdata/kafka_2.13-4.0.0/config/connect-standalone.properties
添加以下内容:
bootstrap.servers=xx.xx.xx.xx1:9092,xx.xx.xx.xx2:9092,xx.xx.xx.xx3:9092
plugin.path=/home/bigdata/kafka_2.13-4.0.0/connect-plugins/debezium
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
offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=10000
4.3.2.3创建 Debezium MySQL Connector 配置文件
在任意节点(建议主节点:xx.xx.xx.xx1)创建:
vim /home/bigdata/kafka_2.13-4.0.0/config/mysql-debezium-connector.properties
内容如下(请根据实际 MySQL 信息修改)
name=mysql-source-connector
connector.class=io.debezium.connector.mysql.MySqlConnector
tasks.max=1
# MySQL 连接信息
database.hostname=xx.xx.xx.xx
database.port=3306
database.user=debezium
database.password=xxxxxx
# 必填
topic.prefix=mysql-source
database.server.id=184054
# 仅同步 mysql 库
database.include.list=debezium_test
# Schema history(Debezium 2.x+ 必填)
schema.history.internal.kafka.topic=schema-history.mysql-source
schema.history.internal.kafka.bootstrap.servers=xx.xx.xx.xx1:9092,xx.xx.xx.xx2:9092,xx.xx.xx.xx3:9092
include.schema.changes=true
4.3.2.4启动 Kafka Connect
#进入目录
cd /home/bigdata/kafka_2.13-4.0.0
nohup bin/connect-standalone.sh \
config/connect-standalone.properties \
config/mysql-debezium-connector.properties \
\> logs/connect-standalone.out 2>&1 &
验证 Connector 状态
curl -s http://localhost:8083/connectors/mysql-source-connector/status
Kafka 端:确认 topic 已生成
4.3.2.5测试
在 MySQL 里创建 debezium_test:
-- 在 xx.xx.xx.xx 上登录 root 或具备建库权限的账号
mysql -uroot -p
CREATE DATABASE debezium_test;
USE debezium_test;
-- 如表不存在先建
CREATE TABLE IF NOT EXISTS test_user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
-- 插入
INSERT INTO test_user(name) VALUES ('Alice');
COMMIT;
消费变更事件
bin/kafka-console-consumer.sh \
--bootstrap-server xx.xx.xx.xx1:9092 \
--topic mysql-source.debezium_test.test_user \
--from-beginning \
--property print.key=true \
--property print.value=true
(“op”:“c” 表示 insert):

再测 UPDATE / DELETE
UPDATE test_user SET name='Bob' WHERE id=1;
DELETE FROM test_user WHERE id=1;
消费者会依次看到:
- “op”:“u” (更新)

- “op”:“d” (删除)

1571



被折叠的 条评论
为什么被折叠?



