1. 简介
Canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费功能。
工作原理
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 流)
mysql的binlog
binlog有三种模式:STATEMENT
、ROW
、MIXED
STATEMENT 记录的是执行的sql语句
ROW 记录的是真实的行数据记录
MIXED 记录的是1+2,优先按照1的模式记录
比如:
对应STATEMENT
模式只是记录了当前执行的sql,而对应ROW
模式则有可能有成千上万条记录(当然这取决于你user表的记录数)
2. 可以干什么
基于日志增量订阅和消费的业务包括
数据库镜像
数据库实时备份
索引构建和实时维护(拆分异构索引、倒排索引等)
业务 cache 刷新
带业务逻辑的增量数据处理
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
3. 安装
原生安装请参考:https://github.com/alibaba/canal/wiki/QuickStart
3.1 docker-compose安装
3.1.1 创建同步用户
如果想查看mysql server的相关配置可以参考 https://www.cnblogs.com/ludangxin/p/16358928.html 中的master配置
3.1.2 修改配置文件
首先启动一个临时的容器用于 将容器中的配置文件信息copy到宿主机
canal-server/conf
配置文件目录结构如下
修改配置文件信息
canal.properties
我们使用默认的配置信息 即:canal.serverMode = tcp
example/instance.properties
中配置mysql server连接信息 如下:
mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠()
常见例子:
所有表:.* or .\…
canal schema下所有表: canal\…*
canal下的以canal打头的表:canal.canal.*
canal schema下的一张表:canal.test1
多个规则组合使用:canal\…*,mysql.test1,mysql.test2 (逗号分隔)
注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解
析sql,所以无法准确提取tableName进行过滤)
3.1.3 启动canal
docker-compose.yaml
如下
因为canal需要读取mysql server的bin-log所以需要设置加入到mysql server的网络中去
4. springboot 测试
tips:可参考 https://github.com/NormanGyllenhaal/canal-client
4.1 添加依赖
4.2 添加配置
4.3 监听canal数据
4.4 测试
user表信息如下
测试新增
查看控制台输出如下
测试修改
查看控制台输出如下
测试删除
查看控制台输出如下
5. rabbit mq 测试
5.1 修改canal配置
canal.properties
修改如下
example/instance.properties
添加路由规则
5.2 springboot consumer
5.2.1 添加依赖
5.2.2 添加配置
5.2.3 添加 consumer
5.3 启动测试
先启动项目让程序自动建立所需mq中的交换机和队列
测试新增
查看控制台输出如下
测试修改
查看控制台输出如下
测试删除
查看控制台输出如下
6. canal admin管理canal
详情查看:https://gitee.com/zhengqingya/docker-compose
使用手册:https://github.com/alibaba/canal/wiki/Canal-Admin-Guide
原生安装:https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart
创建canal admin 数据库 canal_manager
运行初始化sqlLiunx/canal/canal_admin/canal_manager.sql
文件内容如下:
CREATE DATABASE `canal_manager` ;
USE `canal_manager`;
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0 ;
DROP TABLE IF EXISTS `canal_adapter_config`;
CREATE TABLE `canal_adapter_config` (
`id` bigint (20 ) NOT NULL AUTO_INCREMENT,
`category` varchar (45 ) NOT NULL ,
`name` varchar (45 ) NOT NULL ,
`status` varchar (45 ) DEFAULT NULL ,
`content` text NOT NULL ,
`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
) ENGINE= InnoDB DEFAULT CHARSET= utf8;
DROP TABLE IF EXISTS `canal_cluster`;
CREATE TABLE `canal_cluster` (
`id` bigint (20 ) NOT NULL AUTO_INCREMENT,
`name` varchar (63 ) NOT NULL ,
`zk_hosts` varchar (255 ) NOT NULL ,
`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
) ENGINE= InnoDB DEFAULT CHARSET= utf8;
DROP TABLE IF EXISTS `canal_config`;
CREATE TABLE `canal_config` (
`id` bigint (20 ) NOT NULL AUTO_INCREMENT,
`cluster_id` bigint (20 ) DEFAULT NULL ,
`server_id` bigint (20 ) DEFAULT NULL ,
`name` varchar (45 ) NOT NULL ,
`status` varchar (45 ) DEFAULT NULL ,
`content` text NOT NULL ,
`content_md5` varchar (128 ) NOT NULL ,
`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`),
UNIQUE KEY `sid_UNIQUE` (`server_id`)
) ENGINE= InnoDB DEFAULT CHARSET= utf8;
DROP TABLE IF EXISTS `canal_instance_config`;
CREATE TABLE `canal_instance_config` (
`id` bigint (20 ) NOT NULL AUTO_INCREMENT,
`cluster_id` bigint (20 ) DEFAULT NULL ,
`server_id` bigint (20 ) DEFAULT NULL ,
`name` varchar (45 ) NOT NULL ,
`status` varchar (45 ) DEFAULT NULL ,
`content` text NOT NULL ,
`content_md5` varchar (128 ) DEFAULT NULL ,
`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`),
UNIQUE KEY `name_UNIQUE` (`name`)
) ENGINE= InnoDB DEFAULT CHARSET= utf8;
DROP TABLE IF EXISTS `canal_node_server`;
CREATE TABLE `canal_node_server` (
`id` bigint (20 ) NOT NULL AUTO_INCREMENT,
`cluster_id` bigint (20 ) DEFAULT NULL ,
`name` varchar (63 ) NOT NULL ,
`ip` varchar (63 ) NOT NULL ,
`admin_port` int (11 ) DEFAULT NULL ,
`tcp_port` int (11 ) DEFAULT NULL ,
`metric_port` int (11 ) DEFAULT NULL ,
`status` varchar (45 ) DEFAULT NULL ,
`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
) ENGINE= InnoDB DEFAULT CHARSET= utf8;
DROP TABLE IF EXISTS `canal_user`;
CREATE TABLE `canal_user` (
`id` bigint (20 ) NOT NULL AUTO_INCREMENT,
`username` varchar (31 ) NOT NULL ,
`password` varchar (128 ) NOT NULL ,
`name` varchar (31 ) NOT NULL ,
`roles` varchar (31 ) NOT NULL ,
`introduction` varchar (255 ) DEFAULT NULL ,
`avatar` varchar (255 ) DEFAULT NULL ,
`creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
) ENGINE= InnoDB DEFAULT CHARSET= utf8;
SET FOREIGN_KEY_CHECKS = 1 ;
BEGIN ;
INSERT INTO `canal_user` VALUES (1 , 'admin' , '6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' , 'Canal Manager' , 'admin' , NULL , NULL , '2019-07-14 00:05:28' );
COMMIT ;
SET FOREIGN_KEY_CHECKS = 1 ;
docker-compose.yaml
如下
启动服务/访问http://localhost:8089/#/canalServer/nodeServers
登陆 用户名/密码:admin/123456
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示