环境配置:
1、kafka 2.8.0
2、debezium 1.9.0
3、oracle 11g
1、oracle环境配置
该步骤参考我的上篇文章 https://blog.csdn.net/qq_36039236/article/details/124235751?spm=1001.2014.3001.5502
本章节继续针对FAMILY.STUDENT_INFO表进行操作。
2、kafka connect配置
kafka内部集成了kafka connect, 只需要下载对应的debezium-oracle插件,配置connect-distributed.properties 配置文件即可。
debezium-oracle插件下载地址
然后配置connect-distributed.properties的plugin.path, 解压对应的插件,配置对应的插件路径即可, 另外需要下载ojdbc8.jar放到kafka的lib目录下。
3、启动kafka以及kafka connect
启动命令:
# 启动zookeeper
zkServer.sh start
# 启动kafka
./bin/kafka-server-start.sh -daemon ./config/server.properties
# 启动kafka-connect
./bin/connect-distributed.sh -daemon ./config/connect-distributed.properties
查看进程:
查看加载的插件:
# 获取connector插件信息
curl http://localhost:8083/connector-plugins
4、创建oracle source
命令如下:
curl -H "Content-Type: application/json" -X POST -d '{
"name": "source333",
"config": {
"connector.class" : "io.debezium.connector.oracle.OracleConnector",
"tasks.max" : "1",
"database.server.name" : "oracle_service",
"database.hostname" : "localhost",
"database.port" : "1521",
"database.user" : "family",
"database.password" : "zyhcdc",
"database.dbname" : "helowin",
"table.include.list": "family.student_info",
"database.history.kafka.bootstrap.servers" : "localhost:9092",
"database.history.kafka.topic": "schema-changes.inventory222",
"event.processing.failure.handling.mode": "skip",
"log.mining.strategy":"online_catalog",
"database.serverTimezone":"UTC",
"database.serverTimezone":"Asia/Shanghai"
}
}' http://localhost:8083/connectors/
查看任务执行状态:
curl http://localhost:8083/connectors/source333/status
查看Kafka topic列表:
./bin/kafka-topics.sh --list --zookeeper localhost:2181/kafka28
发现增加了三个topic, 其中oracle_service.FAMILY.STUDENT_INFO记录的是 FAMILY.STUDENT_INFO表的ddl变更数据,schema-changes.inventory222 记录的是 FAMILY.STUDENT_INFO表的元数据变更信息。
创建对应topic的消费者:
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic oracle_service.FAMILY.STUDENT_INFO --from-beginning
获取到了表中原有的变更记录。
下面对表执行以下操作,观察获取到的数据变化:
-- 新增一条数据
insert into student_info (sno, sname, sex)
values (29, 'zyh-test', 'm');
-- 更新数据
update student_info t set t.sname='zyh666', t.sex='m' where t.sno=23;
-- 删除数据
delete from student_info where sno = 26;
验证更改表结构,是否对采集数据产生影响:
-- 增加一个字段
ALTER TABLE student_info ADD (age integer default 22 not null);
-- 新增一条记录
insert into student_info (sno, sname, sex, age)
values (30, 'zyh-888', 'm', 18);
发现增加了字段之后,数据记录这里并没有获取到新字段的值,如何处理???留个问题给小伙伴下去自己探索一下,这里不再赘述,后续进行补充
验证更新字段名称,是否造成影响:
alter table student_info rename column sname to stu_name;
-- 新增一条记录
insert into student_info (sno, stu_name, sex, age)
values (31, 'zyh-999', 'm', 18);
发现变更字段名称对获取变更记录并没有造成影响。
5、相关问题处理
1、Oracle JDBC 驱动版本一定要是8
如果oracle jdbc的驱动版本不对,会出现一系列的连接失败异常以及找不到对应的表异常。
2、数字类型解析到kafka格式异常
decimal类型的数字到kafka中格式出现异常
查阅官方文档 , 得知Debezium默认使用java.math.BigDecimal以二进制形式精确表示值。
解决:连接器参数添加
"decimal.handling.mode": "string"
3、Debezium捕获Oracle数据延迟大
成功跑起来Debezium并捕获到了数据,但是发现捕获数据的延迟过大,常常需要2-5分钟后数据库变更数据才会进入kafka中。
查阅官方文档
解决:连接器参数添加
"log.mining.strategy":"online_catalog"
4、Debezium时间戳相比数据库多了8小时
Debezium 默认将所有时间戳字段转换为 UTC,所以会导致时间与本地相差了8小时。搜索网络上的解决方案,通过添加以下连接器参数均无效
"database.serverTimezone":"UTC"
"database.serverTimezone":"Asia/Shanghai"
解析相关变更记录时需要注意。
总结
自此,以上操作已经全部完成了,小伙伴可以根据工作需要选择对应的解决方案,总体体验上还是觉得flink cdc更加得方便,好了,就到这里,希望感兴趣的小伙伴能够点个关注,一起交流学习~