# Canal **Repository Path**: naclnezn/canal ## Basic Information - **Project Name**: Canal - **Description**: Canal 是阿里开源的一款 MySQL 数据库增量日志解析工具,提供增量数据订阅和消费。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2024-08-27 - **Last Updated**: 2025-02-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Canal ## 介绍 Canal 是阿里开源的一款 MySQL 数据库增量日志解析工具,提供增量数据订阅和消费 ![1724735503620.png](imgs/1724735503620.png) ## 工作原理 ### MySQL主备复制原理 1. MySQL master 将数据变更写入二进制日志(binary log), 日志中的记录叫做二进制日志事件(binary log events,可以通过 show binlog events 进行查看) 2. MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log) 3. MySQL slave 重放 relay log 中事件,将数据变更反映到它自己的数据 ### Canal 工作原理 1. Canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议 2. MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 Canal ) 3. Canal 解析 binary log 对象(原始为 byte 流) ## 搭建 ### 查看日志是否开启 ```sql show variables like 'log_%'; ``` ![1724736101854.png](imgs/1724736101854.png) ### 安装服务 ```shell docker pull canal/canal-server:1.1.7 ``` 先启动Canal,用于复制properties配置文件 ```shell docker run -p 11111:11111 --name canal -d canal/canal-server:1.1.7 ``` 创建文件夹 ```shell mkdir -p /home/docker/canal/conf chmod 777 /home/docker/canal ``` 复制配置文件并删除 ```shell docker cp canal:/home/admin/canal-server/conf/example/instance.properties /home/docker/canal/conf docker stop canal docker rm canal ``` 修改instance.properties ```properties # 不重复 不和mysql的一样即可 canal.instance.mysql.slaveId=0 # mysql 地址 canal.instance.master.address=192.168.0.234:3306 # 用户名密码 canal.instance.dbUsername=root canal.instance.dbPassword=root # table regex .*\\..*表示监听所有表 也可以写具体的表名,用,隔开 canal.instance.filter.regex=.*\\..* # mysql 数据解析表的黑名单,多个表用,隔开 canal.instance.filter.black.regex= # 目的地 可以认为是一个队列 不需要更改 canal.mq.topic=example ``` 再启动 ```shell docker run --name canal \ -p 11111:11111 \ -v /home/docker/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties \ -d canal/canal-server:latest ```