前述:Canal是纯Java语言开发,解析数据库增量日志,为目标端提供消费&订阅。源端仅仅支持MySQL , 目标端支持 Kafka,RocketMq,RabbitMq,MySQL,ES等。
原理:基于MySQL的主从复制,Canal 将自己伪装成MySQL slave,向MySQL master发送dump协议。Master收到后,会向slave (也就是Canal) 推送binary log。Canal解析binary log对象。提供消费和订阅
架构:
Server:一个Canal实例,对应一个JVM,可以监听MySQL master的binlog,server中包含下面的组件
Instance:这个代表了一个canal server中的多个MySQL instance,说明一个Canal Server可以搜集多个库的数据。
EventParser:获取binlog日志,解析binlog日志
EventSink:使用设置的filter对binlog进行过滤。
EventStore:用来存储filter过滤后的数据,目前仅支持内存存储,后期会在本地文件中存储
MetaManager:这个用来存储元数据,例如,消费到的游标,当前活动的server信息
Canal的HA机制
Canal的HA机制是以来于zookeeper的。分为两个部门,Canal Server 和 Canal Client 都对HA有对应的实现
Canal Server:为了减少对MySQL dump的请求,不同server上的相同instance在同一时间只能有一个处于running,其他处于standby状态
Canal Client:为了保证有序性,一份instance同一时间只能由一个canal Client消费,否则客户端无法保证有序性。
架构图如下:
启动步骤:
1、Canal Server 要启动Canal Instance 需要向zk进行一次启动预判断(创建一个临时节点,哪个server创建成功,才可以启动),判断成功后,才允许启动
2、创建zk节点成功后,对应的 Canal Server 就启动对应的 Canal Instance ,没有创建成功的会处于standby状态
3、一旦zk发现Canal Server 创建的节点消失后,zk会立即通知其他节点再进行1的操作
4、Canal Client 每次连接时,会询问zk是哪个Server启动了Instance ,然后再建立连接。Canal Client启动方式和server一样,利用zk抢占创建临时节点。
Canal Server启动后,会接受MySQL的binlog,解析数据,存储数据,提供接口给 Canal Client 消费
Canal Client 启动后,会和Canal Server建立连接,读取数据,消费&订阅数据
单机节点部署流程,并且同步数据到MySQL:
- 启动一个Zookeeper
- 下载Canal admin(Canal的web界面),修改配置文件(conf/application.yml),导入sql(conf/canal_manager.sql),启动即可
在Canal Admin界面上配置集群,因为是单节点,所以只配置一个zk
成功后就显示了
然后点击操作的主配置
完成后保存即可
- 启动Canal Server (Canal Server和MySQL交互,读取binlog),修改配置文件canal_local.properties 和 canal.properties
canal_local.properties:
canal.properties:
启动Canal Server后,会自动添加到集群zk1下,在web界面可以直接看到
然后新建instance即可。
保存后,会直接在界面上显示
- 启动 Canal adapter ,通过配置实现同步数据到MySQL,修改配置文件,conf/application.yml和 conf/rdb/mytest_user.yml
Application.yml:
mytest_user.yml:
- 给test.test 表中插入一条数据,test1.test表中数据会自动同步
插入一条数据
Canal集群部署
1、首先启动 zk和Canal Admin ,构建一个集群
2、启动canal.deployer(Canal Server),我这里启动了三个Server,分别为server1,server2,server3
3、创建instance实例,我这里也创建了三个,创建一个实例,会自动分配在server上,这里三个都在Server3上
4、此时如果挂掉server3,会自动切换到其他server上继续工作。
这里server2已经挂掉,可以看到instance自动切换到server2上
5、如果全部server挂掉,所有的instance就停止了,再次启动server后,会自动启动所有instance