canal改造日记
canal如果配置成admin模式,但admin没有启动的话,会导致canal也无法启动,这个修改是为了将canal和admin关系拆分,使得canal可以独立运行,即canal直接访问库。
需要改动的地方
PlainCanalConfigClient
贼坑的地方,
PlainCanalConfigClient中的接口只要是入参md5不为空,都是为了比较对应的配置是否变化,不变化的返回null即可,如果有变化,才不返回null
改动增加的配置
1 | = db |
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包,完成监听数据库配置
基于数据库的动态配置监听
- 查询配置:sql
1
2
3select 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 - 对比每一项的modified_time是否有更新,有更新的认为配置更改了
- 根据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
7groups:
- groupId: g1
outerAdapters:
- name: logger
- groupId: g2
outerAdapters:
- name: logger - modified_time: 扫描数据库时,会根据modified_time判断配置是否修改
待研究
canal主备问题adapter主备问题adapter的SPI方式类隔离的问题admin端管理adapter
改造之后的对比
- 可以在
admin控制台管理adapter adapter支持配置动态刷新(基于数据库)canal在manager模式下支持独立运行
其他
canal只收到了Transaction Begin、Transaction End消息,没有row data消息
原因: filter过滤掉的库表信息,row data信息收不到,但是Transaction Begin、Transaction End消息还是有的。。。竟然