一. canal 简介
canal是阿里巴巴开发的一套能够实时监控数据库变更的工具工程。实用性非常强大。主要支持的数据库是MySQL。能够通过监控MySQL二进制日志的方式,实时洞察数据库的增删改操作。
源码地址:https://github.com/alibaba/canal/
功能作用:能够实现数据库同步、监控数据库、等需要实时洞察数据库变动的业务场景
maven依赖:需要手动安装maven依赖,源码下载地址:https://github.com/chenqian56131/spring-boot-starter-canal,下载后进入
starter-canal
目录,CMD指定mvn install 即可安装完成在项目中导入依赖:
<dependency> <groupId>com.xpand</groupId> <artifactId>starter-canal</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
1. canal的原理分析
官方给出的架构图:
原理分析:MySQL数据库开启二进制文件日志后,所有的操作都会被二进制文件记录。canal程序绑定MySQL后,通过读取二进制日志文件,来获取数据的变动。就相当于监听了MySQL日志的slave从数据库。从而实现能够动态监听的作用。
使用步骤:
①安装canal server,配置需要监听的MySQL数据库,并启动
②在java程序中导入依赖,配置文件连接到canal server
③通过canal提供的API编写方法完成数据库的监听
二. canal监听MySQL示例
通过下面的demo,演示canal是如何监听MySQL的,本例中的MySQL与canal server均部署在同一台服务器
1. 开启mysql二进制日志,并创建canal账号
查看是否开启二进制日志:show variables like 'log_bin'; ON为开启,OFF为关闭
MySQL的二进制日志一定要开启,才能够保证canal能够实时监听。本例的MySQL以及canal都是通过docker容器运行。
-- 通过docker安装的mysql配置文件路径:/etc/mysql/mysql.conf.d 下的mysqld.cnf
-- 直接安装在Linux上的MySQL配置文件: /etc/my.cnf
在配置文件中添加如下配置:
log-bin=mysql-bin
server-id=123321
其中mysql-bin代表的是basename就是生成二进制日志文件的前缀部分,默认的位置在datadir目录下
server-id需要是唯一的。详情介绍可以参考博客:https://www.linuxidc.com/Linux/2018-10/154696.htm
配置canal连接数据库的账号:
CREATE USER 'canal'@'%' IDENTIFIED BY 'canalTest123456@'; //创建用户、密码
GRANT SELECT,REPLICATION SLAVE, REPLICATION CLIENT, SUPER ON *.* TO 'canal'@'%'; //设置访问权限
FLUSH PRIVILEGES;
2. canal server安装
2.1 docker安装canal
①拉取canal的docker镜像:docker pull canal/canal-server
启动canal:docker run -p 11111:11111 -d --name canal canal/canal-server
②启动后进入容器修改配置文件
进入canal的配置文件路径:/home/admin/canal-server/conf
[root@fc805e84d1dc conf]# pwd
/home/admin/canal-server/conf
[root@fc805e84d1dc conf]# ls
canal_local.properties canal.properties example logback.xml metrics spring
[root@fc805e84d1dc conf]#
其中canal_local.properties文件是canal的配置文件,example中的instance.properties配置的是监听数据库的配置
将instance.properties中的数据库信息设置为需要监控的数据库即可
canal.instance.master.address=124.70.157.112:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canalTest123456@
2.2 Linux安装canal
首先下载canal的源码: https://github.com/alibaba/canal/releases
官网配置文档说明:https://github.com/alibaba/canal/wiki/QuickStart
下载的版本是:
canal.deployer-1.1.3.tar.gz
下载后解压到/opt/canal路径下
bin:启动(sh bin/startup.sh)、重启、停止命令
conf:配置文件 数据库的配置文件在:conf/example/instance.pr
logs:日志文件,启动失败可以查看日志文件
修改MySQL实例配置文件conf/example/instance.properties
配置完成后启动canal server : sh bin/startup.sh
注意服务器的11111端口一定要是开放的
3. java程序连接canal监控MySQL
①maven依赖:starter-canal 是手动编译安装到maven的,参考上面简介 ↑
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.xpand</groupId>
<artifactId>starter-canal</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
②application文件配置:
server:
port: 8088
spring:
application:
name: canal-test
canal:
client:
instances:
example:
host: 47.111.172.11
port: 11111
③启动类添加注解:
@EnableCanalClient
④编写监控类:
@CanalEventListener
public class Canalconfig {
/**
* @UpdateListenPoint :注解是监控更新的
* @DeleteListenPoint :注解是监控删除的
* @param eventType :时间类型
* @param rowData: 修改的数据对象,可以通过该对象获取修改前和修改后的数据
*/
@InsertListenPoint
public void insertLs(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
System.out.println("列明:" + column.getName() + " 数据:" + column.getValue());
}
}
/**
* 自定义监控类型
* @param eventType
* @param rowData
*/
@ListenPoint(
eventType = {CanalEntry.EventType.DELETE,CanalEntry.EventType.DELETE}, //指定监控的事件类型
schema = {"db01"}, //指定数据库
table = {"tb_user"}, //指定表
destination = "example" //指定canal实例
)
public void myself(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
}
}
⑤启动测试
当被监控的数据库发生变更时,可发现监控信息