Redis架构之防雪崩设计:网站不宕机背后的兵法

news/2024/5/20 6:27:17/文章来源:https://blog.csdn.net/starryninglong/article/details/65628337

一、缓存穿透预防及优化
缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如图 11-3 所示整个过程分为如下 3 步:

  1. 缓存层不命中
  2. 存储层不命中,所以不将空结果写回缓存
  3. 返回空结果
    缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。
    这里写图片描述
    缓存穿透模型
    缓存穿透问题可能会使后端存储负载加大,由于很多后端存储不具备高并发性,甚至可能造成后端存储宕掉。通常可以在程序中分别统计总调用数、缓存层命中数、存储层命中数,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。
    造成缓存穿透的基本有两个。第一,业务自身代码或者数据出现问题,第二,一些恶意攻击、爬虫等造成大量空命中,下面我们来看一下如何解决缓存穿透问题。

缓存穿透的解决方法
1)缓存空对象
如下图所示,当第 2 步存储层不命中后,仍然将空对象保留到缓存层中,之后再访问这个数据将会从缓存中获取,保护了后端数据源。
这里写图片描述
缓存空值应对穿透问题
缓存空对象会有两个问题:
第一,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间 ( 如果是攻击,问题更严重 ),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。
第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为 5 分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
下面给出了缓存空对象的实现伪代码:
这里写图片描述
2)布隆过滤器拦截
如下图所示,在访问缓存层和存储层之前,将存在的 key 用布隆过滤器提前保存起来,做第一层拦截。例如: 一个个性化推荐系统有 4 亿个用户 ID,每个小时算法工程师会根据每个用户之前历史行为做出来的个性化放到存储层中,但是最新的用户由于没有历史行为,就会发生缓存穿透的行为,为此可以将所有有个性化推荐数据的用户做成布隆过滤器。如果布隆过滤器认为该用户 ID 不存在,那么就不会访问存储层,在一定程度保护了存储层。
开发提示:
有关布隆过滤器的相关知识,可以参考: https://en.wikipedia.org/wiki/Bloom_filter
可以利用 Redis 的 Bitmaps 实现布隆过滤器,GitHub 上已经开源了类似的方案,读者可以进行参考:
https://github.com/erikdubbelboer/Redis-Lua-scaling-bloom-filter
这里写图片描述
使用布隆过滤器应对穿透问题
这种方法适用于数据命中不高,数据相对固定实时性低(通常是数据集较大)的应用场景,代码维护较为复杂,但是缓存空间占用少。
两种方案对比
前面介绍了缓存穿透问题的两种解决方法 ( 实际上这个问题是一个开放问题,有很多解决方法 ),下面通过下表从适用场景和维护成本两个方面对两种方案进行分析。
缓存空对象和布隆过滤器方案对比
这里写图片描述
二、缓存雪崩问题优化
从下图可以很清晰出什么是缓存雪崩:由于缓存层承载着大量请求,有效的保护了存储层,但是如果缓存层由于某些原因整体不能提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。缓存雪崩的英文原意是 stampeding herd(奔逃的野牛),指的是缓存层宕掉后,流量会像奔逃的野牛一样,打向后端存储。
这里写图片描述
缓存层不可用引起的雪崩
预防和解决缓存雪崩问题,可以从以下三个方面进行着手。
1)保证缓存层服务高可用性。
和飞机都有多个引擎一样,如果缓存层设计成高可用的,即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,例如前面介绍过的 Redis Sentinel 和 Redis Cluster 都实现了高可用。
2)依赖隔离组件为后端限流并降级。
无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源。作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang 在这个资源上,造成整个系统不可用。降级在高并发系统中是非常正常的:比如推荐服务中,如果个性化推荐服务不可用,可以降级补充热点数据,不至于造成前端页面是开天窗。
在实际项目中,我们需要对重要的资源 ( 例如 Redis、 MySQL、 Hbase、外部接口 ) 都进行隔离,让每种资源都单独运行在自己的线程池中,即使个别资源出现了问题,对其他服务没有影响。但是线程池如何管理,比如如何关闭资源池,开启资源池,资源池阀值管理,这些做起来还是相当复杂的,这里推荐一个 Java 依赖隔离工具 Hystrix(https://github.com/Netflix/Hystrix),如下图所示。
Hystrix 是解决依赖隔离的利器,但是该内容已经超出本书的范围,同时只适用于 Java 应用,所以这里不会详细介绍。
这里写图片描述
Hystrix 示意图
3)提前演练。在项目上线前,演练缓存层宕掉后,应用以及后端的负载情况以及可能出现的问题,在此基础上做一些预案设定。
三、缓存热点 key 重建优化
开发人员使用缓存 + 过期时间的策略既可以加速数据读写,又保证数据的定期更新,这种模式基本能够满足绝大部分需求。但是有两个问题如果同时出现,可能就会对应用造成致命的危害:

  1. 当前 key 是一个热点 key( 例如一个热门的娱乐新闻),并发量非常大。
  2. 重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的 SQL、多次 IO、多个依赖等。

在缓存失效的瞬间,有大量线程来重建缓存 ( 如下图),造成后端负载加大,甚至可能会让应用崩溃。
这里写图片描述
热点 key 失效后大量线程重建缓存
要解决这个问题也不是很复杂,但是不能为了解决这个问题给系统带来更多的麻烦,所以需要制定如下目标:

  1. 减少重建缓存的次数
  2. 数据尽可能一致
  3. 较少的潜在危险
    1)互斥锁 (mutex key)
    此方法只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据即可,整个过程如图 :
    这里写图片描述
    使用互斥锁重建缓存
    下面代码使用 Redis 的 setnx 命令实现上述功能。
    这里写图片描述
    (1) 从 Redis 获取数据,如果值不为空,则直接返回值,否则执行 (2.1) 和 (2.2)。
    (2) 如果 set(nx 和 ex) 结果为 true,说明此时没有其他线程重建缓存,那么当前线程执行缓存构建逻辑。
    (2.2) 如果 setnx(nx 和 ex) 结果为 false,说明此时已经有其他线程正在执行构建缓存的工作,那么当前线程将休息指定时间 ( 例如这里是 50 毫秒,取决于构建缓存的速度 ) 后,重新执行函数,直到获取到数据。
    2)永远不过期
    “永远不过期”包含两层意思:
    从缓存层面来看,确实没有设置过期时间,所以不会出现热点 key 过期后产生的问题,也就是“物理”不过期。
    从功能层面来看,为每个 value 设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去构建缓存。
    整个过程如下图所示:
    这里写图片描述
    ” 永远不过期 ” 策略
    从实战看,此方法有效杜绝了热点 key 产生的问题,但唯一不足的就是重构缓存期间,会出现数据不一致的情况,这取决于应用方是否容忍这种不一致。下面代码使用 Redis 进行模拟:
    这里写图片描述
    作为一个并发量较大的应用,在使用缓存时有三个目标:第一,加快用户访问速度,提高用户体验。第二,降低后端负载,减少潜在的风险,保证系统平稳。第三,保证数据“尽可能”及时更新。下面将按照这三个维度对上述两种解决方案进行分析。
    互斥锁 (mutex key):这种方案思路比较简单,但是存在一定的隐患,如果构建缓存过程出现问题或者时间较长,可能会存在死锁和线程池阻塞的风险,但是这种方法能够较好的降低后端存储负载并在一致性上做的比较好。
    ” 永远不过期 “:这种方案由于没有设置真正的过期时间,实际上已经不存在热点 key 产生的一系列危害,但是会存在数据不一致的情况,同时代码复杂度会增大。
    两种解决方法对比如下表所示。
    两种热点 key 的解决方法
    这里写图片描述
    转载自微信:高可用架构
    这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_829754.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手教程:如何在手机钉钉中添加企业自己的系统网站应用?

前言 在企业办公过程中,为了方便在钉钉中访问已经的系统或应用,可以通过在钉钉中添加自己的企业应用,方便快速找到,进行高效办公。 下面,以YesDev项目管理为例,图文说明如何操作。 用电脑操作&#xff1a…

大型网站架构演化

互联网网站的发展只经历了短短20多年,20多年时间发生了巨大的变化。今天全球有近一半的人口使用互联网。但是一些问题也产生了,电子商务火热的市场背后却是不堪重负的网站架构。12306等。如何打造一个高可用、高性能、易扩展、可伸缩的安全性网站&#x…

果创云-在线中文接口编程的网站,低代码快速开发你的接口

中文接口编程 果创云(YesApi.cn),是一个API接口低代码开发平台。现在已经支持中文接口编程。也就是,你可以使用中文来自助开发自己的API接口。 不需要编程基础,就可以在线创建和开发自己的API接口,并且实…

ECS centos6.8系统下从nginx安装到简单网站上线配置操作的完整记录

1.准备工作 1.1已购买阿里云云服务器ECS 1.2域名已购买并解析成功 1.3安装有远程链接工具Xshell和文件传输工具Xftf,并链接上ECS实例 2.安装nginx(在Xshell操作) 2.1检查安装环境 Nginx是C写的,需要用GCC编译;Nginx的R…

JavaScript里mouseenter和mouseleave与mouseover和mouseout的区别

今天总结下mouseenter、mouseleave、mouseover、mouseout的区别&#xff0c;之前一直懵着用没仔细研究他们的区别&#xff0c;结果终于踢到铁板了。 上代码&#xff1a; <style> div { margin: 0 auto; }     .box { box-sizing: border-box; padding: 30px 0; width…

网站前端ajax翻页插件记录

网站前端ajax翻页插件记录 背景&#xff1a;写了个Django项目&#xff0c;但是在部署到服务器第一次打开网站前端首页的时候&#xff0c;加载速度超慢&#xff0c;主要集中在图片加载浪费时间&#xff0c;而此时我的前端很多部分还没有填充图片&#xff0c; 所以想写个ajax&…

这4个基本常识小窍门 做网站的你必须了解

互联网时代&#xff0c;长点基本网建知识和小窍门&#xff0c;是必须的。所谓知己知彼,方能百战不殆。今天&#xff0c;誉哥为大家GET点新技能。 第一步&#xff1a;域名注册。 域名又叫网址&#xff0c;有了域名不代表有网站&#xff0c;域名只是门牌号&#xff0c;无论用.COM…

PCB 使用第3方网站做为外链图片资源

计划将Web版SI9000阻抗计算工具放外网了,由于个人网站带宽太小原因, 准备将静态的图片资源放在第三方网站&#xff0c;今天找了好几个图床网站&#xff0c;把阻抗模型图上传到图床网站,这样一来就能解决带宽的问题了,今天折腾了老半天了,测试结果不是想要的效果,还是把阻抗模型…

电商网站模板_商城网站开发:开展在线业务要考虑什么

随着电子商务的快速发展&#xff0c;很多企业开始重视电商网站开发&#xff0c;想要做一个自己的电商网站&#xff0c;以便从互联网吸引客户&#xff0c;增加订单&#xff0c;扩大企业影响力。但是现在各种电商网站这么多&#xff0c;该如何制作网站&#xff0c;才能发挥它的作…

服务器性能差用cdn有用吗,CDN加速有用吗?对网站有什么好处?

随着网站的访问量增加的同时&#xff0c;网站访问速度也会越来越慢&#xff0c;带宽费也会花费很多&#xff0c;特别是现在的云主机&#xff0c;都是按照M计费的&#xff0c;而且5M以后就会很贵&#xff0c;对于一些人来说是无法承受的&#xff0c;因此&#xff0c;CDN加速服务…

网站地图生成器_6个让人震惊的网站,每一个都堪称神器!

今天给大家分享6个神仙网站&#xff0c;每一个都堪称神器&#xff0c;每一个都可以帮助你打开新世界的大门&#xff0c;让你震惊&#xff0c;所以一定要看到最后哦~1.PhotoMosh推荐理由&#xff1a;抖音风图片制作PHOTOMOSH​photomosh.com如果你想制作抖音风格的照片或者gif&a…

百度搜狗SEO快速排名模拟点击工具-提升关键词排名

模拟关键字排名点击工具是运用全国的模拟IP来点击搜索引擎关键字&#xff0c;和真实的点击无异&#xff0c;避免搜索引擎发现&#xff0c;现在很多快速排名的网站&#xff0c;都只有这样一款工具来接单&#xff0c;实现快速排名&#xff0c;它的原理是通过搜索这个关键字&#…

百度关键词快排虚拟发包程序-SEO快速排名系统

至2018上半年&#xff0c;随着搜索引擎&#xff08;BD&#xff09;算法的赓续优化和更新&#xff0c;数据发包刺激用户体验数据提拔的方法对词排名的结果逐步变小&#xff0c;我们想要获得更好的结果&#xff0c;照旧得从源头网站域名&#xff0c;布局&#xff0c;外链&#xf…

小旋风SEO蜘蛛池站群-手机企业版泛站群蜘蛛池

一、蜘蛛池是什么意思 简单来说&#xff0c;蜘蛛池就是一种通过利用大型平台权重来获得百度收录以及排名的一种程序。 所谓蜘蛛池&#xff0c;指的是做大量泛站让搜索引擎收录&#xff0c;作为自己的外链资源。 当有新的网站或新的页面时&#xff0c;把新URL放入到这些泛站资…

966SEO学习网:没有蜘蛛监控如何分析搜索引擎蜘蛛抓取量

以宝塔面板为例&#xff1a; 1、登录宝塔WEB面板&#xff0c;找到如下位置 2、点击下载.log结尾的日志文件&#xff0c;点右边的下载&#xff0c;下载到本地 3、利用软件对日志进行分析&#xff08;就可以看到具体蜘蛛抓取频次等&#xff09; 软件推荐光年日志分析 4、在线…

环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)

长度为n的环状串有n种表示法&#xff0c;分别为从某 个位置开始顺时针得到。例如&#xff0c;图3-4的环状串 有10种表示&#xff1a; CGAGTCAGCT&#xff0c;GAGTCAGCTC&#xff0c;AGTCAGCTCG等。 在这些表示法中&#xff0c;字典序最小的称 为"最小表示"。 输入一个…

企业网站制作之头部制作(一)

企业网站综合布局实战笔记 思路&#xff1a; 利用了两个盒子嵌套&#xff0c;一个ul嵌套3个li即可。 具体思路&#xff1a; 先创建外层次top盒子<div class"top">再创建内层top_content盒子 <div class"top_content">后面创建ul&#xff0c;…

企业外贸网站制作的要求及注意事项

随着经济全球化的发展&#xff0c;现在有很多的中国企业都已经开展了对外贸易业务&#xff0c;进行外贸的时候最为基础的就是要求是建立企业网站。如何为外贸企业建立一个良好的网站呢&#xff1f;今天小编就来和大家介绍下外贸网站制作的要求和一些注意事项。 企业外贸网站制作…

企业网站焦点图制作

企业网站焦点图制作 用的是myfocus这个插件。 注意点&#xff1a; 焦点图初始化的ID&#xff0c;与图片列表最外层的ID一致。图片列表外面&#xff0c;包裹一个class为pic的div。 具体思路 做轮播图的时候&#xff0c;记住&#xff0c;外面一个大盒子 <div class"…

企业网站制作之新闻中心制作

企业网站制作之新闻中心制作 新闻中心制作 效果图&#xff1a; 思路&#xff1a; 很简单&#xff0c;不说了。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &…