目录
CanalInstanceWithSpring
实例
canal server架构
- server 代表一个 canal 运行实例,对应于一个 jvm
- instance 对应于一个数据队列 (1个 canal server 对应 1…n 个 instance )
- instance 下的子模块
eventParser: 数据源接入,模拟 slave 协议和 master 进行交互,协议解析
eventSink: Parser 和 Store 链接器,进行数据过滤,加工,分发的工作
eventStore: 数据存储
metaManager: 增量订阅 & 消费信息管理器
eventParser
AbstractEventParser.start()
start方法中调用 dump()方法dump mysql的binlog日志(tcp)
sinkHandler.sink()
注意区别这里的sinkHandler和eventSink
EventTransactionBuffer.flush()
eventSink
EntryEventSink.doSink()
consumeTheEventAndProfilingIfNecessary(transaction)会调用eventSink.sink()
eventStore
eventStore是用内存基于ringBuffer实现队列的生产/消费存储
CanalServerWithNetty
CanalLauncher的start最后会调用CanalServerWithNetty的start启动一个netty服务端,并注册一个SessionHandler
sessionHandler会处理客户端发送的GET事件,然后通过getWithoutAck从eventStore获取binlog(上面eventSink写入到eventStore)
客户端
客户端启动根据SPI机制启动对应的adapter
canalMsgConsumer有对应的四个实现,这里已TCP协议对接,使用CanalTCPConsumer
向上面服务端启动的netty服务发送get事件获取binlog
往上数第三张截图里面getMessage之后有调用writerOut
这里以esadapter为例,最后调用esSyncService.sync同步数据到es
细节不看了,只讲主体流程