canal源码分析 deployer(一)

文章详细介绍了Canal作为数据库增量日志解析组件的工作原理,包括它如何模拟MySQL主从复制,接收并解析binlog。重点分析了canal-deployer的CanalLauncher入口,阐述了配置加载、启动模式判断、SPI机制的应用以及资源管理等方面。此外,提到了CanalAdmin的动态配置和存在的问题,以及对未来可能的优化方向,如多线程提升性能和数据一致性保障。
摘要由CSDN通过智能技术生成

源码地址与简介

源码地址:https://github.com/alibaba/canal
Canal是阿里巴巴开源的一款基于MySQL数据库增量日志解析和消费的组件,可以将数据库的变更操作事件解析成指定格式的消息,并通过MQ或类似的方式投递给消费者。Canal可以用于数据备份与恢复、数据库镜像、实时数据仓库等。

主要分析 canal-adapter源码 与 canal-deployer源码

工作原理

1.canal模拟mysql主从复制(mysql slave),将自己伪装成mysql slave, 向 mysql主机节点发送dump协议
2.mysql master收到dump向 canal发送 binlog日志(mq)
3.canal接受binlog日志(byte[]流)解析

canal-deployer

  1. canal两种使用方式:独立部署(一般deployer和sever) 内嵌应用
  2. 包结构如下图:在这里插入图片描述

daployer源码分析入口 ---- CanalLauncher

1.加载配置文件canal.properties.
在这里插入图片描述
2.接下来,我们来到了
final CanalStarter canalStater = new CanalStarter(properties);
那么CanalStarter是什么,那么构造把properties注入进入的意义,猜测顾名思义canal具体的启动者启动参数由canal.properties所设置的。里面有个start(syn修饰)。我们先看 CanalStarter.start()方法,先不进入断点,猜测源码逻辑后续验证结果(个人看源码习惯)。如图:
在这里插入图片描述
####2.1 CanalStarter.start()
1.首先根据canal.serverMode判断启动模式是否是tcp还是mq(tcp, kafka, rocketMQ, rabbitMQ ps:其实还可以设置true是默认加载kafka) , 如果不是tcp,则加载mq,这里是如何加载的 (是个技术点,用的是SPI机制,这里的SPI机制整体流程较为复杂,后续链接具体说明,涉及下载指定mq plugin 并进行类加载处理,且存在冲突情况。只是为了去耦合)。 源码分析如下图:
在这里插入图片描述
2、controller.start() 是对canalServer、配置监听器资源、canal工作节点、缓存清理、zk连接的处理。然后做了一个线程,在jvm在接收到system.exit方法之前执行设置的钩子函数(shutdownHook),主要用于释放资源、清理、保持等操作。然后向canalMqStarter主要设置的多实例db源,最后如果有启动并设置canal-admin还会绑定一下必要的通讯信息在里面。源码分析如图:
在这里插入图片描述
到此,CanalStarter.start()暂时告一段落,后续填充方法细节。
3.回到Launcher里,找配置里的设置admin.address(也就是canal-admin地址), 可以通过客户端canal-admin动态修改(是一个定时任务调度scheduleWithFixedDelay 默认5S轮询)
PS:存在问题,设置客户端后无法加载到本地target/config下面的实例文件,去掉canal-admin又能加载,在admin设置实例配置也是可行的。
在这里插入图片描述
deployer启动完成。

小结

1、对于独一份的配置,可以采用scheduleWithFixedDelay去调度,如果客户端修改,就改变相应的MD5或者属性hash在判断,如果修改了就覆盖。

2.SPI机制,定义好将要实现的接口功能,如connector模块下kafka、rocketmq、rabbitmq,将相关约定放入META-INFO下,SPI获取key,得到value加载并实例化,并且处理相关mq的jar的类加载与冲突问题。

3、jvm关闭之前设置钩子函数处理,资源回收、清理、保存、主线程退出等操作。(在refresh的时候需要清除钩子函数)

4、对不同topic采用多线程处理send 提升性能。

遗留细节问题:实例中autoScan机制 、HA机制原理、 如何保证数据不丢失以及batchId与position的处理、解析dump等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值