大家好,我是AndyHua。上次我们讨论了分布式系统下的缓存架构,从浏览器缓存到客户端缓存,再到CDN缓存,再到反向代理缓存,再到本地缓存,再到分布式缓存。整个链路有很多缓存。整个缓存链接出现各种问题。常见问题包括缓存穿透、缓存击穿、缓存雪崩、缓存数据一致性问题。不常见的问题包括缓存倾斜、缓存阻塞、缓存慢查询、缓存主从一致性问题、缓存高可用、缓存故障发现与故障恢复、集群扩缩容、largekey热键等。今天聊聊:CacheAvalancheCache雪崩,顾名思义,就是缓存崩溃。如果你这样理解,那你就错了,请跟我来一探究竟。老规矩,先看这篇文章的大纲:什么是缓存雪崩缓存雪崩的痛点缓存雪崩有哪些解决方案什么是缓存雪崩的总结我们知道缓存的工作原理是先从缓存中获取数据,有数据则直接返回给用户,没有数据则从慢设备读取实际数据,放入缓存。就像这样:缓存中有很多数据,如果一个key过期了,那么就需要回溯查询,如果这个key是hotkey,慢设备的压力会急剧增加,可能会导致慢设备下降。就像这样:这就是我们之前说的:缓存击穿,如果很多key都过期了,请求会通过缓存层,直奔慢速设备。如果这些无效键的请求总和很大,那么慢速设备的压力会急剧增加,可能导致慢速设备宕机。就像这样:这就是我们今天的话题:缓存雪崩是的,从上面的意思,我们已经可以理解一个区别:缓存击穿强调单键过期+高并发;缓存雪崩强调的是多次key过期+高并发。(所以,缓存雪崩不是缓存雪崩,而是一大片缓存数据同时全部失效)雪崩真的很可怕。缓存雪崩的痛点是什么?什么是热点数据?缓存层是即时透明的,慢速设备层有被淹没的风险。大家猜一猜,为什么大量数据会瞬间过期?有两个方向,一个是大量数据同时放入缓存+同时设置过期时间;另一种是大量数据放入缓存的时间不同,但是过期时间同时过期。一种更容易理解。让我给你几个场景来更好地理解它。比如系统在启动时或者每天定时对大量数据进行预热,过期时间都是一样的。或者是大促,产品同时开通,大量用户访问不同的产品。这些产品的数据几乎同时进入缓存,过期时间相同。第二个不好理解,给大家举个场景。比如需要给用户推送消息,但是一天只能推送一次。假设早上8:00发给张三,那么这个数据就可以放入缓存,过期时间为16小时。再次推送给张三时检查缓存是否存在。如果缓存存在,则不允许推送。如果缓存不存在,则允许推送。14:00给李四发了一条消息,所以李四的缓存数据过期时间应该是10小时。这个场景说明了不同时间点放入的数据有不同的过期时间,但是都在同一时间过期(本例中是每天0:00过期)。缓存雪崩的解决方法1、从上面的一个角度来看,数据放入缓存的时间和过期时间是一样的,所以大量的数据最终会同时过期。因此,从这个角度来说,我们可以改变数据放入缓存的时间,或者选择修改数据的过期时间,让过期时间不一致。最终目的是让数据在不同的时间点过期,从而降低数据库的高并发压力。显然,修改数据的过期时间更容易,让缓存时间在某个区域取一个随机值,可以轻松解决缓存雪崩的问题。2.当然,问题是数据已经过期了,那么还有一个解决办法:让你的数据永不过期!很显然,你的领导或者你作为领导是不会这么玩的,这个方案基本上是行不通的。原因是即使缓存的数据在缓存中永不过期,缓存能保证100%的可用性吗?不敢,所以还是要准备planB,记录一下缓存宕机或者缓存数据不存在的情况。3.既然是并发访问导致的,那我们能不能从高并发切换到低并发,叫互斥锁,或者分布式锁等等,总之就是加锁,保证高并发可以转换为低并发。4、我们继续分析,这样的热点数据,应该是热点服务器完成的吧?我们应该实施隔离机制。如果你有一个实时热点发现系统,热点流量自动迁移到热点服务器上,就算有什么用,能不能解决问题呢?答案是否定的,因为热点服务器还是需要防止缓存雪崩的,上面已经提到了解决方法,这里不再赘述。这只是对环境隔离和实时热点发现的介绍。5.继续。既然数据库承受不了,那么我们知道问题的时候可以把数据离散分布,这样可以均匀的分布在我们的分布式数据库中,同时尽可能的横向扩展数据库。常见的有32个数据库32张表,64个数据库64张表,128个数据库128张表。这样做的目的是减轻单个数据库的压力,防止缓存雪崩。6.继续分析。从现象来看,数据库宕机了。原因是数据库收到的即时请求太多,数据库承受不住压力,就停止工作了。那我们是不是可以这样分析,如果我们提前知道数据库能承受的最大阈值是多少,提前设置好数据库的阈值或者服务的阈值,如果瞬时流量来了,我们就去排队超过阈值的流量或者直接拒绝服务,保证数据库的压力不超过阈值,是不是也能解决缓存雪崩的影响呢?然后涉及到几个数据:如何知道数据库的阈值,如何知道服务的阈值,如何设置数据库或服务的阈值。答案是:数据阈值应该是压测后得到的,设置阈值应该在网关层进行限流处理,所以需要有这样的限流平台。关于压测和网关,我们会在以后的专文中讨论,本期不再赘述,敬请期待。可以关注我的公众号:李哥的技术总结其实缓存雪崩的理解很简单,为什么这么复杂,原因很简单,就是不想让大家死记硬背在和背八股文的方法一样,但是要靠深刻理解它的Painpoints,然后一步步分析解决方案,才能记住。让我们总结一下。概念:缓存雪崩是指缓存的大块数据同时过期,加上高并发请求进入慢设备,慢设备压力急剧增大,可能导致慢设备宕机。这就是缓存雪崩。解决方案:修改数据放入缓存的时间,或者修改数据在缓存中的过期时间;让缓存数据永不过期;mutex,从高并发到低并发,保护DB;热点隔离,实时热点发现系统;横向扩展数据库,均摊压力,保护数据库;提前压测,获取阈值,限流,保护服务和DB;好了,这就是本期缓存雪崩的解决方法,感谢阅读!
