17 | Cache:多级缓存架构在消息系统中的应用
17 | Cache:多级缓存架构在消息系统中的应用
讲述:袁武林
时长15:32大小12.43M
缓存的分布式算法
取模求余
一致性哈希
数据倾斜
缓存热点问题
多级缓存架构 - 主从模式
多级缓存架构 -L1+ 主从模式
多级缓存架构 - 本地缓存 +L1+ 主从的多层模式
小结
赞 4
提建议
精选留言(29)
- 那时刻2019-10-06请问怎么保证local cache到cache master的数据一致性呢?毕竟local cache在分布式的服务器集群,会有同一个文档发到不同服务器local cache的情形。从图中看出,是某一个local cache负责同步数据到cache master么?或者我有什么误解?烦请指正
作者回复: 本地缓存的一致性我课程中有讲哈,本地缓存只会从中央缓存回种,中央缓存数据有变化并不需要同步告知本地缓存。本地缓存通过短过期时间来重新从中央缓存回种。
共 2 条评论9 - 小小小丶盘子2019-10-04开线程定时访问热点数据,保证不被淘汰。
作者回复: 也是一种思路,不过实现上可能会比较复杂。另外可以考虑把master也加入到L1缓存层中,这样能保持数据热度。
8 - 好运连连2019-11-12为什么把master也当作L1可以解决热度问题?难道每一次master过期也会主动把从库的对应缓存删除?
作者回复: master加入到L1层主要是解决master的热点数据缓存得不到访问而被lru淘汰掉,如果这时L1挂了或者被下线,会穿透master对底层db产生压力。对于redis这种本身支持主从的缓存实现,master上过期了slave上也会过期,对于memcached这种本身不支持主从的缓存实现就需要人为来维护主从关系,数据也并不会从master同步到slave。
共 2 条评论5 - Geek_37e9932019-10-09请教一下,L1缓存和slave以及后端存储的数据一致性如何保证呢?
作者回复: 有数据更新的时候会同步更新L1和master,虽然多组L1会导致多次更新的问题,但对于大部分读多写少的互联网场景来说刚更新不是一个频繁的操作,所以基本可控。
共 2 条评论4 - clip2019-10-08主从以及那边有点不明白。 为什么从库节点中有全部的数据? 某个节点有全量的数据却只有部分对象的查询分配到自己。 我理解的如果有全量数据那就直接循环着去不同节点中取不就行了吗,也就不需要缓存分布式算法了吧。
作者回复: 不是哈,这里是说:对于主从缓存来说,从库拥有和主库一样的数据,所以靠不停扩展多个从库来解决某几个单key热点的问题很浪费。并不是说每个主从都有全量所有的业务数据,主从里的数据是根据hash规则来分片的,是全量数据的子集。
4 - 大魔王汪汪2019-10-07老师L1缓存具体是实现和缓存层究竟有什么区别呢?还是说技术实现上本身没有区别,只不过存储目的不同?比如L1就是为了解决热数据的
作者回复: 技术实现上基本一样,只不过L1主要解决热数据对master slave缓存的单点压力,也可以防止master slave缓存故障导致穿透db的问题。
3 - 二进制之路2019-10-15对于L1解决带宽问题,感觉文中没讲太清楚。机器带宽和网卡有关系,相同配置的机器带宽一样。从库和L1如果机器数量一样,同样带宽是没问题的。也就是说L1在存储成本上有优势,带宽上没优势吧?
作者回复: L1的容量一般比从库容量小很多,但是会冗余多组,通过这种方式来承担极热点数据的访问,带宽上由于冗余多组来随机访问,所以带宽上自然相当于扩大了,另外由于容量都很小,也比扩从库成本上要更省。
2 - piboye2020-05-10可以用一个随机数,如果命中某个值就异步放量到master上。这样就有一定比例的访问到master了1
- yic2019-11-07老师,有两个问题请教一下: 1. L1缓存业界一般是如何实现的? 2. 关于课后问题的解答,老师提供的思路是:“另外可以考虑把master也加入到L1缓存层中,这样能保持数据热度“。我想问一下,如果发生了主从关系变化呢?这时如何把master加入到L1缓存层呢?
作者回复: L1缓存一般也是和主从缓存一样,采用中央缓存如memcached或者redis,只是在hash规则上和主从缓存有区别。 您指的主从关系变化是说节点数变化了还是主库切成从库了?如果是节点数发生了变化采用一致性hash是可以不需要干预的,如果是主从关系变化了一般需要及时调整L1的配置。
共 2 条评论1 - 独酌相思解千愁2019-11-06对于思考题,将各级缓存的存活时间分级设定,L1最小,每当L1重新拉取数据时同时更新其他缓存层的相应热点数据。同时对于一段时间类使用比较频繁的数据可以按照一定规则增加其存活时间(或者权重) 不知道这样有可行性不
作者回复: 理论上应该可以,不过L1如果承载的是热点数据,那么对于更新主从缓存就会比较频繁,带来额外压力。一种简单的方法可以把主从缓存也作为一组L1加入,这样也能保证主从缓存里的数据热度。
1 - 王蒙2019-11-05举个例子,单台机器 120MB 带宽,对于 1MB 大小的文章来说,如果 QPS 到 1000 的话,至少需要 8 个实例才可以抗住。 请问,8是怎么算的,有什么公式吗? 8个实例是指单台物理机,上面8个虚拟机,还是一台机器上部8个相同应用? 还有平时手机的流量是指http请求的request的请求头和body的大小吗,response的算吗?展开
作者回复: QPS 1000的话整体流量就是1G,一般常见的千兆网卡单台机器单方向120MB带宽, 所以大概需要8台左右。 这里的流量是指网卡流量,http属于应用层的,所以是包括header和body的。
1 - 卫江2019-10-06思考题,我感觉可以在L1层,根据访问的特定数据的频率,比如qps超过100就去后面缓存拉一下,这样一来实现简单,频率不高又能保证热数据不被淘汰,同时也可以作为L1缓存的数据更新保证数据一致性的实现方式。
作者回复: 嗯,这个也是一种实现方案,实现上可能会稍微麻烦一点。也可以考虑把master当做一组L1,也加入到L1层中来保证热度。
共 2 条评论1 - 孙凯2019-10-04老师能详细讲下L1级缓存怎么用么?
作者回复: 实现上并不复杂,其实就是二次哈希的过程,比如将原来哈希到slave1的请求再采用round robin轮流打到多组L1上,这样就实现流量分散了。
1 - 追风筝的人2022-09-19 来自陕西取模求余算法在实现上非常简单,但存在的问题是,取模求余算法在节点扩容和宕机后会出现震荡,缓存命中率会严重降低。 一致性哈希算法解决了节点增删时震荡的问题,并通过虚拟节点的引入,缓解了“数据倾斜”的情况。
- EveryDayIsNew2020-09-02这种要是放弃L1缓存,然后检测出来热点key,之后把热点key加个几个随机数再散列给集群呢,这样集群的每个节点都理论上会有一份,加上一层L1缓存是不是复杂性高了呢
- stevensafin2020-08-26L1Cache表示什么?用什么实现?和主从Cache的区别是什么?概念本身还是希望老师能够先解释清楚哈
- 问题究竟系边度2020-08-07L1缓存可以参考知乎的已读服务架构,两层缓存的维度会不一样
- delete is create2020-06-04长轮训在集群中会不会出问题 比如你的长轮训是挂在了a节点 但是你要请求的数据是对方在b节点返回的
- delete is create2020-06-04如果分布式缓冲用的是redis,是否可以使用redis的发布订阅模式 通知客户端去更新缓冲? 因为多级缓冲还有一种场景是存放配置,这些配置一般都不咋变,没必要每次都访问redis,可以保存在本地缓冲中,这些配置一般都不咋变,如果时间设置的太短,那多级缓冲的意义就不明显了。
- piboye2020-05-10一致性hash不讲谷歌的jumphash吗?我发现市面上的课程,都是老一套的环状的。