本文主要记录安装canal和canal-php链接canal使用!
canal简介

canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括
- 数据库镜像 
- 数据库实时备份 
- 索引构建和实时维护(拆分异构索引、倒排索引等) 
- 业务 cache 刷新 
- 带业务逻辑的增量数据处理 
- 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x - 工作原理- 1、MySQL主备复制原理  
- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看) 
- MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log) 
- MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据 
2、canal 工作原理
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议 
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) 
- canal 解析 binary log 对象(原始为 byte 流) - 准备
- 对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下 
| 1 | [mysqld] | 
注意:针对阿里云 RDS for MySQL , 默认打开了 binlog , 并且账号默认具有 binlog dump 权限 , 不需要任何权限或者 binlog 设置,可以直接跳过这一步
- 授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant
| 1 | CREATE USER canal IDENTIFIED BY 'canal'; | 
安装Canal并配置
- 下载 canal, 访问 release 页面 , 选择需要的包下载, 如以 1.1.7 版本为例(服务器下载慢可以本地下载好上传至服务器)
| 1 | wget https://github.com/alibaba/canal/releases/download/canal-1.1.7-alpha-2/canal.deployer-1.1.7-SNAPSHOT.tar.gz | 
- 解压缩
| 1 | mkdir /tmp/canal | 
- 配置修改 - 1、首先获取mysql binlog日志名称 和 binlog偏移量 参数值 
 命令:- 1 - show master status - 截图:  
 2、修改canal配置- 1 - vim conf/example/instance.properties - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20- ## mysql serverId 
 canal.instance.mysql.slaveId = 1234
 #position info,需要改成自己的数据库信息
 canal.instance.master.address = 127.0.0.1:3306
 # binlog日志名称
 canal.instance.master.journal.name=mysql-bin.000009
 # mysql主库链接时起始的binlog偏移量
 canal.instance.master.position = 154
 canal.instance.master.timestamp =
 #canal.instance.standby.address =
 #canal.instance.standby.journal.name =
 #canal.instance.standby.position =
 #canal.instance.standby.timestamp =
 #username/password,需要改成自己的数据库信息(上面授权的canal账号)
 canal.instance.dbUsername = canal
 canal.instance.dbPassword = canal
 canal.instance.defaultDatabaseName =
 canal.instance.connectionCharset = UTF-8
 #table regex
 canal.instance.filter.regex = .\*\\\\..\*- 3、启动 - 1 - sh bin/startup.sh - 查看 server 日志1 cat logs/canal/canal.log 1 
 2
 3
 4
 52023-03-28 20:23:27.202 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## set default uncaught exception handler 
 2023-03-28 20:23:27.211 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations
 2023-03-28 20:23:27.223 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.
 2023-03-28 20:23:27.263 [main] INFO com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[172.17.0.1(172.17.0.1):11111]
 2023-03-28 20:23:28.763 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......
- 查看 instance 的日志1 cat logs/example/example.log 1 
 2
 3
 42023-03-28 20:23:28.710 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example 
 2023-03-28 20:23:28.720 [main] WARN c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^.*\..*$
 2023-03-28 20:23:28.720 [main] WARN c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter : ^mysql\.slave_.*$
 2023-03-28 20:23:28.724 [main] INFO c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
 - 4、关闭 - 1 - sh bin/stop.sh 
- 查看 server 日志
php客户端 canal-php 链接Canal 测试
使用canal php 客户端: canal-php
1、构建canal php客户端
| 1 | $ composer require xingwenge/canal_php | 
2、建立与Canal的连接
src/sample/client.php 文件
| 1 | try { | 
3、测试
首先运行client.php:
| 1 | php src/sample/client.php | 
其次,我们执行sql修改一条数据:
UPDATE test222.user SET name = ‘李四888’ WHERE id = 2 AND name = ‘李四’ LIMIT 1
控制台可以看到如下信息:
至此,canal-php链接canal成功并拿到对应的binlog日志变更记录,可以进行业务逻辑操作。
总结:
Canal的好处在于对业务代码没有侵入,因为是基于监听binlog日志去进行同步数据的。实时性也能做到准实时,其实是很多企业一种比较常见的数据同步的方案。
通过上面的学习之后,我们应该都明白canal如何安装和canal-php用法。实际上这仅仅只是入门,因为实际项目中我们不是这样玩的…
实际项目我们是配置MQ模式,配合RocketMQ或者Kafka,canal会把数据发送到MQ的topic中,然后通过消息队列的消费者进行处理。
 
         
              