
最近还没摸鱼几天呢,领导又给安排任务了,让我研究一下 Debezium 做一下数据库的 CDC 采集。Debezium?第一个念头就是好熟悉的名字,这不是两年前陪着研发交付 cdc 项目的时候,flink cdc 使用的底层技术吗,怎么回事,研发跑路了,开始让我来顶?

然后交流了一番,还好,这次不做 oracle 的 cdc 了,只做 MySQL 的就可以。还记得之前 oracle 的 PDB 和 CDB 模式,就卡了其他的同事好久(其实对于 Debezium 就几个参数的问题)。所以,这次 MySQL 的采集我觉得问题不大。
然后我就打开 Debezium 官网,找到 MySQL 章节开始阅读起来。

哦累哦累,全英文版本可是难不倒我 CET-4 水平,零帧起手,大概的意思就是:MySQL 有一个记录数据库变更的日志叫 binlog,Debezium 通过读取 binlog 来讲 row 级别的 insert、update、detele的变更事件发送到 Kafka 中。在 CDC 过程中,先对数据库做全量快照,然后再增量采集。
这样我们就了解到了大概,所以想对 MySQL CDC 采集就很简单了,总结一下:
首先查看一下 binlog 开启了没,通过 show master status 查看。

通常默认是开启的,如果没有开启的话,自己想办法努力开启一下。
因为只做测试只用,我们就在服务器上使用 docker 搭建一个单点的、无需依赖 zookeeper 的 Kafka 就可以了。如果又不知道安装的朋友,我阿柒也是早早就写好了安装部署教程:告别Zookeeper,两条命令容器化搭建Kafka
如果外网访问不了容器中的 Kafka,我也早有应对之法:一条指令,解决外网无法访问云服务器Kafka容器问题
为了进一步提升读者满意度,我直接将两篇文章的操作重构成一个脚本。
# 运行容器
docker run -d --name kafka -p 9092:9092 apache/kafka:3.9.1
# 修改配置文件
docker cp kafka:/etc/kafka/docker/server.properties .
sed -i '/advertised.listeners/s/localhost/49.233.20.15/' server.properties
docker cp server.properties kafka:/etc/kafka/docker/
docker restart kafka
# 下载客户端
wget https://dlcdn.apache.org/kafka/3.9.1/kafka_2.12-3.9.1.tgz
tar zxvf kafka_2.12-3.9.1.tgz如果你是在云服务器上安装:在执行上面脚本之前记得将 sed 命令中的 ip 改成你自己服务器的公网IP,上面 sed 主要是将 advertised.listeners 中的广播变量修改为公网IP,这样外网才可以访问。后面的IP可以使用 localhost,如果使用公网IP,则需要在 docker 运行容器的时候,映射9093这个端口,还要进行需改,所以我们这里就使用默认的localhost就行。

在执行脚本之后,记得去安全组放开 9092 端口,这样一个 KRaft 模式的 Kafka 单点服务容器就启动成功了。

上面的脚本下载了 Kafka 的客户端,我们就可以使用下面命令创建一个 topic,然后创建一个 producer。
# 创建topic
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic aqi_test --partitions 10 --replication-factor 1
# 查看topic
kafka-topics.sh --bootstrap-server localhost:9092 --list
# 生产数据
kafka-console-producer.sh --topic aqi_test --bootstrap-server localhost:9092然后向 topic 中写入数据。

我在本地电脑中开发了一个测试 SparkStreaming 程序,读取云服务器 Kafka 这个 topic 中刚刚写入的数据,如下图所示,就读取到了数据。

本篇文章完成了 Debezium CDC 的前两项的准备工作,下一篇将开发 Debezium CDC 程序,打通 MySQL采集 和写入 Kafka 的数据流程。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。