canal

98 阅读3分钟

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 流)

image.png

canal的三种同步方式

statement(少使用)

  1. 同步mysql的指令
  2. 优点:binlog占用空间小
  3. 缺点:数据的一致性不能保证,比如update m_user set age = 1 where time = now();

image.png

row(推荐使用)

  1. 同步mysql每行数据
  2. 优点:保证数据的绝对的一致性,不管用了什么函数什么计算,它只记录结果
  3. 缺点:占用空间大

mixed(尽量不使用)

  1. 混合使用两种方式,优先使用statement的模式
  2. 优点:不好说
  3. 缺点:时不时的出现乱七八糟的异常情况

canal EventStore数据结构的重要的四个名称

  1. 三个cursor
    • ack 数据消费成功的最后一次消费位置
    • get 数据订阅获取的最后一次提取位置
    • put Sink模块进行数据存储的最后一次写入位置
  2. Ringbuffer 环形缓冲区

image.png

canal的运用场景

1.数据同步

image.png

2.数据库实时监控

image.png

3.数据分析和挖掘

image.png

4.数据库备份

image.png

5.数据库聚合

image.png

6.数据库的升级及迁移

image.png

开启mysql的binlog功能

  1. find / -name "my.cnf" 查找配置文件路径
  2. 添加以下配置
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

image.png

canal的安装与配置

下载

github.com/alibaba/can…

image.png

配置canal.properties

canal.port = 11111
# tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ
canal.serverMode = tcp
# 监控哪些库,用逗号分割,会扫描以这两个名称命名的文件夹里的配置
canal.destinations = practice,study

根据上面配置的canal.destinations = practice,study。复制并生成对应的配置文件

复制example文件夹,为practice、study

image.png

进入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的数据结构

image.png

阿里云的官方文档

github.com/alibaba/can… github.com/alibaba/can…

image.png