缓存雪崩就是指缓存由于某些原因,例如宕机、Cache服务挂了偶不响应,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统奔溃发生灾难
下面就是一个雪崩的过程:
1、redis集群彻底奔溃
2、缓存服务大量对redis的请求hang住,占用资源
3、缓存服务大量请求打到源头服务查询MySQL,直接打死MySQL
4、源头服务因为MySQL被打死也崩溃了,对原服务的请求也hang住,占用资源
5、缓存服务大量的资源全部耗费在访问redis和源服务无果,最后自己也被拖死,无法提供服务
6、Nginx无法访问缓存服务,redis和源服务,只能基于本地缓存提供服务,但是缓存期过后,没有数据提供服务
7、网站崩溃
原因:
1、缓存并发,缓存穿透,缓存颠簸等问题,这些问题也可能会被恶意攻击者所利用
2、例如某个时间点内,系统预加载的缓存周期性集中失效,解决方法:通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效
解决方案
1、采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力。这种方法虽然能缓解数据库压力,但是同时又降低了系统的吞吐量
2、分析用户行为,尽量让失效时间均匀分布。避免缓存雪崩的出现
3、如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏数据,需要好好解决