canal是什么?
canal译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
工作原理
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
使用场景
- 通过canal 连接其他数据库进行数据同步
- 连接kafka rocketmq 消息中间件订阅binlog日志的改变
- 连接其他实时计算框架如flink spark streaming等
- 缓存同步 直接订阅binlog日志的变更 更新缓存数据库 如redis
安装
-
MySQL中必须要打开binlog日志功能并且选择binlog日志的格式为row 配置serverId
[mysqld] log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
-
因为canal是伪装MySQL的slave发送dump协议来进行binlog日志的订阅 需要为canal创建一个查询和副本同步的权限的账号
CREATE USER canal IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
-
下载canal相关的包 https://github.com/alibaba/canal/tags
-
解压缩canal包 需要注意的是canal的压缩包解压缩出来是直接一堆文件,需要先建一个目录保存解压缩之后的文件
mkdir /usr/local/canal tar -zxvf canal.deployer-1.1.6.tar.gz -C /usr/local/canal/
-
查看canal conf目录配置文件
-rwxrwxrwx. 1 root root 319 Jun 22 2021 canal_local.properties # canal admin相关配置 -rwxrwxrwx. 1 root root 6509 Oct 9 2021 canal.properties #canal配置文件 drwxrwxrwx. 2 root root 33 Jul 10 04:36 example # 对应了canal配置文件用一个destinations中的配置 -rwxrwxrwx. 1 root root 4429 May 20 15:26 logback.xml # 日志配置 drwxrwxrwx. 2 root root 39 Jul 10 04:36 metrics # 监控 drwxrwxrwx. 3 root root 149 Jul 10 04:36 spring # spring相关
################################################# ######### destinations ############# ################################################# # 多个由,分割 如example1,exmple2 # 对应监听的实例配置文件在conf目录下创建exmaple1,example2目录 canal.destinations = example # conf root dir canal.conf.dir = ../conf
-
修改example目录下的配置文件 instance.properties
canal.instance.master.address=node1:3306 #修改成master的MySQL地址 canal.instance.master.journal.name= canal.instance.master.position= canal.instance.master.timestamp= canal.instance.master.gtid= # MySQL连接信息 canal.instance.dbUsername=canal canal.instance.dbPassword=canal canal.instance.connectionCharset = UTF-8 # enable druid Decrypt database password canal.instance.enableDruid=false # mq config 如果需要连接MQ 以下是MQ相关配置 # 主题名称 canal.mq.topic=example # dynamic topic route by schema or table regex #canal.mq.dynamicTopic=mytest1.user,topic2:mytest2\\..*,.*\\..* # 分区信息 canal.mq.partition=0 # hash partition config #canal.mq.enableDynamicQueuePartition=false #canal.mq.partitionsNum=3 #canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6 #canal.mq.partitionHash=test.table:id^name,.*\\..*
-
查看canal启动日志 log/exmaple/example.log