Alibaba Canal调研报告

前述: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:

  1. 启动一个Zookeeper
  2. 下载Canal admin(Canal的web界面),修改配置文件(conf/application.yml),导入sql(conf/canal_manager.sql),启动即可

 

在Canal Admin界面上配置集群,因为是单节点,所以只配置一个zk

 

成功后就显示了

 

然后点击操作的主配置

 

完成后保存即可

  1. 启动Canal Server (Canal Server和MySQL交互,读取binlog),修改配置文件canal_local.properties 和 canal.properties

canal_local.properties:

 

canal.properties:

 

启动Canal Server后,会自动添加到集群zk1下,在web界面可以直接看到

 

然后新建instance即可。

 

保存后,会直接在界面上显示

 

  1. 启动 Canal adapter ,通过配置实现同步数据到MySQL,修改配置文件,conf/application.yml和 conf/rdb/mytest_user.yml

Application.yml:

 

mytest_user.yml:

 

  1. 给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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值