canal简介
canal是什么
canal [kə'næl] ,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
基于日志增量订阅和消费的业务包括
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务 cache 刷新
- 带业务逻辑的增量数据处理
canal开启
默认是不开启的,开启后会有1%的性能影响
工作原理
MySQL主备复制原理
- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
- MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
- MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
canal 工作原理
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
canal的三种同步方式
statement(少使用)
- 同步mysql的指令
- 优点:binlog占用空间小
- 缺点:数据的一致性不能保证,比如
update m_user set age = 1 where time = now();
row(推荐使用)
- 同步mysql每行数据
- 优点:保证数据的绝对的一致性,不管用了什么函数什么计算,它只记录结果
- 缺点:占用空间大
mixed(尽量不使用)
- 混合使用两种方式,优先使用statement的模式
- 优点:不好说
- 缺点:时不时的出现乱七八糟的异常情况
canal EventStore数据结构的重要的四个名称
- 三个cursor
- ack 数据消费成功的最后一次消费位置
- get 数据订阅获取的最后一次提取位置
- put Sink模块进行数据存储的最后一次写入位置
- Ringbuffer 环形缓冲区
canal的运用场景
1.数据同步
2.数据库实时监控
3.数据分析和挖掘
4.数据库备份
5.数据库聚合
6.数据库的升级及迁移
开启mysql的binlog功能
find / -name "my.cnf"查找配置文件路径- 添加以下配置
server-id=1 # 集群时用于区分实例,不能与canal的slaveId相同
binlog-format=row # binlog的记录方式
#binlog-do-db=xxxx # 不指定时,会记录所有的库
log-bin=/usr/local/mysql/mysql-bin-log # binlog存放地址
3. 在客户端中也可以查看 show variables like 'log%' show variables like 'bin%'
4. 查看是否开启成功 show variables like 'log_bin
canal的安装与配置
下载
配置canal.properties
canal.port = 11111
# tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ
canal.serverMode = tcp
# 监控哪些库,用逗号分割,会扫描以这两个名称命名的文件夹里的配置
canal.destinations = practice,study
根据上面配置的canal.destinations = practice,study。复制并生成对应的配置文件
复制example文件夹,为practice、study
进入practice/study文件夹,配置专属文件
# 不要重复
canal.instance.mysql.slaveId=1001
# 监控地址
canal.instance.master.address=127.0.0.1:3306
# username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=12345678
canal.instance.connectionCharset = UTF-8
启动canal
到bin目录下,mac就执行sh startup.sh
在java中操作Canal
引入canal依赖
// Canal支持
implementation 'com.alibaba.otter:canal.client:1.1.6'
编写测试代码
Canal的数据结构
阿里云的官方文档
github.com/alibaba/can… github.com/alibaba/can…