fifo页面置换算法设计思路_千万级并发!如何设计一个多级缓存系统?

什么是一个多级缓存系统?它有什么用?我们又如何设计一个多级缓存系统?

d028a281e7ff43fc3a534d6a2fb21371.png

图片来自 Pexels

所谓多级缓存系统,就是指在一个系统的不同的架构层级进行数据缓存,以提升访问效率。

我们都知道,一个缓存系统,它面临着许多问题,比如缓存击穿,缓存穿透,缓存雪崩,缓存热点等等问题,那么,对于一个多级缓存系统,它有什么问题呢?

有如下几个:

  • 缓存热点:多级缓存系统大多应用在高并发场景下,所以我们需要解决热点 Key 问题,如何探测热点 Key?
  • 数据一致性:各层缓存之间的数据一致性问题,如应用层缓存和分布式缓存之前的数据一致性问题。
  • 缓存过期:缓存数据可以分为两大类,过期缓存和不过期缓存?如何设计,如何设计过期缓存?

在这之前,我们先看看一个简单的多级缓存系统的架构图:

61c58b8cfeb7a80f9a64f172530fa464.png

整个多级缓存系统被分为三层:

  • 应用层 Nginx 缓存
  • 分布式 Redis 缓存集群
  • Tomcat 堆内缓存

整个架构流程如下:当接收到一个请求时,首先会分发到 Nginx 集群中,这里可以采用 Nginx 的负载均衡算法分发给某一台机器,使用轮询可以降低负载,或者采用一致性 Hash 算法来提升缓存命中率。

当 Nginx 层没有缓存数据时,会继续向下请求,在分布式缓存集群中查找数据,如果缓存命中,直接返回(并且写入 Nginx 应用缓存中),如果未命中,则回源到 Tomcat 集群中查询堆内缓存。

在分布式缓存中查询不到数据,将会去 Tomcat 集群中查询堆内缓存,查询成功直接返回(并写入分 Redis 主集群中),查询失败请求数据库;堆内缓存。

如果以上缓存中都没有命中,则直接请求数据库,返回结果,同步数据到分布式缓存中。

在简单了解了多级缓存的基本架构之后,我们就该思考如何解决上面提到的一系列问题。

缓存热点

缓存热点,是一个很常见的问题,比如“某某明星宣布结婚”等等,都可能产生大量请求访问的问题,一个最麻烦也是最容易让人忽视的事情就是如何探测到热点 Key。

在缓存系统中,除了一些常用的热点 Key 外,在某些特殊场合下也会出现大量的热点 Key,我们该如何发现呢?

有以下策略:

  • 数据调研。可以分析历史数据以及针对不同的场合去预测出热点 Key,这种方式虽然不能百分百使得缓存命中,但是却是一种最简单和节省成本的方案。
  • 实时计算。可以使用现有的实时计算框架,比如 Storm、Spark Streaming、Flink 等框架统计一个时间段内的请求量,从而判断热点 Key。或者也可以自己实现定时任务去统计请求量。

这里我们着重讨论一下第二种解决方案,对于热点 Key 问题,当缓存系统中没有发现缓存时,需要去数据库中读取数据。

当大量请求来的时候,一个请求获取锁去请求数据库,其他阻塞,接着全部去访问缓存,这样可能因为一台服务器撑不住从而宕机。

比如正常一台服务器并发量为 5W 左右,产生热点 Key 的时候达到了 10W 甚至 20W,这样服务器肯定会崩。所以我们在发现热点 Key 之后还需要做到如何自动负载均衡。

结合以上问题我们重新设计架构,如下图所示:

5bd681ee604d11c2adb52ffa472c2ce5.png

我们将整个应用架构分为:

  • 应用层
  • 分布式缓存
  • 系统层
  • 数据层

在应用层,我们采用 Nginx 集群,并且对接实时计算链路,通过 Flume 监控 Nginx 日志,将数据传输到 Kafka 集群中,然后 Flink 集群消费数据进行统计。

如果统计结果为热点 Key,则将数据写入 Zookeeper 的节点中,而应用系统通过监控 Znode 节点,读取热点 Key 数据,去数据库中加载数据到缓存中并且做到负载均衡。

实际上,对于应用系统中的每一台服务器,还需要一层防护机制,限流熔断,这样做的目的是为了防止单台机器请求量过高,使得服务器负载过高,不至于服务器宕机或者大量请求访问数据库。

简单思路就是为每一台服务器设计一个阀值,当请求量大于该值就直接返回用户空白页面或者提示用户几秒后刷新重新访问。

数据一致性

数据一致性问题主要体现在缓存更新的时候,如何更新缓存,保证数据库与缓存以及各层缓存层之间的一致性。

对于缓存更新问题,先写缓存还是先写数据库,这里省略若干字。之前的文章介绍过,有兴趣的读者可以翻阅。

在单层缓存系统中,我们可以先采用删除缓存然后更新数据库的方案来解决其数据一致性问题,那么对于多级缓存呢?

如果使用这种方案,我们需要考虑,如果先删除缓存,那么需要逐层去做删除操作,那么这一系列操作对系统带来的耗时也是很可观的。

如果我们使用分布式事务机制,就需要考虑该不该将写缓存放入事务当中,因为我们更新分布式缓存,需要走网络通信,大量的请求将导致网路抖动甚至阻塞,增加了系统的延迟,导致系统短时间内不可用。

如果我们不将写缓存这一操作放入事务当中,那么可能引起短时间内数据不一致。

这也就是分布式系统的 CAP 理论,我们不能同时达到高可用和一致性。那么该如何抉择呢?

这里我们选择保证系统的可用性,就一个秒杀系统来讲,短暂的不一致性问题对用户的体验影响并不大(当然,这里不涉及支付系统)。

而可用性对用户来说却很重要,一个活动可能在很短的时间内结束,而用户需要在这段时间内抢到自己心仪的商品,所以可用性更重要一些(这里需要根据具体场景进行权衡)。

在保证了系统的可用性的基础上,我们该如何实现呢?如果实时性要求不是很高,我们可以采用全量+增量同步的方式进行。

首先,我们可以按照预计的热点 Key 对系统进行缓存预热,全量同步数据到缓存系统。

接着,在需要更新缓存的时候,我们可以采用增量同步的方式更新缓存。比如我们可以使用阿里 Canal 框架同步 Binlog 的方式进行数据的同步。

缓存过期

缓存系统中的所有数据,根据数据的使用频率以及场景,我们可以分为过期 Key 以及不过期 Key,那么对于过期缓存我们该如何淘汰呢?

下面有常用的几种方案:

  • FIFO:使用 FIFO 算法来淘汰过期缓存。
  • LFU:使用 LFU 算法来淘汰过期缓存。
  • LRU:使用 LRU 算法来淘汰过期缓存。

以上几种方案是在缓存达到最大缓存大小的时候的淘汰策略,如果没有达到最大缓存大小,我们有下面几种方式:

  • 定时删除策略:设置一个定时任务,在规定时间内检查并且删除过期 Key。
  • 定期删除策略:这种策略需要设置删除的周期以及时长,如何设置,需要根据具体场合来计算。
  • 惰性删除策略:在使用时检查是否过期,如果过期直接去更新缓存,否则直接返回。

作者:不清不慎来源:架构师社区

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

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

相关文章

apple quicktime怎么在ppt中用_PPT情感专题大赏No. 007:一份这就是街舞第三季主题PPT(上集)...

Hello,大家好,这里是千师傅小作坊第35期,我是你们的老朋友千千。熟悉千师傅小作坊的人都知道,千师傅特别喜欢看综艺,尤其是音乐、表演、舞蹈类。作为一个十八线PPT设计师,如果我看到好看的节目视觉设计&…

idea内存溢出解决_各种OOM代码样例及解决方法

针对目前大家对OOM的类型不太熟悉,那么来总结一下各种OOM出现的情况以及解决方法。把各种OOM的情况列出来,然后逐一进行代码编写复现和提供解决方法。1. 堆溢出-java.lang.OutOfMemoryError: Java heap space。2. 栈溢出-java.lang.OutOfMemorryError。3…

win7安装硬盘后无法启动计算机,硬盘装Win7系统电脑后开机提示DISK BOOT FAILURE怎么办【图文】...

很多人都喜欢安装win7系统,而硬盘安装系统的方式也是深受用户们的喜欢,但是最近有用户反映说硬盘安装win7系统之后,在重启计算机的时候屏幕提示DISK BOOT FAILURE,INSERT SYSTEM DISK AND PRESS ENTER,导致无法正常进入系统&#…

导入数据中文乱码_基于Navicat和Kettle的数据迁移完全解读(多图)

需求描述对于数据分析人员来说,工作的基础是数据,没有数据分析就无从谈起,即巧妇难为无米之炊。#数据库# #数据迁移# #Oracle# 然而,数据分析往往在实验环境或者准生产环境中开展,而数据分布在生产环境,因此…

怎样能确保计算机安全,如何确保电脑安全

如何确保电脑安全电脑安全问题层出不穷,如何确保电脑安全呢?下面是小编分享的一些方法,一起来看一下吧。一、关闭默认共享大部分的电脑系统在默认的情况下都是自动开启网络共享设置的,Win7系统也不例外,该功能主要是为了用户能够…

点云平面提取_基于LiDAR点云数据滤波方法

基于LiDAR点云数据滤波方法机载激光雷达所获取的数据被称为“点云(points cloud)”它在三维空间中呈现出随机分布的形状。在点云中,有些点属于真实的地形表面的点,有些点属于人工建筑物塔、输电线、桥等或自然植被如树、灌木、草、其他植物。激光雷达数据…

全国计算机一级书红色封面,年度最强的网红录取通知书,竟然附赠了一张黑胶唱片...

这两天世超被一张来自中国科学院大学的录取通知书给刷屏了,这份录取通知书里还附赠了一张黑胶光盘。光盘上刻录了一份国科大为新生准备的特别的礼物 —— 一段来自宇宙深处的声音。它们是由国科大师生通过 500 米口径球面射电望远镜( FAST )捕获的 15 颗脉冲星信号&…

动态新增表字段_制作动态的数据透视表(一):定义名称法创建数据透视表

——施瓦辛格:没有跌倒过的人不会成功。我们的日常工作中,会经常遇到一种情况:创建好数据透视表后,有其他被遗漏的数据内容需要重新插入到数据源后,有其他被遗漏的数据内容需要重新插入到数据源中;或者是需…

计算机公式or,【转载】 odds、OR和RR的计算公式和实际意义

1. OddsOdds 的意思为机率、可能性,是指某事件发生的可能性(概率)与不发生的可能性(概率)之比。假如某药物有疗效的比例为p1,则无效的比为1-p1,则odds的计算公式为:对于如下表所示的四格表,患病组的中暴露的概率(以实测…

系统相机裁剪比例_拍照时图片比例怎么选?比构图还要提前一步的摄影攻略要做好...

谈到摄影第一步,很多人都在说构图,但是比构图还要提前一步的,是选择合适的拍摄比例。在拍照时,始终是把要拍的东西装进设备的取景器里面,所以取景器的比例是16:9,还是4:3或者其他,就直接影响了我…

源码安装mysql_CentOS 7中源码安装MySQL 5.7.16 (亲测成功)

最近在CentOS 7中源码安装MySQL 5.7.16,发现MySQL5.7.6以后的安装方式真的与以前版本的MySQL安装方式大大的不同呀。不自己安装一把,下面这篇文章是通过自己的安装过程总结的一篇安装教程,有需要的朋友们可以参考借鉴,下面来一起看…

css动画定义,CSS3中Animation动画的定义和调用

现在经常会看到一些门户网站的专题使用到CSS3的动画,咋也不能落伍,在此这梳理下动画知识吧,便于后面用到。接下来介绍下Animation动画的定义和调用,在介绍Animation之前需要了解下Keyframes,英文意思就是关键帧&#x…

mysql5.7+proxy_mysql 5.7+mysql-proxy 0.8.5 读写分离

主从环境:mysql操做系统:CentOS6.5_x64linux主服务器Master:192.168.0.103sql从服务器Slave:192.168.0.105后端调度服务器MySQL-Proxy:192.168.0.104服务器1、mysql主从复制tcp2、mysql-proxy实现读写分离测试一、安装…

mysql 账户管理_Mysql账户管理原理与实现方法详解

本文实例讲述了Mysql账户管理原理与实现方法。分享给大家供大家参考,具体如下:账户管理在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然后连接进行…

navicat for mysql 用户_Navicat for MySQL 怎么/怎么添加管理用户?Navicat for MySQL 添加管理用户教程_37游游网...

【37游游攻略】为了保证数据库的安全,对操作用户分级授权是非常有必要的,Navicat for MySQL 给我们提供了一个非常强悍又非常便捷的用户管理系统。点击位于连接右侧的用户命令,随之弹出管理用户的界面,Navicat for MySQL 系统默认…

js如何上传大文件到服务器,js将文件上传到远程服务器

js将文件上传到远程服务器 内容精选换一换将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式。本节为您介绍本地Windows计算机通过远程桌面连接,上传文件至Windows云服务器的操作方法。Windows云服务器可以访问公网。在本地Windows计算机上&#xff0c…

增强服务器安全性能,加强Linux服务器安全的20项建议

很多人都说 Linux 在默认配置下很安全,我在一定程度上同意这个说法(很值得商榷的话题)。不过 Linux 内置的安全模型和工具做得确实很到位,用户只需进行简单的调整和自定义就可以加强 Linux 服务器安全。与恶意用户做斗争对于所有 Linux 系统管理员来说都…

阴阳师师徒系统不同服务器,阴阳师体服师徒系统未收录改为随机SSR

昨天下午,受到很多争议的体服“师徒系统”更新啦!新版的“师徒系统”修改了徒弟的条件,总的来说能剔除压级大佬,并且之前奖励未收录SSR降低为随机SSR式神,难怪很多阴阳师都说:“大快人心!”的确…

Mysql union联合查询_Mysql联合查询union和union all的使用介绍

一、UNION和UNION ALL的作用和语法UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同.SQL UNION…

ios 查看同文件名_实战恢复cisco 2950交换机的IOS

本来想用两台思科交换机做实验的,可是通过console口进入其中一台交换机后却发现这个台交换机的IOS文件丢失了。本来正常进入交换机后应该是首先进入到用户模式的,而且提示符应该是“>”,而现在提示符却成了“:”,如…