lanicc

canal改造记录

2021-09-04

canal改造日记

canal如果配置成admin模式,但admin没有启动的话,会导致canal也无法启动,这个修改是为了将canaladmin关系拆分,使得canal可以独立运行,即canal直接访问库。

需要改动的地方

PlainCanalConfigClient

贼坑的地方,PlainCanalConfigClient中的接口只要是入参md5不为空,都是为了比较对应的配置是否变化,不变化的返回null即可,如果有变化,才不返回null

改动增加的配置

1
2
3
4
5
6
canal.manager.mode = db
canal.manager.jdbc.address = 127.0.0.1
canal.manager.jdbc.port = 3306
canal.manager.jdbc.username = root
canal.manager.jdbc.password = canal_MYSQL
canal.manager.jdbc.database = canal_manager

canal.manager.mode如果是db就是标识canal直连数据库,不依赖admin

client-adapter

api包

抽出了一个api的包,方便后续adapter的开发

弃用的开源的功能

  • BootstrapConfiguration:删除了自动配置(META-INF/spring.factories)
  • ApplicationConfigMonitor:
    不注册到Spring容器,该类是用来扫描配置文件的变更的(配合com.alibaba.otter.canal.adapter.launcher.monitor.remote包可以实现从数据库动态加载配置)
  • CanalAdapterService: 删除@RefreshScope注解,不需要这个功能

新增的功能

  • CanalAdapterLoader: 增加CanalClientConfig.CanalAdapter维度的动态监听和暂停,CanalAdapterService也增加了相应的接口
  • InstanceConfigMonitor: 增加了基于canalInstance维度的配置监听,配合com.alibaba.otter.canal.adapter.launcher.monitor.rmt包,完成监听数据库配置

基于数据库的动态配置监听

  1. 查询配置:sql
    1
    2
    3
    select cac.id, cic.name, cac.content, cac.modified_time
    from canal_adapter_config cac
    inner join canal_instance_config cic on cac.id = cic.id
  2. 对比每一项的modified_time是否有更新,有更新的认为配置更改了
  3. 根据1中的sql,可知CanalClientConfig.CanalAdapter中的name,是canal_instance_config的name

canal_adapter_config表使用说明

  • id: canal_instance_config的id
  • category: 目前没用
  • name: 目前没用
  • status: 0表示正常启用,其他表示不启用
  • content: yaml格式的配置,示例如下:
    1
    2
    3
    4
    5
    6
    7
    groups:
    - groupId: g1
    outerAdapters:
    - name: logger
    - groupId: g2
    outerAdapters:
    - name: logger
  • modified_time: 扫描数据库时,会根据modified_time判断配置是否修改

待研究

  • canal主备问题
  • adapter主备问题
  • adapter的SPI方式类隔离的问题
  • admin端管理adapter

改造之后的对比

  • 可以在admin控制台管理adapter
  • adapter支持配置动态刷新(基于数据库)
  • canalmanager模式下支持独立运行

其他

canal只收到了Transaction Begin、Transaction End消息,没有row data消息

原因: filter过滤掉的库表信息,row data信息收不到,但是Transaction Begin、Transaction End消息还是有的。。。竟然

github issue: 取不到ROWDATA数据 #160

Tags: canal