我看过一场风景,后来我才知道,那是我人生中最美的一段时光。
我爱的人,爱我的人,都能度过这场新型感冒,那该多好。
Canal 的官网: https://github.com/alibaba/canal
Canal 能干什么
为什么出现 Canal
Canal 是阿里巴巴的 MySql binlog 增量订阅 /消费的组件.
canal, 为水道,管道, 主要用途是 基于 Mysql 数据增量日志解析, 提供增量数据订阅和消费.
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。
从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括:
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护 (拆分异构索引,倒排索引)
- 业务 cache 缓存刷新
- 带业务逻辑的增量数据处理 (canal 主要用这个)
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
简单来说,就是监控数据库表数据的实时变动,及时反映到业务上,业务上进行处理。
工作原理
主从同步 / 主从复制原理
- Mysql Master 主库 将数据变更写入到二进制日志文件里面 (binary log , 其中记录叫做 二进制日志事件 binary log events, 可以通过 show binlog events 进行查看)
- Mysql slave 将 master 的 binary log events 拷贝到它的中继日志 (relay log)
- slave 重放 relay log 中的事件,将数据变更成 它自己的数据。
canal 的工作原理
- canal 模拟 Mysql slave 的交互协议,伪装自己成为 slave, 即变成从库, 向 mysql master 主库发送 dump 协议
- master 收到 dump 请求, 开始推送 binary log 给 slave (这里给 canal)
- canal 解析 binary log 对象, 进行封装,变成 canal 提供的实体对象 (原始为 byte 流)
Canal 使用前准备
主数据库 master 开启日志处理
在 Mysql 安装目录下 my.ini 或者 my.conf 配置文件下 添加以下配置:
[mysqld]
// 其它 .....
# 添加日志的处理
log-bin=mysql-bin
sync_binlog=1
binlog-format=Row
#监听同步哪些数据库
binlog-do-db=springboot
# 服务器的id ,唯一
server-id=100
#屏蔽系统库同步
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
binlog-format: 配置成 row .
关于 binlog-format 的配置,可以看文章: https://www.cnblogs.com/langtianya/p/5504774.html
binlog-do-db: 监听的服务器,这儿只监听 springboot 服务器。
重启 Mysql 服务器。
检查一下,配置的是否正确。
show variables like ‘log_bin’
查看 binlog 日志文件列表
show binary logs;
查看当前正在写入的 binlog 文件:
show master status;
主数据源配置的,没有问题。
一般 canal 同步的时候,会专门创建 canal 同步的 相关账号,授权 同步相关的权限。 专账号专用
-- 刷新权限
flush privileges;
-- 创建用户
create user 'canal'@'%' identified by 'canal';
-- 授权 *.*表示所有库
grant SELECT,REPLICATION SLAVE,REPLICATION CLIENT on *.* to 'canal'@'%' identified by 'canal';
-- 再次刷新权限
flush privileges;
安装配置 Canal
去官网下载: https://github.com/alibaba/canal/releases
下载 v 1.1.5.tar.gz 版本
也可以百度云下载:
链接:https://pan.baidu.com/s/1d2mztfEDWTe1XGN8e1sS_A提取码:yyds
解压后,配置文件:
修改 conf/example/instance.properties 配置文件:
#################################################
## mysql serverId , v1.0.26+ will autoGen
# todo 放开,配置一个固定的信息 ,默认的 11111
canal.instance.mysql.slaveId=11111
# enable gtid use true/false
canal.instance.gtidon=false
# todo position info 数据库
canal.instance.master.address=127.0.0.1:3306
# mysql 主库链接时起始的 binlog 文件 通过 show master status 来获取到
canal.instance.master.journal.name=mysql-bin.000013
# 配置偏移量
canal.instance.master.position=154
canal.instance.master.timestamp=
canal.instance.master.gtid=
# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal
#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=
# username/password
# todo 配置用户名和密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
# table regex
# todo 配置监听的表信息 默认是: .*\\..* , 全部的库,全部的表。 配置某个库, 为 springboot.*, 配置具体的一个表。 springboot.user,springboot.student
canal.instance.filter.regex=springboot.user
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
# mq config
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
canal.mq.partition=0
# hash partition config
#canal.mq.partitionsNum=3
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#################################################
bin/start.bat 文件 启动
1.1.4 版本之前可能会报错。
修改 startup.bat 脚本:
再重启启动即可。
这个服务器,必须要全程启动中.
其中 springboot.user 的约束 ddl
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(15) DEFAULT NULL,
`sex` varchar(20) DEFAULT NULL,
`age` int(6) DEFAULT NULL,
`description` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
Canal 服务器配置成功。