前言:作为一个中间件canal,可以实时的监听到mysql 中表结构及数据的变化, 项目中只需要接入canal ,不需要我们在业务中进行aop 或者接口的编写就可以及时的收到数据的变化。
1 介绍:
Canal是阿里巴巴开源的一款基于MySQL数据库的增量数据订阅和消费组件,能够把MySQL的binlog日志解析,转换成多种类型的事件回调给应用消费或同步到数据存储或搜索引擎等其他数据终端。它提供了类似数据流的方式,对数据进行持续性同步和协作,大幅度提升了数据处理的效率。
注意:
canal server是一个基于Java编写的应用程序,需要在JVM上运行。canal server基于Netty作为网络通信框架,并依赖于RocketMQ(或者其他消息队列)来实现消息的发布和订阅机制。因此,在使用canal server之前,需要首先安装和配置Java环境。
从canal server的官方文档可以看到,canal server所依赖的Java版本为JDK1.8或更高版本。在下载并安装JDK之后,可以通过在控制台输入java -version来检查Java环境是否已经安装成功。此外,为了保证canal server的性能和稳定性,建议采用优化后的JVM参数进行配置。
总之,canal server是基于Java开发的,需要在JVM上运行,因此需要先安装和配置Java环境。在使用canal server之前,建议对JVM参数进行合理的优化,以获得更好的性能和稳定性。
2 window 安装:
2.1 canal 实现原理:
既然canal 是服务化的,所以在使用之前搭建canal 的服务,至于为什么要搭建canal 服务 ,可以从canal 的工作原理中得到答案;
从上图可以得知:
- canal 的实现是将自己伪装成mysql 的 从节点 ;
- 先发送请求给到主节点,主节点在有数据变化时就可以推送数据给到 从节点;
- 从节点接到数据后先写到log 中,然后在由canal 中其它的线程对log 数据进行解析;
- 解析的数据就可以提供给消费者进行消费;
从它的原理我们可以知道一下几点:
- canal 服务是需要连接到mysql 的一个主/从 节点,以便于接收到binlog 的日志;
- canal 可以解析binlog 然后自由的完成其它的操作,如 转给消费者进行数据的消费;
- canal 作为一个服务,为了保证其高可用的特性,肯定也是需要集群的;
所以我们可以得到下面的图:canal 可以作为中转站将消息完成中转;
2.2 既然是基于mysql 的binlog 实现,显然需要先打开mysql 的binlog:
开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下:
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
配置完成记得重启Mysql的服务;可以用下面命令检查是否开启了binlog,ON 为打开:
show variables like 'log_bin';
2.3 在Mysql 中创建一个用户用于canal 连接使用:
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
其中:
- USER canal 用户名为 canal ;
- DENTIFIED BY ‘canal’ 密码为canal;
- GRANT 为刚才创建的用户赋予权限;
- FLUSH 进行下权限的刷新操作;
2.4 通过下面的地址,下载一个官方已经为我们封装好的canal 服务,这里以1.1.6 版本为例:
https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.deployer-1.1.6.tar.gz
由于网络原因,可能有些人这个地址无法打开,可以通过下面的网盘进行下载:
https://pan.baidu.com/disk/main?errmsg=Auth+Login+Params+Not+Corret&errno=2&ssnerror=0#/index?category=all&path=%2Fcsdn%2Ftool%2Fcanal
下载之后进行解压,解压后的目录结果如下:
这里简单对目录进行下说明:
- bin 脚本执行,window 和linux 的脚本命令都在这里,包括启动,停止,重启,通过名字还是非常清楚的,其中window 需要执行的就是 startup.bat ;
- conf 为配置文件,其中canal.properties 为canal 系统级别的配置文件;
- example 目录为官网给出的一个示例目录,其中instance.properties 为example 的配置文件:
2.5 canal 参数配置:
2.5.1 修改canal.properties 系统级别的配置:
example只是官网给的示例,需要增加我们自己的数据库实例
canal.destinations = example,你的数据实例名称
实例名称对应canal 要连接的数据库名称,如果要监听多个,则以英文的逗号进行分隔:
如: canal.destinations = example,biglog,bluegrass
2.5.2 通过bin/startup.bat 先启动下,此步骤的目的在与让canal 可用帮我们生成我们刚才在canal.destinations 定义的数据库实例目录,及其目录下的一些文件:
如果在canal.destinations 定义了多个数据库实例,则此时会生成多个实例 目录;
2.5.3 从example 目录下拷贝一个instance.properties 到canal 帮我们生成的数据库实例目录下:
instance.properties 文件是改实例的配置文件,其中我们需要修改的是,改实例需要连接的数据库地址,及其用户和密码:
# position info
# mysql 连接地址必改
canal.instance.master.address=localhost:3406
# mysql 连接用户名和密码 必改 这里可以使用2.3 步骤创建的用户
canal.instance.dbUsername=root
canal.instance.dbPassword=123
2.5.4 配置完成后 重新启动canal 服务;
通过日志查看启动情况:
logs/canal/canal.log:
logs/数据库实例/数据库实例.log 查看改实例是否启动成功:
至此canal 服务启动完成;如果需要在linux 中运行canal 服务,只需要执行startup.sh 启动,stop.sh 停止,其它的操作和window 基本相同;
3 参考:
3.1 canal 服务window 安装官网教程;
3.2 canal 服务参数介绍;