Canal的产生背景:阿里B2B公司,因为业务的需求,卖家集中在国内,买家有一部分集中在国外。所以衍生出了同步杭州和美国异地机房的需求,从2010年开始,阿里系公司开始逐渐的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出增量订阅的消费业务
基本含义:Canal是用java开发的基于数据库增量日志解析,提供增量数据生产/消费的数据库中间件
1. Canal原理
canal原理:Canal主要通过MySQL的Binlog解析,解析完成后才利用Canal Client来处理获得相关数据进行同步到其他服务端
- canal模拟mysql slave与mysql master进行数据同步,伪装自己是一个mysql slave,向mysql master发送dump 协议
- mysql master收到mysql slave(canal)发送的dump请求,开始推送binlog增量日志给canal
- mysql slave(canal)收到binlog增量日志后,就可以对这个部分日志进行解析,获取主库的结构核数据变更
2. Binlog日志
2.1 Binlog日志基本含义
MySQL的二进制日志可以说MySQL最重要的日志,它记录了所以的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗时间,MySQL的二进制日志是事物安全型的
注:一般而言开启二进制日志会有1%的性能损耗
二进制日志有两个最重要的使用:
- MySQL Replication在Master端开启Binlog,Master把它的二进制日志传递给Slaves来达到Master-Slave数据一致性
- 数据的丢失恢复,通过使用MySQL Binlog工具来恢复数据
二进制日志包括两类文件:
- 二进制索引文件(文件名后缀为.index),用于记录所有的二进制文件
- 二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件
2.2 Binlog的分类
MySQL Binlog的格式主要有三种:
- STATEMENT
- MIXED
- 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:中继日志
复制分成三步:
- Master主库在事务提交时,会把数据变更作为时间Events记录在二进制日志文件Binlog中
- 主库推送二进制日志文件Binlog中的日志事件到中继日志Relay Log
- slave重做中继日志中的事件,将改变反映它自己的数据
启用Binlog注意以下几点:
- Master主库一般会有多台Slave订阅,且Master主库要支持业务系统实时变更操作,服务器资源会有瓶颈;
- 需要同步的数据表一定要有主键
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就是实现数据异构的手段之一
其他场景:
- 抓取业务表的新增变化数据,用于制作实时统计
- ………………
Comments | 2 条评论
https://www.nunuyy3.org/dongman/5139.html
樱花动漫番剧:
https://www.yhdmp.cc/vp/15154-1-7.html
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109