Canal的概述

发布于 2022-10-21  8.45k 次阅读


    Canal的产生背景:阿里B2B公司,因为业务的需求,卖家集中在国内,买家有一部分集中在国外。所以衍生出了同步杭州和美国异地机房的需求,从2010年开始,阿里系公司开始逐渐的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出增量订阅的消费业务

基本含义:Canal是用java开发的基于数据库增量日志解析,提供增量数据生产/消费的数据库中间件

1. Canal原理

canal原理:Canal主要通过MySQL的Binlog解析,解析完成后才利用Canal Client来处理获得相关数据进行同步到其他服务端

  1. canal模拟mysql slave与mysql master进行数据同步,伪装自己是一个mysql slave,向mysql master发送dump 协议
  2. mysql master收到mysql slave(canal)发送的dump请求,开始推送binlog增量日志给canal
  3. mysql slave(canal)收到binlog增量日志后,就可以对这个部分日志进行解析,获取主库的结构核数据变更

2. Binlog日志

2.1 Binlog日志基本含义

    MySQL的二进制日志可以说MySQL最重要的日志,它记录了所以的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗时间,MySQL的二进制日志是事物安全型的

注:一般而言开启二进制日志会有1%的性能损耗

二进制日志有两个最重要的使用:

  1. MySQL Replication在Master端开启Binlog,Master把它的二进制日志传递给Slaves来达到Master-Slave数据一致性
  2. 数据的丢失恢复,通过使用MySQL Binlog工具来恢复数据

二进制日志包括两类文件:

  • 二进制索引文件(文件名后缀为.index),用于记录所有的二进制文件
  • 二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件

2.2 Binlog的分类

MySQL Binlog的格式主要有三种:

  1. STATEMENT
  2. MIXED
  3. ROW

在配置文件这可以选择配置binlog_format = statement | mixed | row

三种格式的含义:

1)STATEMENT:语句级

    binlog会记录每一次执行写操作的语句。相对row模式节省空间,但是可能产生,比如"UPDATE kxj SET create_date=now()",如果用binlog日志进行恢复,由于执行时间不同可能产生的数据就不同

  • 优点:节省空间
  • 缺点:有可能造成数据不一致

2)ROW:行级

    binlog会记录每一次操作后每行记录数据的变化

  • 优点:保证了数据的绝对一致性,因为不管sql是什么,引用什么函数,它记录的只是执行后的结果
  • 缺点:占用较大空间

3)MIXED:STATEMENT的升级版

    一定程度上解决了,因为一些情况而造成的statment模式不一致问题,默认还是statement,在某些情况下 如:当函数中有UUID()时:包含AUTO_INCREMENT字段的被更新时,执行INSERT DELAYED语句时,用UDF时会按照ROW方式进行处理

  • 优点:节省空间,同时兼顾一定的一致性
  • 缺点:还是有极个别情况造成数据不一致,另外相比较与statement和mixed而言binlog监控不方便

综合而言,Canal做监控,选择row格式比较合适

3. MySQL主从复制原理

    复制指将主数据库的DDL和DML操作通过二进制日志传到从服务器中,然后在从库上对这些日志重新执行(重做),从而使得从库和主库的数据保持同步

MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制

  • Binary log:二进制日志
  • Relay log:中继日志

复制分成三步:

  1. Master主库在事务提交时,会把数据变更作为时间Events记录在二进制日志文件Binlog中
  2. 主库推送二进制日志文件Binlog中的日志事件到中继日志Relay Log
  3. slave重做中继日志中的事件,将改变反映它自己的数据

 启用Binlog注意以下几点:

  1. Master主库一般会有多台Slave订阅,且Master主库要支持业务系统实时变更操作,服务器资源会有瓶颈;
  2.  需要同步的数据表一定要有主键

4. Canal架构

  • server:代表一个Canal运行实例,对应一个JVM
  • instance:对应于一个数据队列

instance子模块:

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

5. Canal的应用场景

5.1 缓存同步

缓存同步主要的三个方面:

  • 数据库和其他第三方缓存数据库 如Redis等进行数据同步
  • 数据库和ES搜索引擎进行数据同步
  • 数据库和其他数据进行数据同步

    其中最常用是同步缓存/全文搜索,当数据库变更时通过binlog进行缓存/ES的增量更新,当缓存/ES出现更改时回退binlog进行重新同步,并提供全量刷新缓存/ES的方法

 

5.2 任务下发

    当数据变更时需要通知其他依赖系统。其原理是任务系统监听数据库数据变更,然后将变更的数据写入MQ/KafKa进行任务下发

例如:商品数据变更后需要通知商品详情页、列表页、搜索页等关联系统,这种方式可以保证数据下发的精准性,通过MQ发送消息通知变更缓存是无法做到完成这个需求的,而且业务系统中不会散落着各种下发MQ的代码

5.3 数据异构

    在大型网站架构中,DB都会采用分库分表来解决容量和性能问题,但分库分表之后带来的新问题。比如不同维度的查询或者聚合查询,此时就会非常棘手。一般我们会通过数据异构机制来解决此问题

    所谓的数据异构,那就是将需要join查询的多表按照某一个维度又聚合在一个DB中。让你去查询。canal就是实现数据异构的手段之一

其他场景:

  • 抓取业务表的新增变化数据,用于制作实时统计
  • ………………

路漫漫其修远兮,吾将上下而求索