一、起源:
早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。

基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql

 

二、用来做啥的

  1. 数据库镜像
  2. 数据库实时备份
  3. 多级索引 (卖家和买家各自分库索引)
  4. search build
  5. 业务cache刷新
  6. 价格变化等重要业务消息

三、原理

1. canal把自己伪装成了mysql 的slave,同步mysql的数据

四、架构

canal入个门

说明:

  • server代表一个canal运行实例,对应于一个jvm
  • instance对应于一个数据队列  (1个server对应1..n个instance)

instance模块:

  • eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)
  • eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)
  • eventStore (数据存储)
  • metaManager (增量订阅&消费信息管理器)

 

五、canal的坑

1.client和server需要在同一个子网?能通信不就行了

2.canal重启的问题

3. mysql重启

4. mysql宕机

5. 流式API,get,ack可能带来重复消费的问题

6. 不同vpc问题

 

六、canal如何做HA

canal入个门

HA的大致流程

  1. canal server要启动某个canal instance时都先向zookeeper进行一次尝试启动判断 (实现:创建EPHEMERAL节点,谁创建成功就允许谁启动)
  2. 创建zookeeper节点成功后,对应的canal server就启动对应的canal instance,没有创建成功的canal instance就会处于standby状态
  3. 一旦zookeeper发现canal server A创建的节点消失后,立即通知其他的canal server再次进行步骤1的操作,重新选出一个canal server启动instance.
  4. canal client每次进行connect时,会首先向zookeeper询问当前是谁启动了canal instance,然后和其建立链接,一旦链接不可用,会重新尝试connect.
  5. Canal Client的方式和canal server方式类似,也是利用zokeeper的抢占EPHEMERAL节点的方式进行控制.

 

七、canal server在什么时候删除数据?

- 收到ACK结束以后

 

八、EventStore的配置方式

1. file 2. zk 3. memory

 

九、canal在rds中的问题

1. 账号权限问题

2. binlog被删除的问题

3. 主备切换导致的问题

解决方式:升级canal到最新版本

https://github.com/alibaba/canal/wiki/aliyun-RDS-QuickStart

 

参考

http://www.cnblogs.com/w10234/p/6672133.html

https://blog.csdn.net/tanga842428/article/details/59098828

位点问题排查

https://github.com/alibaba/canal/wiki/FAQ

https://blog.csdn.net/my201110lc/article/details/78836270

 

 

相关文章: