基于mysql和canal 实现的多级缓存同步功能

总体流程

  1. 开启mysql的 主从复制的 binlog 日志
  2. 部署 canal服务 并配置监听的库表
  3. springboot集成canal

mysql相关

开启mysql 的主从复制

如果不会 docker 部署 可以点击 docker部署mysql
修改配置文件 my.cnf 。在/etc/mysql 目录下或者 /etc目录下

[mysqld]  
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=test

配置解读:

#备注:

  1. #server-id 服务器唯一标识。
  2. #log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
  3. #log_bin_index指定了binlog索引文件的基础命名和存储路径,也可以通过–log-bin-index来指定,index文件存储了启用的binglog文件名
  4. #binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
  5. #binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
  6. #其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。

添加用户

创建用户并给用户指定权限 ,改用户 用于数据同步 既然是 canal使用,用户名和密码就设置为canal吧

create user canal@'%' IDENTIFIED by 'canal'; 

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
FLUSH PRIVILEGES;

部署canal

拉去canal镜像
docker部署canal的官方文档

docker pull canal/canal-server:v1.1.5    这个文件有900m

docker load 命令:
从一个存储文件或一个标准输入流中加载一个镜像
语法
docker load [OPTIONS] +准备的镜像文件名

参数说明
-i : --input string :读取一个tar文件,取代标准输入
docker load -i ${filePath}
-q : --quiet :简化输出信息
docker load -q

加载canal镜像命令

 docker load -i canal.tar

canal 镜像百度云盘资源
[链接:https://pan.baidu.com/s/1GCcRGNh_ceGLJla4tiRhiQ?pwd=oa2x
提取码:oa2x]

canal的启动命令可以直接复制官网给的文档
或者 复制下面的命令
注意: 在启动canal前 如果用的docker部署的mysql 要创建一个docker网络。

创建docker网络 
docker network create mynetwork
把mysql容器加入到该网络
docker network connect mynetwork mysql  #后面的mysql 是启动的mysql的容易名称

启动canal命令

docker run -p 11111:11111 --name canal \
-e canal.destinations=test \   #canal 列表名称 springboot集成成是要
-e canal.instance.master.address=mynetwork :3306  \  #数据库的地址端口 mynetwork 是docker网络 ,如主机部署 可替换成ip地址
-e canal.instance.dbUsername=canal  \ # 上面创建的 mysql用户名
-e canal.instance.dbPassword=canal  \ # 上面创建的mysql用户密码
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false  \
-e canal.instance.filter.regex=test\\..* \   # 要监听的表
--network mynetwork \ # 加入docker网络
-d canal/canal-server:v1.1.5

springboot 集成canal

流程

由于我们集成是三方提供的 canal-boot版的依赖 ,开发成本会降低很多,所以
springboot 集成canal 比较简单 ,分三个步骤:

  1. 引 pom
  2. 改配置
  3. 实现EntryHandler 接口

引pom

 <dependency>
            <groupId>top.javatool</groupId>
            <artifactId>canal-spring-boot-starter</artifactId>
            <version>1.2.1-RELEASE</version>
        </dependency>

改配置

只需要指定端口号和库 和canal的实例名称

canal:
  destination: test # canal的集群名字,要与安装canal时设置的名称一致
  server: xx.xxx.xxx.xxx:11111 # canal服务地址  ip

实现 EntryHandler 接口

实现三个接口 新增 删除和更新 ,泛型为表示的映射实体类。
当库表发生该表时 会执行对应的这三个方法

package com.li.cannal;

import com.li.pojo.Item;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

/**
 * @author liqiuliang
 * @version 1.0
 * @date 2022/8/19 22:53
 */
@Component
@CanalTable("test")  //指定需要监控的表名    
@Slf4j
public class CanalHandle implements EntryHandler<Item> {
    @Override
    public void insert(Item item) {
        log.info("监控到新增操作");
        // 可以执行更新 redis操作
        System.out.println(item);
    }

    @Override
    public void update(Item before, Item after) {
        log.info("监控到更新操作");
        // 可以执行更新 redis操作
        System.out.println(before);
        System.out.println(after);
    }

    @Override
    public void delete(Item item) {
        // 可以执行更新 redis操作
        log.info("监控到删除操作");
        System.out.println(item);
    }
}

测试

随便在库表里删除一条数据
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值