整体架构
说明
server:对应于一个jvm,管理多个instance,提供服务
instance:伪装成一个slave,从mysql dump数据
eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)
eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)
eventStore (数据存储)
metaManager (增量订阅&消费信息管理器)
server
为了方便组件化使用,特意抽象了Embeded(嵌入式) / Netty(网络访问)的两种实现
Embeded:消费端直接本地嵌入,无需单独部署canal服务
Netty: 独立部署,提供netty服务,消费端远程抓取
instance
instance的两种配置方式
1.本地spring配置,默认为此方式---Manager
2.远程读取配置,需要自己实现---Spring
eventParser
整个parser过程大致可分为几步:
Connection获取上一次解析成功的位置 (如果第一次启动,则获取初始指定的位置或者是当前数据库的binlog位点)
Connection建立链接,发送BINLOG_DUMP指令
// 0. write command number
// 1. write 4 bytes bin-log position to start at
// 2. write 2 bytes bin-log flags
// 3. write 4 bytes server id of the slave
// 4. write bin-log file name
Mysql开始推送Binaly Log
接收到的Binaly Log的通过Binlog parser进行协议解析,补充一些特定信息
// 补充字段名字,字段类型,主键信息,unsigned类型处理
传递给EventSink模块进行数据存储,是一个阻塞操作,直到存储成功
存储成功后,定时记录Binaly Log位置