专栏名称: 京东成都研究院
京东商城成都研究院信息平台
目录
相关文章推荐
成都本地宝  ·  成都地铁直达的百大免费景点来了!(第四期) ·  12 小时前  
清廉蓉城  ·  李希在江西调研时强调 ... ·  2 天前  
成都本地宝  ·  不限人群!成都怎么领公交/地铁免费出行卡? ·  4 天前  
成都本地宝  ·  成都5个严重被低估的古镇/村落!全部免费! ·  2 天前  
51好读  ›  专栏  ›  京东成都研究院

B2B拨云专栏 | Canal原理剖析

京东成都研究院  · 公众号  · 成都  · 2018-02-09 17:00

正文

Canal是一个基于数据库Binlog纯Java实现的增量数据订阅&消费中间件,目前主要支持mysql 5.7及以下的版本。与它类似的产品有:

  • LinkedIn的DataBus,它支持MySQL、Oracle数据。 (https://github.com/linkedin/databus)

  • vmware的tungsten-replicator,它支持高版MySQL往低版本复制,并且所支持的数据库类型不仅局限于关系型数据库(MySQL、Oracle、Amazon RDS、PostgreSQL),也包括NoSQL(MongoDB)及Hadoop等。

  • open-replicator,它支持MySQL,我们可以单独使用它来解析MySQL的binlog。


🔲 使用场景

  • 同构/异构的数据同步。比如,从MySQL往Oracle、HBase、MongoDB同步。

  • 缓存/搜索数据构建。比如,从MySQL往Redis、ES写数据。

  • 数据变更通知。比如,商品属性变化通知、价格变化通知等。

  • 数据实时备份。

  • 数据操作审计。

  • ... ...


🔲 有什么好处?

  • 最终一致性特性。 比如,我们在做缓存构建时,无需担心事物回滚问题,只用集中精力去保证数据一定在缓存中构建成功即可。如果构建失败,我们可以通过重试或重新消费binlog来进行重试。

  • 解耦,数据源和消费者之间解耦;业务与数据解耦,业务代码无需写一堆与业务无关的多写和回滚代码。

  • 基于增量的数据变更,无需自己实现变更数据扫描逻辑。

  • ……


🔲 B2B平台中的运用

1. B商品

  • 数据异构多写:一份商品数据需要同时往Redis、ES中写入。

  • 商品属性变更消息推送。


2. B订单

  • 构数据准实时同步:线上灰度切换期间,需要低延迟的同步多个业务线老系统的订单数据至B订单。

  • 保障订单MySQL与ES、Redis中数据最终一致性:因为业务对实时性的要求,需要下单后立即对订单列表数据可见,所以在下单成功后会实时写入一次ES,但不能因ES写入失败而导致整个下单流程失败。所以,在实时写的过程中是允许容错的,而后通过binlog来保障最终MySQL和ES的一致性。


🔲  工作原理

Canal是基于数据库主(Master)从(Slave)复制的协议,将自己伪装成Slave。主要分为以下几个步骤:

  1. canal模拟mysql slave的交互协议,伪装自己为slave,向master发送dump协议。

  2. mysql master收到dump请求,开始推送binlog给canal。

  3. canal解析byte流至LogEvent对象。


🔲 MySQL主备复制

  1. master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看)。

  2. slave将master的binary log events拷贝到它的中继日志(relay log)。

  3. slave重做中继日志中的事件来改变自己的数据。


🔲 MySQL BinLog格式

  • Statement

    基于SQL语句的模式, slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。binlog日志量少,节省IO及存储资源,提升性能。某些语句和函数在复制过程可能导致数据不一致甚至出错。

  • Row

    基于行的模式,记录的是行的变化,非常清楚的记录下每一行数据修改的细节,很安全。但是binlog会比其他两种模式大很多,在一些大表中清除大量数据时在binlog中会生成很多条语句(表重建),可能导致从库延迟变大。

  • Mixed

    混合模式,根据SQL语句来选用是statement还是row模式。


🔲 Canal部署模式

Canal分为独立部署和嵌入式两种部署模式。

  • 独立部署: 将canal client端与canal server端分离部署。可对canal server端进行单独的集群部署,server与client用tpc连接,采用protobuf作为数据交换格式。

  • 嵌入式: 将client、server端与业务应用集成在一起部署。


🔲 Canal架构

一个Server是指一个Jvm实例,一个Server中可包含多个Instance,一个Instance包含了Event Parser、Event Sink、Event Store三个核心部分。

  • Event Parser:负责获取MySQL Binlog并解析,然后交给Event Sink。一个Parser对应一个MySQL实例。

  • Event Sink:负责过滤/归并/分发/加工数据,然后存储至Event Store。

  • Event Store:负责数据存储,供客户端消费。


🔲 Zookeeper中的目录结构







请到「今天看啥」查看全文