软件缓存架构技术的探讨

摘要

缓存是用于存储数据的硬件或者软件的组成部分,以便后续能更快访问相应的数据,是一种典型的以空间换取时间的技术,适合读多写少的业务场景。缓存中的数据可能是提前计算好的结果、数据的副本等。缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下的热点数据访问性能问题,提供高性能的数据快速访问。实现缓存的解决思路是将数据的写入/读取速度更快的存储设备,将数据缓存到离应用或者用户最近的位置。

关键字

缓存、分布式、高可用

缓存分类

一、CDN

简介

CDN(Content Delivery Network)内容分发网络。其基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。CDN强调网络在内容发布中的重要性,包括分布式存储、负载均衡、网络请求重定向和内容管理4个要件。
在这里插入图片描述

CDN网络架构图

内容分发机制

1.基于PULL的分发机制
基于PULL(下拉)的CDN分发机制基本原理主要是通过把用户服务请求调度到合适的边缘节点,如果发生内容未命中,则该边缘节点向上PULL(下拉)内容,如果其上级也没有,则逐级向上下拉。
2.基于PUSH的分发机制[1]
基于PUSH的内容资源分发机制是主动型资源分发机制,包括内容资源的主动预分发和用户请求、CDN服务节点、内容资源实现主动匹配。
3.混合分发机制
混合分发机制就是PUSH与PULL分发机制结合的一种机制。混合分发机制有多种方案,最常见的混合分发机制,是利用PUSH机制进行内容预推,后续的CDN内容分发机则使用PULL机制。

优点

镜像服务:消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量。
远程加速:远程访问用户根据DNS负载均衡技术智能自动选择包含cache服务的CDN节点,加快了远程访问的速度。
带宽优化:自动生成服务器的远程镜像,用户远程访问先从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载。
集群抗攻击:广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种DOS攻击对网站的影响,同时保证较好的服务质量。

二、反向代理缓存

反向代理位于应用服务器机房,处理所有对WEB服务器的请求。 如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向WEB服务器的请求数,从而降低了WEB服务器的负载。
应用场景:

一般只缓存体积较小静态文件资源,如css、js、图片

三、本地应用缓存

本地应用缓存,包括本地客户端缓存浏览器缓存。其最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适; 同时,它的缺点也是应为缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。

四、分布式缓存

分布式缓存指的是把数据分散到多个实例或者多台远程服务器,一般采用数据分片的模式根据算法分散存储到服务器。常用的算法是取模或者一致性哈希。设计分布式缓存的要从可用性、并发性、性能等多个方面进行考量。常用的分布式缓存Redis,memcached。
在这里插入图片描述

分布式缓存架构图

一般情况下有两层Nginx,第一层负责接入Nginx将请求发给第二层,第二层的Nginx带有本地的缓存,如果缓存命中直接返回,否则再读取分布式缓存。
分布式缓存集群为了保证可用性,一般采取主从架构,通过主从复制来实现数据的同步。缓存的更新可以采取懒加载或者订阅消息进行同步。

缓存带来的系统性问题

缓存穿透

缓存穿透是指缓存没有发挥作用,业务系统虽然去缓存查询数据,但是缓存中没有数据,需要再去数据库中查询,缓存没有起到作用
造成这种现象的原因有以下两种
1.存储数据不存在
原本数据就不在缓存和数据库中,可以在缓存中设置默认值,第二次访问的时候读取缓存就会获取默认值不会穿透到数据库去。
2.缓存数据生成耗费大量的时间或者资源
如果生成缓存需要耗费大量时间,假设访问缓存的时候数据正好失效,而生成需要大量时间,那么就会直接访问数据库去了。
这种情况没有一劳永逸的解决方法,在不同的场景下要根据具体情况作出相应的权衡,比如对将要访问的这一页数据进行缓存,对网络爬虫的情况作出监控以免拖垮系统等。

缓存雪崩

缓存雪崩是指当缓存在同一时间失效所引起的系统性能急剧下降的情况。重新生成又需要几十毫秒的时间,而对于一个高并发的业务系统来说,在这几十毫秒的过程系统可能会接到成千上百个请求,处理这些请求的线程又会集中区更新缓存造成巨大的性能压力,这些请求的压力会直接落到数据库上引起系统的崩溃。

解决缓存雪崩的有以下常用的方法:
1.把缓存的失效时间分散开,比如在原有的失效时间上增加一个一定范围内的随机值。
2.更新锁机制
在缓存失效后,通过加锁或者队列来控制数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,让其他线程等待。
3.后台更新机制
由特定的后台线程来更新缓存,而不是由业务线程来更新缓存,缓存本身的有效期设置为永久,后台线程定时更新缓存。当失效时间设置永久后,还需要设置一定的规则当系统内存不够用的时候删除一些缓存数据。当业务线程发现缓存失效后,通过消息队列发送后台线程更新缓存。除此之外后台更新机制可以用来进行缓存的预热,对一些常用的热点数据系统开启之后直接加载到系统缓存中,不等到用户访问来触发缓存的加载。

缓存热点

突发的热点事件造成流量爆发式增长,大量的热点数据集中访问导致某个缓存资源遇到性能瓶颈,可以考虑增加小容量的一级缓存来专门存储极其热点数据,通过部署多组小容量的一级缓存来应对爆发式的访问量

参考文献

[1]蒋杰,数字通信世界 2018,(08),12-13 DOI:10.3969/J.ISSN.1672-7274.2018.08.006

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值