OB集群间数据同步-canal

【产品名称】OB, canal

【产品版本】

  1. oceanbase-ce-3.1.1-1.el7.x86_64.rpm
  2. canal.adapter-for-ob-rc1.tar.gz
  3. canal.admin-for-ob-rc1.tar.gz
  4. canal.deployer-for-ob-rc1.tar.gz

【问题描述】

我们刚开始搭建CDC, 搭建了一条 OB集群A → oblogproxy → canal server → kafka → canal adapter(mysql rdb) → OB集群B 的数据同步链路, 然后在 集群A 上用 sysbench 导入了一些数据, 然后监控 kafka 直到不再有数据过来, 然后我们检查了集群 A 和 B 对应表的记录数(count, 暂未做表 checksum), 发现两边数据量不一致, 暂未查到原因, 所以请教一下, 我们是否在搭建过程忽略了什么问题?

Note:

  • sysbench 建的表有主键.
  • 我们手动建了一张表, 没有主键, 测试发现 create table DDL 能同步到集群 B, 但 insert DML 未能同步到集群B. 手动插入数据时, adapter 已收到数据, 但 adapter 日志里报错. (此问题已有老师回复, canal adapter 暂不支持没主键或唯一键的表同步.)
1 个赞

对于sysbench写的数据,有两个问题:

  1. 这部分数据在kafka中有缺失吗?
  2. 这部分数据在经过canal adapter写入时,有没有出现报错?
  1. 我监控kafka对应topic, 把接收到的数据打到了文件,  根据行数, 粗略估计了一下, 数据应该是全部到kafka了.
  2. 根据adapter日志行数, 应该也到adapter了, adapter未见报错日志, 只有debug和info级别信息.

附件是 kafka 和 adapter 的日志, 日志是在 sysbench 设了8张表, 每张表100条数据情况下产生的.

logs.tar (870400 KB)

adapter也没报错的话,个人推测应该是漏掉了,adapter项目的数据库映射是怎么配置的?就是conf/rdb目录下边的配置文件。

rdb 配置直接走的db镜像, 所以不应该出现这个问题!

dataSourceKey: defaultDS
destination: example
outerAdapterKey: ob1
concurrent: true
dbMapping:
  mirrorDb: true
  database: sys.canal_test

其中

concurrent: true

是否会影响 ?

理论上不会有影响,如果有错误的话至少应该有日志打出来的。

再请问下,之前无主键的报错跟这一批sysbench的数据写入时间上有交叉吗?如果有的话,能不能让adapter换个groupId再消费一次?这次只监听sysbench对应的表,看看有没有错误啥的

以及,我看到你的database名字里是有sys前缀的,而kafka的log是没有的。考虑到我们提供的canal的配置默认会去掉db名中的租户前缀,需要确认下这里的rdb映射是否正确。

也不建议在sys租户放业务数据

  1. 无主键报错和sysbench数据写入时间上无交叉.
  1. 配置采用db镜像, 因为出现了部分成功, 如果rdb配置有问题, 应该全部失败才对. -- 我们再尝试调整rdb配置测一下.
  2. 应该和是否是 sys 租户没关系, 目前为了测试, 暂时用了sys租户, 我们尝试调整再测一下.

谢谢!


您好, 我们又测试了一遍, 两边仍然不一致, 测试配置如下:

  1. 按要求新建了租户, 在此租户下建库表做同步
  2. 跑 sysbench, 建了 8 张表, 每张 1000 条数据, 只做 prepare 步骤, 也即每张表 1000 条 insert 记录
  3. 采集了中间 kafka 的日志, 以及 adapter 的日志, 根据日志, 可以看到数据已经到 adapter, 比如sbtest1, INFO, DEBUG记录数各1000条


您好, 目前我们排查下来, 可能是和 syncBatchSize 参数设置有关系, 设置为 1 时同步正常, 原先默认是 1000, 但设置为 1 效率非常低, 基本上没办法使用, 

目前我们正在看 adapter 源码, 麻烦老师也帮忙看下, 是不是 adapter 有bug. 

syncBatchSize: 1


1 个赞