Canal的使用
Canal概述
canal是用java开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,canal主要支持了MySQL的binlog解析,解析完成后才利用canal client 用来处理获得的相关数据。(数据库同步需要阿里的otter中间件,基于canal)。
使用场景
-
原始场景:作为异地数据库之间的数据同步
-
更新缓存
-
抓取业务新增变化表,用于制作拉链表
-
实时抓取业务数据中的新增变化数据,用于制作实时统计
Canal原理
Mysql的主从复制原理:
-
Master主库将改变记录,写到二进制日志(binary log)中
-
Slave从库向mysql master发送dump协议,将master主库的binary log events拷贝到它的中继日志(relay log);
-
Slave从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。
Canal原理:
-
1.canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
2.mysql master收到dump请求,开始推送binary log给slave(也就是canal)
3.canal解析binary log对象(原始为byte流)
Mysql的BinLog
- 什么是Binlog日志?
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有1%的性能损耗 。二进制有两个最重要的使用场景:
其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
-
binLog日志的开启
-
1.修改mysql的配置文件 /etc/my.conf
添加如下
log-bin=mysql-bin // 这个表示binlog日志的前缀是mysql-bin ,以后生成的日志文件就是 mysql-bin.123456 的文件后面的数字按顺序生成。 每次mysql重启或者到达单个文件大小的阈值时,新生一个文件,按顺序编号。
- 2.mysql binlog的格式,那就是有三种,分别是STATEMENT,MIXED,ROW。在配置文件中可以选择配置
-
binlog_format=row
STATEMENT,MIXED,ROW的区别:
- statement :语句级,binlog会记录每次一执行写操作的语句。 相对row模式节省空间,但是可能产生不一致性,比如update tt set create_date=now() 如果用binlog日志进行恢复,由于执行时间不同可能产生的数据就不同。
优点: 节省空间
缺点: 有可能造成数据不一致。
- row 行级, binlog会记录每次操作后每行记录的变化。
优点:保持数据的绝对一致性。因为不管sql是什么,引用了什么函数,他只记录执行后的效果。
缺点:占用较大空间。
- mixed statement的升级版,一定程度上解决了,因为一些情况而造成的statement模式不一致问题 ,在某些情况下譬如:
当函数中包含 UUID() 时;
包含 AUTO_INCREMENT 字段的表被更新时;
执行 INSERT DELAYED 语句时;
用 UDF 时;
会按照 ROW的方式进行处理
优点:节省空间,同时兼顾了一定的一致性。
缺点:还有些极个别情况依旧会造成不一致,另外statement和mixed对于需要对binlog的监控的情况都不方便。
- 在mysql中赋予权限:
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal' ;
- 修改 /etc/my.conf 文件
server-id= 1
log-bin=mysql-bin
binlog_format=row
binlog-do-db=xxx //指得你要监控的数据库
- 重启mysql
Canal的安装
-
去https://github.com/alibaba/canal/releases 下载安装版本
-
把canal.deployer-1.1.2.tar.gz拷贝到linux,解压缩
-
修改 canal配置及
vim conf/canal.properties, 此配置为Canal的默认配置,主要关注端口号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VLg0nvLe-1589105749433)(C:\Users\txc\AppData\Roaming\Typora\typora-user-images\image-20200510180920445.png)]
配置canal监控的实例,destination可以配置多个,在客户端的代码中destination要对应
我
10. vim conf/example/instance.properties。instance.properties是针对要追踪的mysql的实例配置
11.启动canal,./bin/startup.sh
- 启动客户端抓取数据
- canal的数据结构
Entry
Header
version [协议的版本号,default = 1]
logfileName [binlog文件名]
logfileOffset [binlog position]
serverId [服务端serverId]
serverenCode [变更数据的编码]
executeTime [变更数据的执行时间]
sourceType [变更数据的来源,default = MYSQL]
schemaName [变更数据的schemaname]
tableName [变更数据的tablename]
eventLength [每个event的长度]
eventType [insert/update/delete类型,default = UPDATE]
props [预留扩展]
gtid [当前事务的gitd]
entryType [事务头BEGIN/事务尾END/数据ROWDATA/HEARTBEAT/GTIDLOG]
storeValue [byte数据,可展开,对应的类型为RowChange]
RowChange
tableId [tableId,由数据库产生]
eventType [数据变更类型,default = UPDATE]
isDdl [标识是否是ddl语句,比如create table/drop table]
sql [ddl/query的sql语句]
rowDatas [具体insert/update/delete的变更数据,可为多条,1个binlog event事件可对应多条变更,比如批处理]
beforeColumns [字段信息,增量数据(修改前,删除前),Column类型的数组]
afterColumns [字段信息,增量数据(修改后,新增后),Column类型的数组]
props [预留扩展]
props [预留扩展]
ddlSchemaName [ddl/query的schemaName,会存在跨库ddl,需要保留执行ddl的当前schemaName]
Column
index [字段下标]
sqlType [jdbc type]
name [字段名称(忽略大小写),在mysql中是没有的]
isKey [是否为主键]
updated [是否发生过变更]
isNull [值是否为null]
props [预留扩展]
value [字段值,timestamp,Datetime是一个时间格式的文本]
length [对应数据对象原始长度]
mysqlType [字段mysql类型]