大型WEB网站架构深入分析_缓存
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
缓存
1介绍
缓存就是利用本地参考原则:当CPU要读取一个数据时,首先从缓存中查找,找到就立即读取并送给CPU处理;没有找到,就用相对慢的速率从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。它们几乎被用在每一个计算层上:硬件、操作系统、Web浏览器、Web应用程序等。一个缓存就相当于是一个临时内存:它有一个有限的空间量,但访问它比访问原始数据速度要快。缓存也可以存在于各个层的架构中,但经常在离前端最近的那个层上发现,在那里可以快速实现并返回数据,无需占用下游层数据。
那么如何利用缓存使数据访问更快呢在这种情况下,有许多地方可以插入缓存。一种是在请求层节点上插入缓存,如图1所示。
图 1 在请求层节点插入缓存
在请求层节点上放置一个缓存,即可响应本地的存储数据。当对服务器发送一个请求时,如果本地存在所请求数据,那么该节点即会快速返回本地缓存数据。如果本地不存在,那么请求节点将会查询磁盘上的数据。请求层节点缓存即可以存在于内存中(这个非常快速)也可以位于该节点的本地磁盘上(比访问网络存储要快)。
图2 多个缓存
]
当扩展到许多节点的时候,会发生什么呢如图2所示,如果请求层被扩展为多个节点,它仍然有可能访问每个节点所在的主机缓存。然而,如果你的负载均衡器随机分布节点之间的请求,那么请求将会访问各个不同的节点,因此缓存遗漏将会增加。这里有两种方法可以克服这个问题:全局缓存和分布式缓存。
1.1全局缓存
顾名思义,全局缓存是指所有节点都使用同一个缓存空间。这包含添加一台服务器或某种类型的文件存储,所有请求层节点访问该存储要比原始存储快。每个请求节点会以同种方式查询缓存,这种缓存方案可能有点复杂,随着客户机和请求数量的增加,单个缓存(Cache)很容易溢出,但在某些结构中却是非常有效的(特别是那些特定的硬件,专门用来提升全局缓存速度,或者是需要被缓存的特定数据集)。
在图3中描述了全局缓存常见的两种方式。当一个Cache响应在高速缓存中没有发现时,Cache自己会从底层存储中检索缺少的那块数据。如图4所示,请求节点去检索那些在高速缓存中没有发现的数据。
图3 负责检索数据的全局缓存
图4 全局缓存里负责检索的请求节点
大多使用全局缓存的应用程序都倾向于使用第一种类型,利用Cache本身来驱逐和获取数据以防止来自客户端的同一个数据区发出大量的请求。然而,在某些情况下,使用第二种实现反而更有意义。例如,如果该缓存用于存储大量的文件,低缓存的命中率会导致高速缓冲区不堪重负和缓存遗漏。
1.2分布式缓存
?
分布式缓存即缓存在分布式系统各节点内存中的缓存数据。如图5所示,每个节点都有自己的缓存数据,所以如果冰箱扮演着缓存杂货店的角色,那么分布式缓存就是把食物放置在不同的地方——冰箱、橱柜和饭盒——当索取的时候,方便拿哪个就拿哪个,而无需特地往商店跑一趟。通常情况下,会使用一致性哈希函数对缓存进行划分,例如,一个请求节点正在寻找一个特定块的数据,在分布式缓存中,它很快就会知道去哪里找,并确保这些数据是可用的。这种情况下,每个节点都会有一小块缓存,然后在向另一个节点发送数据请求。因此分布式缓存的优点之一就是只需向请求池添加节点即可增加缓存空间,减少对数据库的访问负载量。
当然,分布式缓存也存在缺点,例如单点实效,当该节点出现故障或宕机,那么该节点保存的数据就会丢失。
图5 分布式缓存
分布式缓存的突出优点是提高运行速度(前提当然是正确实现)。选择不同的方法也会有不一样的效果,如果方法正确,即使请求数很多,也不会对速度有所影响。然而,缓存的维护需要额外的存储空间,这些通常需要购买存储器实现,但价格都很昂贵。
其中一个非常流行的开源缓存产品:Memcached(即可以在本地缓存上工作也可以在分布式缓存上工作);然而,这里还有许多其他选项(包括许多语言——或者是框架——特定选项)。
Memcached用于许多大型Web站点,其非常强大。Memcached基于一个存储键/值对的hashmap,优化数据存储和实现快速搜索(O(1))。
Facebook采用不同类型的缓存技术来提升他们的网站性能(参考“Facebook caching and performance”)。在语言层面上使用$GLOBALS和APC(在PHP里提供函数调用),这有助于使中间函数调用更快(大多数语言都使用这些类型库来提升网站页面性能)。Facebook使用全局缓存并且通过多台服务器对缓存进行分布(参考“Scaling memcached at Facebook”),这就允许他们通过配置用户文件数据来获得更好的性能和吞吐量,并且还可以有一个中心位置更新数据(这是非常重要的,当运行成千上万台服务器时,缓存实效和一致性维护都是非常大的挑战)。
2Web缓存技术概述
WWW是互联网上最受欢迎的应用之一,其快速增长导致网络拥塞和服务器超载,缓存技术被认为是减轻服务器负载、降低网络拥塞,减少客户访问延迟的有效途径之一。其基本思想是利用客户访问的时间局部性(Temporal Locality)原理,将客户访问过的内容在Cache中存放一个副本,当该内容下次被访问时,不必连接到驻留网站,而是由Cache中保留的副本提供。
>
Web内容可以缓存在客户端、代理服务器以及服务器端。研究表明,缓存技术可以显著地提高WWW性能[,它可以带来以下好处:
(1)减少网络流量,从而减轻网络拥塞;
(2)降低客户访问延迟,其主要原因有:
①缓存在代理服务器中的内容,客户可以直接从代理获取而不是从远程服务器获取,从而减小了传输
延迟;
②没有被缓存的内容由于网络拥塞及服务器负载的减轻而可以较快地被客户获取;
(3)由于客户的部分请求内容可以从代理处获取,从而减轻了远程服务器负载;
(4)如果由于远程服务器故障或网络故障造成远程服务器无法响应客户请求,客户可以从代理中获取缓存的内容副本,使得WWW服务的鲁棒性(Robustness)得到了加强。
Web缓存系统也会带来以下问题:
(1)客户通过代理获取的可能是过时的内容;
,
(2)如果发生缓存失效,客户的访问延迟由于额外的代理处理开销而增加。因此在设计Web缓存系统时,应力求做到Cache命中率最大化和失效代价最小化;
(3)代理可能成为瓶颈。因此应为一个代理设定一个服务客户数量上限及一个服务效率下限,使得一个代理系统的效率至少同客户直接和远程服务器相连的效率一样。
2.1Web缓存系统的理想特性
一个理想的Web缓存系统应具有以下特性:
(1)快捷性:缓存系统应该能够有效地降低客户的访问延迟;
(2)鲁棒性:鲁棒性意味着可用性,客户希望Web服务随时可用;
(3)透明性:缓存系统对客户应是透明的,客户得到的结果仅仅是快速的响应和良好的可用性;
(4)可扩展性:Web缓存系统应能够随着网络规模和密度的不断增长而很好地进行扩展;
(5)高效性:Web缓存系统给网络带来的开销越小越好;
/