后端存储实战课
李玥
美团高级技术专家
44005 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语 (1讲)
后端存储实战课
15
15
1.0x
00:00/00:00
登录|注册

17 | 大厂都是怎么做MySQL to Redis同步的?

解析Binlog更新Redis
Canal模拟MySQL主从复制
更新Redis缓存
订阅MQ消息
缓存不同步的降级或补偿方案
验证数据同步
更新Redis缓存服务开发
Canal配置和启动
使用Binlog实时更新Redis缓存
使用MQ消息更新缓存
解决方法:缓存全量数据
缓存穿透风险
思考题
实现示例
更新缓存策略
缓存穿透问题
大厂MySQL to Redis同步策略

该思维导图由 AI 生成,仅供参考

你好,我是李玥。
之前我们在《11 | MySQL 如何应对高并发(一):使用缓存保护 MySQL》这一节课中,讲到了 Read/Write Through 和 Cache Aside 这几种更新缓存的策略,这几种策略都存在缓存穿透的可能,如果缓存没有命中,那就穿透缓存去访问数据库获取数据。
一般情况下,只要我们做好缓存预热,这个缓存的命中率很高,能穿透缓存打到数据库上的请求比例就非常低,这些缓存的策略都是没问题的。但是如果说,我们的 Redis 缓存服务的是一个超大规模的系统,那就又不一样了。
今天这节课,我们来说一下,在超大规模系统中缓存会面临什么样的问题,以及应该使用什么样的策略来更新缓存。

缓存穿透:超大规模系统的不能承受之痛

我们上节课讲到了如何构建 Redis 集群,由于集群可以水平扩容,那只要集群足够大,理论上支持海量并发也不是问题。但是,因为并发请求的数量这个基数太大了,即使有很小比率的请求穿透缓存,打到数据库上请求的绝对数量仍然不小。加上大促期间的流量峰值,还是存在缓存穿透引发雪崩的风险。
那这个问题怎么解决呢?其实方法你也想得到,不让请求穿透缓存不就行了?反正现在存储也便宜,只要你买得起足够多的服务器,Redis 集群的容量就是无限的。不如把全量的数据都放在 Redis 集群里面,处理读请求的时候,干脆只读 Redis,不去读数据库。这样就完全没有“缓存穿透”的风险了,实际上很多大厂它就是这么干的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

大厂在MySQL to Redis同步中采用了两种主要策略:一种是将全量数据存储在Redis中,通过消息队列实时更新缓存;另一种是利用Binlog实时更新Redis缓存。在超大规模系统中,缓存穿透成为一个难以承受的问题,因此大厂采用了将全量数据存储在Redis中的策略,避免了缓存穿透的风险。然而,这种策略引发了新的问题,即如何保证Redis中的数据与数据库中的数据同步更新。针对这一问题,大厂采用了启动一个更新缓存的服务,接收数据变更的消息,并及时更新Redis中的缓存数据。另一种策略是利用Binlog实时更新Redis缓存,通过伪装成MySQL的从节点,接收Binlog并解析实时数据变更信息,然后根据这些信息更新Redis缓存。这种策略减少了消息传递的环节,降低了时延和故障可能性。因此,大厂更青睐于这种方案。虽然实现订单缓存更新服务较为复杂,但这种策略具有更强的通用性和可靠性。 在处理超大规模并发的场景时,由于并发请求的数量非常大,即使少量的缓存穿透,也有可能打死数据库引发雪崩效应。对于这种情况,我们可以缓存全量数据来彻底避免缓存穿透问题。对于缓存数据更新的方法,可以订阅数据更新的MQ消息来异步更新缓存,更通用的方法是,把缓存更新服务伪装成一个MySQL的从节点,订阅MySQL的Binlog,通过Binlog来更新Redis缓存。 需要特别注意的是,无论是用MQ还是Canal来异步更新缓存,对整个更新服务的数据可靠性和实时性要求都比较高,数据丢失或者更新慢了,都会造成Redis中的数据与MySQL中数据不同步。在把这套方案应用到生产环境中去的时候,需要考虑一旦出现不同步问题时的降级或补偿方案。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端存储实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(37)

  • 最新
  • 精选
  • 李玥
    置顶
    Hi,我是李玥。 这里回顾一下上节课的思考题: 课后请你再去看一下 HDFS,它在解决分片、复制和高可用这几方面,哪些是“抄作业”,哪些又是自己独创的。 HDFS集群的构成,和我们之前讲解的几个分布式存储集群是类似的。主要分为NameNode,也就是存放元数据和负责路由的节点,以及用于存放文件数据的DataNode。在HDFS中,大文件同样被划分为多个块,每个块会有多个副本来保证数据可靠性。但HDFS没有采用复制状态机的方式去同步数据,这块它实现了自己的复制算法,感兴趣的同学可以进一步去了解一下。
    2020-04-07
    27
  • learn more
    老师你好,这种方案是不是数据写走MySQL,数据读走redis?如果是这样的话,是不是高并发的写也会出现问题?问一下,为什么不把读写全部放到redis操作呢?这样读和写都得到改善,最后使用消息队列批量从redis获取数据同步MySQL,希望得到老师的解答,谢谢。

    作者回复: 写不放在Redis中有几个原因: 1. Redis不是可靠的存储,存在丢数据的风险; 2. Redis不支持事务; 3. Redis的查询能力太弱,没法满足各种各样的业务需求。

    2020-05-23
    4
    23
  • Dovelol
    老师好,用binlog方式同步mysql数据到redis,如果是已经在线运行很久的表数据,也适合转到这个方案吗?需要把之前的数据全部同步到redis中,重要的是该从binlog中的哪个位置开始呢。

    作者回复: 这种情况需要先做一次全量同步,之后再开启binlog做增量同步。

    2020-04-04
    2
    20
  • 椿
    “还有一个问题是,如果 Redis 本身出现故障,写入数据失败,还会导致下单失败,等于是降低了下单服务性能和可用性,这样肯定不行。” 看到这段话,想问老师一个问题,应该如何避免 Redis 本身的故障对系统造成的影响呢?

    作者回复: 绝对避免是很难做到的,更多的是想办法去减轻这个影响。比如Redis配置一主一从的高可用方式。

    2020-04-26
    14
  • C J J
    全量数据缓存,缓存同步有个时间差,请问老师这该如何处理?

    作者回复: 就行MySQL主从同步时延一样,只能接受它。一般这个时延都是毫米级的,不会对业务有很大影响。

    2020-04-05
    14
  • 飞翔
    老师 canal 是不是也的做的集群 防止它当机了 redis 不同步了

    作者回复: Canal也支持主备的方式来解决高可用的问题。

    2020-04-07
    12
  • C J J
    老师,我还有个疑问。用mq去更新缓存数据,如若上面所说Redis出现故障,这应如何处理?我想到的是重试机制,但超过次数应当如何处理?

    作者回复: MQ消费的时候有自动重试机制,并且不建议这个地方加重试次数的限制。如果Redis故障,就让同步卡在那儿,等Redis恢复之后,就可以继续同步,这样不会丢数据。

    2020-04-06
    2
    8
  • 川杰
    老师好,想问一个redis很基础的问题。 假设我们要对交易数据进行缓存。后端调用时,既有根据交易编号查找单个对象的方法,又有查询批量交易的方法。那我该怎么缓存交易数据呢? 利用key-value的方式可以解决根据交易编号查找的情况。那批量查询怎么处理?用队列吗?如果用队列,那岂不是一个交易数据要缓存两遍?(一个是队列,一个是key-value) 请回答下,谢谢

    作者回复: 一般批量查询的时候可以用Redis的集合数据结构,比如SET,SET中的Value可以保存交易编号,而不用保存交易数据。

    2020-04-04
    2
    7
  • 一剑
    这里有个问题,就是我们一般是把计算结果缓存到redis,但是基于日志的同步方式是直接同步了原始表数据,这中间是不是少了一环?

    作者回复: 这里面需要注意一下,Binlog中记录的是“数据变化”,而不仅仅是数据。

    2020-04-05
    6
  • Lywane
    求问老师,"负责更新缓存的服务,把自己伪装成一个 MySQL 的从节点,从 MySQL 接收 Binlog,解析 Binlog 之后,可以得到实时的数据变更信息,然后根据这个变更信息去更新 Redis 缓存。" 什么叫伪装呀?还是说负责更新的服务本身就是mysql从节点之一?

    作者回复: 它使用MySQL主从同步的协议来从主库接收Binlog,对于主库“看起来,缓存更新服务就像是一个从库一样”。

    2020-05-01
    4
收起评论
显示
设置
留言
37
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部