前言:如何保证redis与mysql数据一致性呢? 网上大部份答案都是延迟双删, 现在我就将另外一个解方案分享给大家,我自己也在最近项目中应有上来了。
1、开启 biglog 日志 (根据自己mysql配置文件位置更改)
vim /etc/my.cnf
添加配置
[mysqld]
log-bin=mysql-bin # 开启binlog
binlog-format=ROW # 选择ROW模式
server_id=1 # 配置MySQL replaction需要定义,不和Canal的slaveId重复即可
2、重启MySQL ,查看配置是否生效
show variables like 'log_bin';
3. RabbitMQ 队列创建
- 添加交换机 canal_exchange
- 添加队列 canal_queue
- 队列绑定交换机
4. Canal 配置和启动
Canal Server下载
- 官方文档:Home · alibaba/canal Wiki · GitHub
- 项目地址:GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件
- 下载地址:Releases · alibaba/canal · GitHub
进入下载地址,选择 canal.deployer-1.1.5.tar.gz
Canal Server配置
需要配置的东西就两项,一个是监听数据库配置,另一个是 RabbitMQ 连接配置。
改动的两个文件分别是 Canal 配置文件 canal.properties
和 实例配置文件 instance.properties
㊙️:一个 Server 可以配置多个实例监听 ,Canal 功能默认自带的有个 example 实例,本篇就用 example 实例 。如果增加实例,复制 example 文件夹内容到同级目录下,然后在 canal.properties
指定添加实例的名称。
解压出来的目录信息:
canal.properties
配置 Canal 服务方式为 RabbitMQ 和连接配置
进入到conf文件,打开canal.properties
把原理tcp模式改成rabbitMQ
到这里我们将canal连接rabbitMQ配置完成
instance.properties
监听数据库配置
cd /example 目录下
5. SpringBoot 整合 Canal + RabbitMQ
引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
RabbitMQ连接配置
spring:
rabbitmq:
host: ip
port: 端口
username: 用户名
password: 密码
RabbitMQ 监听同步缓存
返回json映射bean类 CanalMessage
/**
* @author yueF_L
* @version 1.0
* @date 2022-04-10 0:30
* Canal消息接收实体类
*/
@NoArgsConstructor
@Data
public class CanalMessage<T> {
@JsonProperty("type")
private String type;
@JsonProperty("table")
private String table;
@JsonProperty("data")
private List<T> data;
@JsonProperty("database")
private String database;
@JsonProperty("es")
private Long es;
@JsonProperty("id")
private Integer id;
@JsonProperty("isDdl")
private Boolean isDdl;
@JsonProperty("old")
private List<T> old;
@JsonProperty("pkNames")
private List<String> pkNames;
@JsonProperty("sql")
private String sql;
@JsonProperty("ts")
private Long ts;
}