作者回复: 也是一种思路,不过实现上可能会比较复杂。另外可以考虑把master也加入到L1缓存层中,这样能保持数据热度。
作者回复: master加入到L1层主要是解决master的热点数据缓存得不到访问而被lru淘汰掉,如果这时L1挂了或者被下线,会穿透master对底层db产生压力。对于redis这种本身支持主从的缓存实现,master上过期了slave上也会过期,对于memcached这种本身不支持主从的缓存实现就需要人为来维护主从关系,数据也并不会从master同步到slave。
作者回复: 本地缓存的一致性我课程中有讲哈,本地缓存只会从中央缓存回种,中央缓存数据有变化并不需要同步告知本地缓存。本地缓存通过短过期时间来重新从中央缓存回种。
作者回复: L1的容量一般比从库容量小很多,但是会冗余多组,通过这种方式来承担极热点数据的访问,带宽上由于冗余多组来随机访问,所以带宽上自然相当于扩大了,另外由于容量都很小,也比扩从库成本上要更省。
作者回复: 技术实现上基本一样,只不过L1主要解决热数据对master slave缓存的单点压力,也可以防止master slave缓存故障导致穿透db的问题。
作者回复: L1缓存一般也是和主从缓存一样,采用中央缓存如memcached或者redis,只是在hash规则上和主从缓存有区别。
您指的主从关系变化是说节点数变化了还是主库切成从库了?如果是节点数发生了变化采用一致性hash是可以不需要干预的,如果是主从关系变化了一般需要及时调整L1的配置。
作者回复: 理论上应该可以,不过L1如果承载的是热点数据,那么对于更新主从缓存就会比较频繁,带来额外压力。一种简单的方法可以把主从缓存也作为一组L1加入,这样也能保证主从缓存里的数据热度。
作者回复: QPS 1000的话整体流量就是1G,一般常见的千兆网卡单台机器单方向120MB带宽, 所以大概需要8台左右。
这里的流量是指网卡流量,http属于应用层的,所以是包括header和body的。
作者回复: 有数据更新的时候会同步更新L1和master,虽然多组L1会导致多次更新的问题,但对于大部分读多写少的互联网场景来说刚更新不是一个频繁的操作,所以基本可控。
作者回复: 不是哈,这里是说:对于主从缓存来说,从库拥有和主库一样的数据,所以靠不停扩展多个从库来解决某几个单key热点的问题很浪费。并不是说每个主从都有全量所有的业务数据,主从里的数据是根据hash规则来分片的,是全量数据的子集。
作者回复: 将master也加入到L1层主要是防止master里热数据被淘汰。L1是并列多组小容量的缓存,通过多组冗余来扛热数据,解决挡在master slave缓存前面。
作者回复: 嗯,这个也是一种实现方案,实现上可能会稍微麻烦一点。也可以考虑把master当做一组L1,也加入到L1层中来保证热度。
作者回复: 实现上并不复杂,其实就是二次哈希的过程,比如将原来哈希到slave1的请求再采用round robin轮流打到多组L1上,这样就实现流量分散了。
作者回复: 一般真实场景中来说是的,不过L1主要还是一种缓存架构,实现上没有限制的。
作者回复: 有的uid是字符型的,所以通用做法就是先hash一下。
L1缓存一般自动lru成最热的数据。