从网站架构的发展看缓存架构的发展(参考《深入分布式缓存从原理到实践》)

前言

本文的观点和看法是对《深入分布式缓存从原理到实践》于君泽 曹洪伟 邱硕等著[ISBN : 9787111585190]一书中第一章内容的总结和理解,笔者最近在看缓存架构方面的书,觉得这本书很不错,来自京东,蚂蚁等多家大公司的架构师合著的一本书,内容不算详实,但是结合原理和实践来讲解很有趣,就是内容偏难,笔者也是很多地方看不懂,但是对于不懂缓存架构的但是想构建起来对于缓存架构的知识框架的人来说,是一本不错的提升水平的书,下面结合这本书和自己的理解说说网站的架构的发展对于缓存架构发展的影响

说说网站架构的发展

先自黑一下,读了这本书,才知道笔者现在的水平竟是停留在单系统架构的层面,甚至不能称之为架构,一直以来做web系统开发,写的都是业务代码,因为用户量也不大,单系统配个LNMP环境基本hold住,所以应对稍大的访问量解决方案往往是加带宽加配置,就是烧钱,对于如何从系统架构的角度考虑解决大用户量访问问题还真没有,还需日后多加修炼

在商圈流行着一句话叫"现金为王",而在软件贵圈中则是流行"缓存为王"的说法,可见缓存对于软件系统的重要性,缓存架构的发展(我这里只说软件系统中的缓存)也是基于网站架构的发展而发展起来的,我来总结一下网站架构的发展,从中引出缓存的出现和发展的必要

(1)在网站开始流行之初,网站的架构就是最简单的单系统架构,也就是所有的服务都处于一台物理机上,比如,数据库服务、web容器服务、基础环境等。这时候网站刚刚兴起,访问量不大,LAMP的集成环境就可以支撑起一般数量的访问量;
(2)随着网站的慢慢发展,网站的访问量加大了,原来的单系统结构受到web容器和物理机的资源限制,访问速度开始减慢,这时候有人便把服务拆分放到了不同的物理机上,就是把数据库服务和web服务分离到不同的物理机上并通过网络互联,这解决了一部分的访问量;
(3)但随着访问量继续加大,这样的分离也不能支持访问量了,于是缓存就出现了,缓存的出现是为了减轻服务器和数据库访问压力,例如静态页面缓存,把上一次访问的页面缓存到客户端,通过response请求头的expires来设置缓存失效时间,在失效时间内访问页面客户端会自动加载缓存在本地的页面,这样就节省了请求在网络上的传输时间和在服务器上的处理时间从而减少了响应时间,当然这就产生了数据更新问题,这个问题可以通过response请求头中的Last-Modified字段和request请求头中的If-modified-Since字段的比较来完成数据的更新,具体什么原理呢?其实很简单:
①第一次请求数据时,客户端把response请求头中的Last-Modified赋给If-modified-Since,并返回资源
②之后请求资源的时候,先去检查缓存无缓存则①,有缓存则③
③向服务端发送一次请求,服务端拿到If-Modified验证If-Modified,是否等于请求文件的修改时间戳date,等于的话说明当前缓存中的是新的,客户端直接返回缓存中的数据,如果不等于则说明缓存中的是旧的,则服务器返回新的
(4)客户端缓存是可以减轻服务器压力,但是网站访问量的增大带来了庞大的数据量,然而客户端的缓存是有限的而且往往很小而且客户端的物理资源更是有限,所以这些数据不可能都缓存在用户端,于是缓存的概念和实现便开始从客户端向网络和服务器端延深,比如nginx中可以通过配置缓存把动态内容的中的静态资源缓存起来,更新方式其实多差不多,都是通过时间戳验证去更新,再后来出现数据缓存,把数据库中经常访问的数据缓存起来,避免频繁的数据库访问,于是乎在很多网站中缓存的架构是多级的,是客户端缓存和服务器缓存同时使用的多级缓存结构
(5)与此同时,再通过缓存解决了一部分访问压力后,但是很快,应用服务器还是慢了下来,因为物理受限,无论缓存结构有多优秀,但是物理上存在极限,于是有人想通过多增加应用服务器的个数来提高这个物理极限,这便是服务集群;集群简单来讲就是一群通过内部网络互联共同提供服务的而对用户无感知的计算机组群,集群的原理就是通过在内部网络里复制一份物理机分摊访问压力来满足高访问量,而实现这种集群技术的关键就是我们常听到的反向代理和负载均衡。简单来说,就是服务集群需要有一个管理者,集群中IP那么多不可能都暴露给用户,而且要实现服务资源的合理配置和使用,如何访问的权限也不能交给用户去决定 ,所以为了给用户一个统一的访问IP以及完成资源的合理配置, 反向代理服务器和负载均衡服务器的概念应运而生,比如高性能web服务器Nginx可以实现反向代理和负载均衡的能力,这个服务器作为其他应用服务器的统一管理者,负责统一接受用户的请求(反向代理)并根据集群中不同服务器的资源配置情况合理转发请求给相应服务器处理(负载均衡)并统一响应请求(反向代理) 。在集群的基础上,解决应用访问量的方案便成了不断地向集群中加入服务器来提高性能。其实,从这里我们已经可以看到一些缓存上问题,就是缓存在物理上开始分离,带来的问题就是如何保持应用服务器中数据缓存信息的同步呢?这时候通常会开始使用缓存同步机制以及共享文件系统或共享存储等
(6)集群的架构已经可以解决很高的访问量了,但是随着访问量继续上升,以及企业业务在不同地域的扩展,不断增大集群产生的效益已经不是很明显了。业务的扩展,带来了数据库系统的不断扩大,在集群模式下,那种简单的复制物理机而不改变业务模式的方式显然是行不通了,于是数据库开始分库分表并根据实际业务部署到不同地域不同物理机中,即分布式数据库系统开始出现。分布式概念出现后,人们开始思考像集群这种集中式服务的弊端,于是分布式服务也开始出现。分布式服务是把一个完整系统拆分为多个子系统,分别去构建子系统,这些子系统各个独立但又是可以互联的,就像是一个圈上的各个节点,在各个节点内系统的构建可以是一个集群,多个节点共同构成了一个完整系统,这样的分布式结构解决了至少三个问题①业务扩展的问题②服务耦合的问题③在传统集中式结构中庞大的数据量存储问题。随着这种分布式服务的出现,分布式缓存也出来了,在集群中缓存可以通过同步机制在物理机中同步复制,但是数据量太大了,导致现在不太可能将缓存存储在本地后再同步,于是分布式缓存出现,将大量数据缓存转移到了分布式缓存上来

至此,网站的架构发展我就简单介绍完了,我们可以看到缓存的发展是贯穿在整个web网站架构的发展之中的,也是网站非功能需求的重要一项,不能说是提高网站性能的充要,但是绝对是重中之重的环节,缓存做的好,可以减少通过增加服务器来提高性能的成本

多级缓存中常用的一些缓存

如果不涉及硬件和操作系统级别的缓存,根据在软件系统中所处位置的不同,缓存可以分为三级:

  • 客户端缓存
  • 网络中的缓存
  • 服务端的缓存

我下面分别从这三个方面简单说说常见的缓存,笔者这里也是略作总结,有误望指正

客户端缓存

  • 客户端页面缓存 : 这里加了一个客户端的前缀是为了区分在服务器端也有一种页面缓存的概念是指将静态页面或者动态页面中的元素进行缓存,而这里的页面缓存是指在客户端进行的一种页面自身的缓存,可以解决离线应用。这个在H5的新特性中,可以在一个H5页面配置manifest属性,并在服务端配置manifest清单文件,来实现客户端缓存页面,离线使用H5应用。这个个人觉得使用的不是很多,笔者也是读了这本书才知道。
  • 浏览器缓存 : 这个我在上面一节中也有讲解,就是浏览器在硬盘上专门开辟一个空间来储存资源副本作为缓存,至于更新策略,就是我上面所说的通过If-Modified-Since和Last-Modified字段来实现的

网络中的缓存

这个乍一看可能会觉得会不会是网路中路由器或是交换机上的缓存?当然不是,网络设备上的缓存一是很小很小不可能作为web系统的缓存,二是网络设备并不具备HTTP协议的服务,网络设备上运行的协议都是网络层的,而我们web需要的HTTP协议是在应用层,所以基于以上两点网络中的缓存肯定不是指网路设备上的缓存。那是指的什么?我们可以这样理解,这里的网络指的是:从用户端到应用服务器之间的距离。所以这这段距离上可能使用缓存的,就是代理服务器了。所以我的理解,网络中的缓存就是指代理服务器上的缓存

  • 代理缓存 : 这里的代理我们知道,又分为正向代理和反向代理两种,这两种代理很像,区别就是应用场景不同功能不同,正向代理是为了获取防火墙外客户机无权访问的资源,而且需要客户机进行相应的配置,本质上说正向代理服务器就是源服务器和客户机之间的一个媒介;而反向代理则是为了代理多个服务器而为客户机提供某一个服务,也就是说客户机不需要知道真正提供服务的IP是什么,只需要有一个访问的接口就行了,而反向代理正是提供这个接口。正向代理和反向代理本质上没有什么联系,只是叫法上有些让人容易以为两个是有联系的,其实应用场景完全不同。代理缓存的方式其实和客户端缓存区别不大,只是这个是在网络中而已
  • 边缘缓存 : 引用一下书上的概念"如果这些反向代理服务器能够做到和用户来自同一个网络,那么用户访问反向代理服务器,就会得到很高质量的响应速度,所以可以将这种的反向代理缓存称为边缘缓存",最典型的边缘缓存大家肯定都听说过,CDN缓存,这个其实和反向代理缓存一样无非是概念上的地域区别

服务端缓存

这一点的缓存比较高深,笔者能力有限,只做一些介绍

  • 数据库缓存 : 这个很好理解了,就是DBMS把经常访问到的select查询结果通过hash缓存起来,下次在select的时候先去缓存中找,如果hash列表中有则直接返回,如果没有就数据库访问一次。以Mysql为例,Mysql默认情况下,是不开启缓存的,需要自己去设置Query cache的相关属性参数。
  • 平台级缓存 :这里我的理解是,也可以叫做是框架级缓存,就是依托于第三方框架实现,自己不需要手动管理的,书上给的例子有Ehcache,JBoss Cache等(这点不是很懂,不多讲,有兴趣的可以去看原书了解)
  • 应用级缓存 :应用级缓存是需要开发者通过代码来实现缓存机制的,比如使用redis内存存储系统做应用级缓存,或是MongDB 、Memcached等都可以作为应用级缓存的工具
发布了65 篇原创文章 · 获赞 58 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/AngelLover2017/article/details/83006455