# canal-instance **Repository Path**: wang-bata/canal-instance ## Basic Information - **Project Name**: canal-instance - **Description**: canal实列demo - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-07-28 - **Last Updated**: 2023-06-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # canal搭建+案例教程 标签(空格分隔): canal --- 1. canal产生的背景 2. 什么是canal? 3. canal-server是什么,有什么作用? 4. mysql数据库开启binlog功能 5. docker搭建canal-server 服务端 6. canal-instance 实列开发 ## 1: canal产生的背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。ps.目前内部使用的同步,已经支持mysql5.x和oracle部分版本的日志解析. 基于日志增量订阅&消费支持的业务: 1. 数据库镜像 2. 数据库实时备份 3. 多级索引 (卖家和买家各自分库索引) 4. search build 5. 业务cache刷新 6. 价格变化等重要业务消息 ## 2:什么是canal? canal译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 从这句话理解到了什么? 基于MySQL,并且通过MySQL日志进行的增量解析,这也就意味着对原有的业务代码完全是无侵入性的。 工作原理:解析MySQL的binlog日志,提供增量数据。 基于日志增量订阅和消费的业务包括 ![canal数据同步原理图][1] 工作原理 - canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump - 协议 MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) canal - 解析 binary log 对象(原始为 byte 流) ## 3:canal-server是什么,有什么作用? 负责解析MySQL的binlog日志,传递增量数据给客户端或者消息中间件 ## 4. mysql数据库开启binlog功能 1. 对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下 > log-bin=mysql-bin # 开启 binlog > binlog-format=ROW # 选择 ROW 模式 > server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复 注意:针对阿里云 RDS for MySQL , 默认打开了 binlog , 并且账号默认具有 binlog dump 权限 , 不需要任何权限或者 binlog 设置,可以直接跳过这一步 2. 授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant > CREATE USER canal IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ; FLUSH PRIVILEGES; ## 5. docker搭建canal-server 服务端 1:获取最新版本镜像 > docker pull canal/canal-server:latest 2:启用零时容器 > docker run --name canal-server -d canal/canal-server 3:进入到外面需要挂载的目录/data/canal-1.1.5/canal/conf,拷贝配置文件到容器外挂载 > docker cp canal-server:/home/admin/canal-server/conf/canal.properties./ > docker cp canal-server:/home/admin/canal-server/conf/test/instance.properties ./ 4:docker创建canal-server容器 > docker run --name canal-server -p 11111:11111 -v /data/canal-1.1.5/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties -v /data/canal-1.1.5/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties -v /data/canal-1.1.5/canal/logs:/home/admin/canal-server/logs -d canal/canal-server 5:进入容器内部查看启动日志 > docker exec -it canal-server /bin/bash ## 5. canal-instance 实列开发 [canal-instance gitee:地址][2] [1]: https://camo.githubusercontent.com/63881e271f889d4a424c55cea2f9c2065f63494fecac58432eac415f6e47e959/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f32303139313130343130313733353934372e706e67 [2]: https://gitee.com/wang-bata/canal-instance.git