debezium 小试
2025-3-21
| 2025-3-20
字数 2549阅读时长 7 分钟
type
status
date
slug
summary
tags
category
icon
password
AI summary
Last edited time
Mar 20, 2025 04:57 PM
以前用过 maxwell,几年前就看到过 debezium,近期调研替换阿里云 DTS 订阅的方案,尝试一下

安装步骤

使用 docker compose 方式安装,相关配置如下
启动
准备 mysql 复制账号,这里用户名密码都使用 slave_debezium,并给予从库权限
确认 mysql 主从状态
创建 debezium 信号表
初始化 debezium-connect
关键配置说明
  1. table.include.list 要监听的对象表(命名形式 库名.表名,库名.表名)
  1. snapshot.mode = schema_only (在任务启动时,只做表结构快照,不做数据快照,默认的 initial 策略会对监听的表做全量快照,遇到数据量大的表可能会影响生产写入)
  1. snapshot.locking.mode = none(快照时不使用锁,避免影响生产写操作)
  1. signal.data.collection = app_dev.debezium_signal(指定 dbz 的 信号表,用于触发增量快照)
  1. read.only = true (只读账号时必须指定,否则会尝试对 debezium_signal 表做 insert 操作来产生水位信息)
  1. transforms = reroute (SMT 相关配置,通过正则表达式调整 dbz 默认的 topic 策略)
  1. decimal.handling.mode = string (将 mysql 中 decimal 类型转换为 string 输出, 确保不丢失精度)
  1. converters = bitOneToInt (默认 bit 会转换为 boolean 类型,这里通过自定义 CustomConvert 修改默认行为)下面暂时没用到
通过 Offset Explorer 3 可以看到相关数据
notion image
 

debezium-connect 常用 rest 操作

获取 connect 状态
获取 connect 配置
暂停 connect cdc 捕捉任务
恢复 connect cdc 捕捉任务
 
插入 debezium_signal 表触发指定表增量快照
 

问题处理记录

CDC 事件 topic 策略
默认 dbz 默认实现是一个表一个 topic,可以通过 kafka connect 的 SMT 机制来重路由,初始配置如下
但是查看 kafka 队列发现不生效!
notion image
原因是 正则表达式 \w 不包含中划线,需要修改为 \S
系统提示 debezium_signal 没有写入权限
在做增量快照时,后台报错提示 debezium_signal 没有 insert 权限
解决方案
加上 read.only = true(通过从库账号做只读快照)
 

MySQL binlog 验证

近期有个疑问,在一个事务开启后,多次对同一条数据进行 update 操作,binlog 会记录几次?
结论 每条 update 操作都会有对应的binlog 日志
验证过程如下
kafka 中 cdc 的记录,第一次修改
kafka 中 cdc 的记录,第二次修改
从上面两条修改记录的 "gtid": "57561b7b-e2a7-11ef-9d3b-0242ac130003:1252076" 可以看出,同一个事务中两次针对同一条数据的 update 操作都会产生对应的 binlog

📎 参考文章

 
  • Debezium
  • JMM如何做好技术评审
    Loading...