Canal框架 Redis和MySQL数据一致性的解决方案 阿里中间件Canal

这篇具有很好参考价值的文章主要介绍了Canal框架 Redis和MySQL数据一致性的解决方案 阿里中间件Canal。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL与Redis缓存的同步的两种方案
方案2:解析MySQL的binlog 实现,将数据库中的数据同步到Redis。数据库每一步操作都会写入binlog,通过订阅监听binlog实时感知数据变化,根据数据变化情况删除reids并添加重试机制。
引入消息队列:若Redis删除失败,则将Redis key放入消息队列,消费端监听消息队列并删除Redis直至删除成功;
如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。

Canal的工作原理

1、MySQL主从复制过程
    1)  Master  主库将改变记录,写入二进制日志(Binary Log)中;
    2)  Slave 从库向 MySQL 发送dump协议,将 Master主库的 binary log events 进行拷贝到它的中继日志(relay log) 
    3) Slave 从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。
    
2、Canal的工作原理 (ROW级别)
    -- $ 将自身伪装成 Slave , 假装从 Master  复制数据。
    -- $ Otter是阿里用于进行异地数据库之间的同步框架,Canal是其中一部分。
    
https://blog.csdn.net/weixin_55769150/article/details/128997455
同步效果
1)已验证:仅支持增量同步,不支持全量已有数据同步。这点,canal的初衷订位就是“阿里巴巴mysql数据库binlog的增量订阅&消费组件”。

2)已验证:由于采用了binlog机制,Mysql中的新增、更新、删除操作,对应的Elasticsearch都能实时新增、更新、删除。

3)推荐使用场景
canal适用于对于Mysql和Elasticsearch数据实时增、删、改要求高的业务场景。
实时场景要求不高的业务场景,logstash_input_jdbc也能满足。
技术整体思路

mysql binlog增量订阅消费+消息队列+增量数据更新到redis
1)读redis:热数据基本都在redis
2)写mysql:增删改都是操作mysql
3)更新redis数据:mysq的数据操作binlog,来更新到redis

mysql binlog 配置

查询

show variables like 'log_%' -- 开启 Binlog 写入功能,开启bin-log权限
SHOW VARIABLES like "%binlog_format%"; -- 配置 binlog-format 为 ROW 模式
SHOW VARIABLES like "%server_id%"; -- 主数据库的唯一值

show master status; --  查询此主库的状态
show slave status; --查询从库的状态
show binary logs; -- 查看当前所有binlog的日志存储
show binlog events in 'mysql-bin.000001'; -- 查看当前已经消费到了什么位置

binlog配置

# windows下mysql的配置文件是my.ini。一般放到安装的根目录
# Linux下MySQL的配置文件是my.cnf,一般会放在/etc/my.cnf,/etc/mysql/my.cnf

[mysqld]
# *** Replication related settings ***

#在复制方面的改进就是引进了新的复制技术:基于行的复制。     
binlog-format=ROW

#开启二进制日志功能,binlog数据位置
log-bin="mysql-binlog"

#服务端ID,用来高可用时做区分   
server_id=100

#二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。
#expire-logs-days=2  mysql8.x中准备作废
binlog_expire_logs_seconds=86400

# 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
server_id=100

创建Mysql ,canal,用户

#创建用户
CREATE USER canal IDENTIFIED BY 'canal';
#赋权
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';    
#刷新
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;    
FLUSH PRIVILEGES;

注意:如果使用的是阿里云的 RDS for MySQL。已经是默认打开binlog了,并且账号默认具有 binlog dump 权限, 不需要任何权限或者 binlog设置,可以直接跳过这一步
https://blog.csdn.net/zcl111/article/details/119670138

canal 下载地址

https://github.com/alibaba/canal/releases

cd /usr/local
mkdir canal
tar -zxvf canal.deployer-1.1.6.tar.gz -C /usr/local/canal/
canal.properties

这个文件是 canal 的基本通用配置,canal 端口号默认就是 11111

vim /usr/local/canal/canal.properties

修改 instance.properties

进入example目录,修改instance.properties配置文件
vi /usr/local/canal/example/instance.properties

canal.instance.mysql.slaveId=5
canal.instance.master.address=rm-wz90xxxu7.mysql.rds.aliyuncs.com:3306
canal.instance.dbUsername=root
canal.instance.dbPassword=123456

注:不配置canal.instance.tsdb相关属性。
s
常见的匹配规则:

所有表:.* or .\…
canal schema下所有表: canal\…*
canal下的以canal打头的表:canal.canal.*
canal schema下的一张表:canal.test1
多个规则组合使用:canal\…*,mysql.test1,mysql.test2 (逗号分隔)

链接:https://blog.csdn.net/yy139926/article/details/127768446
Canal架构

server 代表一个 canal 运行实例,对应于一个 jvm
instance 对应于一个数据队列 (1个 canal server 对应 n个 instance )
instance 下的子模块:
eventParser: 数据源接入,模拟 slave 协议和 master 进行交互,协议解析
eventSink: Parser 和 Store 链接器,进行数据过滤,加工,分发的工作
eventStore: 数据存储
metaManager: 增量订阅 & 消费信息管理器
链接:https://blog.csdn.net/yy139926/article/details/127768446

SpringBoot整合Canal(同步MySQL到Redis)

<dependency>
    <groupId>top.javatool</groupId>
    <artifactId>canal-spring-boot-starter</artifactId>
    <version>1.2.1-RELEASE</version>
</dependency>
application.yml
canal:
  server: localhost:11111
  destination: example

屏蔽日志

logging:
  level:
    tracer: trace # 开启trace级别日志,控制台可以打印es全部请求信息及DSL语句,为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false.
    #top.javatool.canal.client: warn  #禁止AbstractCanalClient 打印常規日志 获取消息 {}

添加Handler 消息监听器

import com.java.pojo.SysDictData;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

@CanalTable("sys_dict_data") //要监听的表
@Component
public class CacalHandlerService implements EntryHandler<SysDictData> {

    @Override
    public void insert(SysDictData t) { log.info("canal insert event." + t); }

    @Override
    public void update(SysDictData before, SysDictData after) { log.info("canal update event." + after); }

    @Override
    public void delete(SysDictData t) { log.info("canal delete event." + t); }
}

参考资料

SpringBoot整合Canal实现缓存一致性
https://blog.csdn.net/qq_49059667/article/details/124076985

Canal1.1.6安装部署
https://blog.csdn.net/weixin_47491957/article/details/127967141文章来源地址https://www.toymoban.com/news/detail-411225.html

到了这里,关于Canal框架 Redis和MySQL数据一致性的解决方案 阿里中间件Canal的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis数据一致性问题的三种解决方案

    Redis(Remote Dictionary Server ),是一个高性能的基于Key-Value结构存储的NoSQL开源数据库。大部分公司采用Redis来实现分布式缓存,用来提高数据查询效率。 在Web应用发展的初期,系统的访问和并发并不高,交互也比较少。但随着业务的扩大,访问量的提升,使得服务器负载和关系

    2024年02月14日
    浏览(38)
  • redis和数据库的一致性问题的解决方案

    当前没有框架能够保证redis的数据和数据库的完全一致性,所以需要 我们自己在性能和一致性上作取舍。 下图就是两种在redis缓存数据库内容时的使用。 那么如一个节点的两个图: 缓存的生成,是在首次查询或者缓存过期时间到或者缓存被其他业务删除,进而需要在数据库

    2023年04月08日
    浏览(39)
  • MySQL和Redis如何保证数据一致性?

    由于缓存的高并发和高性能已经在各种项目中被广泛使用,在读取缓存这方面基本都是一致的,大概都是按照下图的流程进行操作: 但是在更新缓存方面,是更新完数据库再更新缓存还是直接删除缓存呢?又或者是先删除缓存再更新数据库?在这一点上就值得探讨了。 在实

    2024年02月01日
    浏览(53)
  • Redis和MySQL如何保持数据一致性

    在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。 在高并发的业务场景下,数据库大多数情况都是用

    2024年01月18日
    浏览(53)
  • MySQL和Redis如何保证数据一致性

    MySQL与Redis都是常用的数据存储和缓存系统。为了提高应用程序的性能和可伸缩性,很多应用程序将MySQL和Redis一起使用,其中MySQL作为主要的持久存储,而Redis作为主要的缓存。在这种情况下,应用程序需要确保MySQL和Redis中的数据是同步的,以确保数据的一致性。 “数据一致

    2024年02月12日
    浏览(62)
  • 如何保障MySQL和Redis的数据一致性?

    先抛一下结论:在满足实时性的条件下,不存在两者完全保存一致的方案,只有最终一致性方案。根据网上的众多解决方案,总结出 6 种,直接看目录:     不好的方案   1、先写 MySQL,再写 Redis       如图所示:   这是一副时序图,描述请求的先后调用顺序;   橘黄色的

    2024年02月08日
    浏览(49)
  • mysql和redis如何保证数据库一致性

    如果对于小公司的单机服务器来说在更新和删除mysql数据的同时对redis缓存进行更新或者删除就行,一般有两个选择,例如: 先更新MySQL,后删除(或更新)Redis 先删除(或更新)Redis,后更新MySQL 但是不管使用其中哪种方式,都存在两个可能的问题: 由于第一步与第二步并不是原

    2023年04月24日
    浏览(52)
  • 博客摘录「 Redis( 缓存篇 ==> 超详细的缓存介绍与数据一致性解决方案 &; 代码实现」

    Redis 旁路缓存 由于高并发原因,先更新数据库和先更新缓存策略都会因为延迟时间而导致数据不一致问题。 两种策略 先删除缓存,再更新数据库; 先更新数据库,再删除缓存。 因为缓存的写入通常要远远快于数据库的写入 ,所以先更新数据库再删缓存,删完缓存,下次访

    2024年02月15日
    浏览(40)
  • Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案

    热 key 问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的 key 就是热 key,往往这样的 key 也是存储在了一个 redis 节点中,对该节点压力很大 那么对于热 key 的处理就是通过热 key 探测系统对热 key 进行计数,一旦发现了热 key,就将热 key 在 jv

    2024年02月05日
    浏览(52)
  • 生产实践:Redis与Mysql的数据强一致性方案

    数据库和Redis如何保持强一致性,这篇文章告诉你 Redis和Msql来保持数据同步,并且强一致,以此来提高对应接口的响应速度,刚开始考虑是用mybatis的二级缓存,发现坑不少,于是决定自己搞 操作数据必须是唯一索引 如果更新数据不是唯一索引,则数据库更新后的值,与缓存

    2024年02月05日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包