首页 > 其他分享 >Canal实现缓存同步策略

Canal实现缓存同步策略

时间:2023-10-19 17:37:44浏览次数:35  
标签:Canal canal 同步 log instance 缓存 mysql

Canal介绍

个人在学习Redis的过程中,遇到多级缓存的处理方法,我本人的多级缓存分类里面提到过个人学习中的项目构成。简单来说就是OpenResty集群负责缓存一些静态性比较强的数据,比如说这个网页上的分类信息等基本不变化的数据,而Redis和JVM进程缓存(使用Caffeine实现)负责缓存变化性比较大的数据资源。
话不多说,先介绍一下Canal,个人所学的内容是:它伪装成mysql的slave来时时刻刻获取master的Binary log这个文件,并将这文件中的内容返回到Canal客户端,继而进行Redis和JVM内存缓存的同步更新。

它是啥

Canal [kə'næl],译意为水道/管道/沟渠,canal是阿里巴巴旗下的一款开源项目,基于Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。GitHub的地址:https://github.com/alibaba/canal
Canal是基于mysql的主从同步来实现的,MySQL主从同步的原理如下:
image

  • 1)MySQL master 将数据变更写入二进制日志( binary log),其中记录的数据叫做binary log events
  • 2)MySQL slave 将 master 的 binary log events拷贝到它的中继日志(relay log)
  • 3)MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

个人环境搭建

  1. 将docker mysql容器cnf配置文件修改一下,更改binary-log文件生成的地址以及文件名,其次是设置对哪个数据库进行监测binary-log文件。下面贴一下我的mysql配置文件中的内容,因为每个人的环境不一样,看一下就成。
    image
  • log-bin=/var/lib/mysql/mysql-bin:设置binary log文件的存放地址和文件名,叫做mysql-bin
  • binlog-do-db=heima:指定对哪个database记录binary log events,这里记录heima这个库
  1. 设置一个用于数据同步的用户,来让Canal伪装成slave“数据”。
  • Navicat新建查询,运行以下命令。
create user canal@'%' IDENTIFIED by 'canal';GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';FLUSH PRIVILEGES;
  • 重启mysql容器
  1. 创建网络,需要创建一个网络,将MySQL、Canal放到同一个Docker网络中
docker network create lalala

让mysql容器和网络连在一起。

docker network connect lalala mysql
  1. 安装Canal
    下面就是用docker pull镜像下来,然后安装了。
    我是下面的命令:
docker run -p 11111:11111 --name canal \
-e canal.destinations=lalala \
-e canal.instance.master.address=mysql:3306  \
-e canal.instance.dbUsername=canal  \
-e canal.instance.dbPassword=canal  \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false  \
-e canal.instance.filter.regex=lalala\\..* \
--network lalala \
-d canal/canal-server:v1.1.5
  • -p 11111:11111:这是canal的默认监听端口
  • -e canal.instance.master.address=mysql:3306:数据库地址和端口,如果不知道mysql容器地址,可以通过docker inspect 容器id来查看
  • -e canal.instance.dbUsername=canal:数据库用户名
  • -e canal.instance.dbPassword=canal :数据库密码
  • -e canal.instance.filter.regex=:要监听的表名称
  1. boot那边需要添加依赖和配置如下:
<dependency>
    <groupId>top.javatool</groupId>
    <artifactId>canal-spring-boot-starter</artifactId>
    <version>1.2.1-RELEASE</version>
</dependency>
canal:
  destination: lalala # canal的集群名字,要与安装canal时设置的名称一致
  server: 192.168.25.128:11111 # canal服务地址
  1. 让Canal知道怎么转换成实体对象
    这是我学习中项目代码,EntryHandler这个接口中三个对象分别是Insert update delete,其中@CanalTable("tb_item")代表的是让当前这个ItemHandler来监听哪个表产生变化,ItemHandler实现了上面的三个方法以后,数据产生更新就会对Redis和JVM进程缓存进行更新删除等操作。
    image
    在此之前可能还需要用到JPA的部分注解,@Id来表明当前实体的主键,@Column和表中的列做映射,@Transient来表明当前属性不作和表中列做对应。
    image
    至此,Redis和服务器内存缓存同步已经完成。

标签:Canal,canal,同步,log,instance,缓存,mysql
From: https://www.cnblogs.com/whitePuPigeon/p/17775208.html

相关文章

  • 使用SyncFavor进行文件同步
    SyncFavor是基于C#开发的免费文件同步工具,运行在windows上,下载链接:https://github.com/bsmith-zhao/sync同步管理界面:批量运行界面: 主从同步示例 下载压缩包解压,双击sync.exe启动同步管理器,可以看到空白的管理界面:点击工具栏的[添加工作区]创建工作区,工作区是一系列......
  • 希捷推出Exos系列24TB硬盘:配备增强型缓存 性能提高三倍
    希捷推出了全新的Exos24TB硬盘。其基于传统的CMR构建,为3.5英寸规格,转速为7200RPM。同时,Exos系列24TB硬盘拥有10片磁盘,每片磁盘的容量为2.4TB,是希捷存储密度最高的硬盘,适用于超大规模企业和数据中心,提供业界领先的总拥有成本(TCO)。Exos24TB硬盘针对最大存储及最大机架空间设计,......
  • 低代码平台探讨-MetaStore元数据缓存
    背景及需求之前提到我们模型驱动的实现选择的是解释型,需要模型的元数据信息,在接到请求后动态处理逻辑.此外,应用的通用能力中还包括:页面dsl查询,菜单查询等.而且后期加入触发器,用户自定义api后,这些元数据也需要提供查询服务.所以我们需要一个元数据模块,需要提供两个基础......
  • MySQL主从复制无法同步删除操作吗?【转】
    简介在MySQL主从复制中,当主库执行删除操作时,从库并不会同步删除对应的数据。这是由于MySQL的复制机制决定的。为了解决这个问题,我们可以通过在主库上创建触发器来实现删除操作的同步。解决方案概览下面是解决方案的整体流程图: 创建触发器首先,我们需要在主库上创建一个触发......
  • 多线程编程同步:读写锁
    读写锁的定义互斥锁锁住后,保证仅有一个线程处理数据(多线程共享的)。要是数据的读取比写入更频繁,且读取操作不涉及共享变量的修改,应允许多个线程读取操作对共享变量的读取。直接使用互斥锁效率太低,若使用读写锁,可以大大提高效率。读写锁的分配规则:1)只要没有线程持有某个特定的读......
  • Redis中的缓存雪崩、缓存击穿、缓存穿透问题
    1.什么是缓存雪崩当我们提到缓存系统中的问题,缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,这种情况会导致连锁反应,整个系统可能会崩溃。1.1缓存......
  • SpringBoot 缓存之 @Cacheable 详细介绍
    简介缓存介绍Spring从3.1开始就引入了对Cache的支持。定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术。并支持使用JCache(JSR-107)注解简化我们的开发。其使用方法和原理都类似于Spring对事务管理的支持。Sp......
  • MESI缓存一致性协议以及Volatile
    MESI(Modified,Exclusive,Shared,Invalid)是一种缓存一致性协议,用于解决多处理器系统中,多个处理器对同一块内存的并发读写可能导致的数据不一致性问题。MESI协议维护了每个缓存行的四种状态:Modified(M):表示缓存行已被修改,并且是唯一的拷贝。当其他处理器需要读取该数据时,必须先......
  • kettle同步mysql到mysql
    上传mysql驱动包到lib目录下创建表连接表输入表输出(没有创建表)执行表创建表sql ......
  • vue中同步方法的实现
    这篇文章主要介绍了vue中同步方法的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教目录vue同步方法实现有三种实现方式vue中的同步和异步问题同步异步总结vue同步方法实现有三种实现方式1、axios本身属于Promise利用函数式的then获取请求返回结......