Canal 是阿里巴巴开源的一款基于 MySQL 数据库的增量日志订阅和解析工具,主要用于实现数据的实时同步和流处理。
通过使用 Canal,应用程序可以实现对数据库变更的监听,并将变更的数据实时同步到其他系统,比如消息队列、缓存系统等。
先记一下缓存雪崩的问题,
缓存雪崩是指在我们的系统中,大量的缓存数据在同一时间内失效,导致大量的请求直接打到数据库上,从而引发数据库压力过大甚至宕机。
Canal 可以帮助实现数据库和缓存的实时同步,减少缓存失效对数据库的冲击。但是,要彻底解决缓存雪崩问题,还需要结合其他策略,例如设置不同的缓存过期时间、使用熔断限流机制、引入分布式锁等。
下面开搞Canal,现在大部分用的springboot写项目,这里记录的用springboot集成的canal依赖,
通用的那个依赖包试了一下,没配置的太麻烦了,用法也不一样,日了小狗,所以还是用集成包,少整点配置
这里前提:
你的springboot已经引入了mysql数据库依赖,我这里用的持久层是mybatisPlus。这部分就不记录了
1.安装
1.1装Canal
下载地址:alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com)
我安装的是1.1.4版本,安装好解压 运行start脚本启动一下就行
1.2 依赖
<dependency>
<groupId>top.javatool</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<version>1.2.1-RELEASE</version>
</dependency>
1.3 写下配置
application.yml里面,加上cancal的配置,
我只填写这两个,因为很多配置是默认的,安装好后canal我没动任何配置,所以如果单独自己修改了canal的某个配置,那么这里就要自己去加上修改的东西
canal:
server: 127.0.0.1:11111 # Canal服务器地址和端口
destination: example # Canal目的地名称
记得连接mysql数据库的其它配置自己加上去,我这里就不写了
1.4 mysql数据库给权限
是的,mysql数据库还要给一下权限才可以让canal接入进来,读取mysql数据库的binlog,才可以捕获到增删改事件。
mysql中直接执行一下:
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
解释:
-
CREATE USER canal@'%' IDENTIFIED BY 'canal';
:创建一个新用户canal
,并设置密码为canal
。'%'
表示该用户可以从任何主机连接到MySQL服务器。 -
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT, SUPER ON *.* TO 'canal'@'%';
:给canal
用户授予一系列权限,包括:SELECT
:允许用户查询数据库。REPLICATION SLAVE
:允许用户请求从服务器的binlog。REPLICATION CLIENT
:允许用户查询二进制日志文件的位置。SUPER
:允许用户执行一些超级用户级别的操作,例如获取当前binlog文件的名称和位置。
-
FLUSH PRIVILEGES;
:刷新权限,使更改立即生效。
2.实战
2.1 创建实体类
和数据库的 user用户表字段 对应上
写好表名
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name ="user")
public class User {
@TableId(type = IdType.AUTO)
@Id
private Integer id;
private String name;
private String password;
}
2.2 创建监控器
@Component
@CanalTable(value = "user")
public class UserCanalListener implements EntryHandler<User> {
@Override
public void insert(User user) {
System.out.println("新增了一条数据:" + user);
}
@Override
public void update(User before, User after) {
System.out.println("数据修改前:" + before);
System.out.println("数据修改后:" + after);
}
@Override
public void delete(User user) {
// EntryHandler.super.delete(user);
System.out.println("删除用户user = " + user);
}
}
实现 EntryHandler<实体类>即可,
这里的insert 对应的就是插入数据的操作,我这里 触发插入的操作后,就把 插入的数据打印出来
后面的 update就是更新,delete就是删除。
手动在数据库改一下数据,canal就会监控到事件,执行你的代码,可以触发后修改redis数据库,进行数据和缓存的同步。 也可以自己写其他逻辑,同步其它数据库
3.其它
有人问为什么控制台一直打印:获取消息 : xxxx[id:1] ....
这个是canal在不断的轮询监控,包的位置是这个:top.javatool.canal.client.client.AbstractCanalClient
这个类下面的方法process()会不断执行
this.log.info("获取消息 {}", message);
如果不想在控制台一直看到它输出,可以在application.yml里面改一下
logging:
level:
root: WARN
# 针对特定包或类的日志级别设置
t.j.c.client.client: ERROR
# 或者如果你想要关闭所有DEBUG级别的日志,包括root
DEBUG: OFF
针对这个包,改一下输出级别就行。
4.总结
ok。没总结,很简单,这样就结束了。
标签:Canal,canal,缓存,SpringBoot,数据库,user,mysql From: https://www.cnblogs.com/Hello233/p/18106937