springboot整合canal监控mysql数据库

一:canal简介:

canal是阿里巴巴的开源项目,可以用来监控数据库的变化,从而获取新增数据或者改变数据。阿里巴巴在杭州和美国的双机房部署,存在跨机房同步业务的需求,阿里系公司开始逐步尝试基于数据库的日志解析,获取增量变更进行同步,canal就这样诞生了。canal只支持mysql数据库。

二:canal原理:

1.canal模拟mysql slave的交互协议,伪装自己是mysql的从属机(mysql slave),向mysql master发送dump协议。
2.mysql master收到dump请求,开始推送binary log给slave(也就是canal)。
3.canal解析binary log对象(原始为byte流)。得到变更数据。springboot整合canal监控mysql数据库_第1张图片

三:环境准备

3.1:我们需要mysql开启binlog模式
(1)查看当前mysql是否开启binlog模式。如果log_bin的值为OFF是未开启,为ON是已开启。

SHOW VARIABLES LIKE '%log_bin%'

springboot整合canal监控mysql数据库_第2张图片我们可以直接修改log_bin为ON。

	(2)修改/etc/my.cnf 需要开启binlog模式。 修改完成之后,重启mysqld服务
[mysqld]
log‐bin=mysql‐bin 
binlog‐format=ROW 
server_id=1

3.2:安装canal服务端
(1)下载canal:https://download.csdn.net/download/weixin_49452054/12656679
(2)下载之后 上传到linux系统中,解压缩到指定的目录/usr/local/canal
修改 exmaple下的实例配置

vi conf/example/instance.properties

springboot整合canal监控mysql数据库_第3张图片(3)指定读取位置:进入mysql中执行下面语句查看binlog所在位置

mysql> show master status;

显示如下:
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐+
| mysql‐bin.000001 | 120 | | | | +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐+
1 row in set (0.00 sec)

如果file中binlog文件不为 mysql-bin.000001 可以重置mysql

mysql> reset master;

4.查看canal配置文件

vim /usr/local/canal/conf/example/meta.dat 

找到对应的binlog信息更改一致即可

"journalName":"mysql‐bin.000001","position":120,"

最后 启动canal

[root@localhost canal]# ./bin/startup.sh

四:springboot整合canal

4.1:创建canal服务poom文件引入依赖

<dependency> 
	<groupId>com.alibb</groupId>
	 <artifactId>starter‐canal</artifactId>
  	<version>0.0.1‐SNAPSHOT</version
</dependency>

这里需要注意下:因为maven中央仓库没有canal的jar包。我们需要在网上下载canal的jar包。
在本地仓库的com目录下创建alibb(名字随意,groupId和这个目录保持一致就行)。
然后将下载的压缩文件解压到本地仓库刚才创建的目录下。

下载地址:https://download.csdn.net/download/weixin_49452054/12656679

(3)添加配置文件application.properties

canal.client.instances.example.host=192.168.200.128 
canal.client.instances.example.port=11111 
canal.client.instances.example.batchSize=1000

4.2:创建 canal 启动类并添加@EnableCanalClient

@SpringBootApplication 
@EnableCanalClient //canal客户端的注解
public class CanalApplication {
     
 public static void main(String[] args) {
      
 SpringApplication.run(CanalApplication.class, args);
 	}
 }

4.3:创建canal监听类

@CanalEventListener //canal监听注解
public class AdListener {
      
/**
*@ListenPoint 注解
*schema ="要监听的数据库"
*table = "要监听的表"
*/
	@ListenPoint(schema = "db", table = "table") 
	public void tableUpdate(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
      		
	System.err.println("更新之前的数据"); 
	rowData.getBeforeColumnsList().forEach((c)>
	System.out.println(c.getName() + " :: " + c.getValue())); 
	System.err.println("更新之后的数据");
	rowData.getAfterColumnsList().forEach((c)> 
	System.out.println(c.getName() + " :: " + c.getValue()));
	 } 
}

当数据库db中的table表中的数据发生改变就会执行tableUpdate()方法。我们可以在该方法中写业务逻辑,完成相应的业务。

你可能感兴趣的:(canal,mysql)