« 上一篇下一篇 »

缓存系统解析

每个缓存服务器只有有限大小的磁盘和内存可以作为缓存使用。因为我们的照片工作集太大以至于缓存被填满。一个填满的缓存需要经常决定迁出哪个对象来为新来的对象腾出空间。该过程基于一个替换或“迁出”算法。虽然存在着很多的迁出算法,但是最通用的算法是采用最近最少使用(Least Recently Used , LRU)原则。
我们提过磁盘是基础设施中最慢的部分,对其的访问最耗时间。多数大型网站通过将数据缓存在不同位置来减轻这种昂贵操作的需求。

在Web架构中,缓存最经常被用于存储数据库结果(比如用Memcached)或实际文件 (比如用Squid和Varnish)。这两种方法对容量规划都要求有所考虑。它们是反向代理的示例,都是将缓存数据从Web服务器发向客户端(通常是Web浏览器)的专门系统。

缓存效率:工作集和动态数据

两个影响缓存容量的主要因素是你的工作集的大小,以及你的数据动态和变化的程度。

你的数据多久改变将决定你是否会选择缓存该数据。有一些数据几乎从来没有改变过。这种类型的数据包括用户名称和账户信息。还有一部分信息频繁地变动,如用户发出的最后一条评论,或上传的最后一张图片。

很显然,将频繁更改的数据缓存没有什么益处,因为代理将要花更多的时间使缓存无效而不是从中获取数据。每个应用程序都在缓存方面有其独特的特性,所以没有任何经验方法可遵循。然而,测量并记录缓存命中率对于理解它的效率十分重要。它可以帮助指导你进行容量规划,还有可能指引你如何(以及何时)缓存对象。

另一件主要考虑的事是你可缓存对象的工作集大小。缓存有一个固定的大小。可缓存对象的工作集是指在给定时期内请求的独特对象的数目——不管是数据库结果还是文件。理想的情况是,你将拥有足够的缓存容量来处理整个工作集。这意味着绝大多数的缓存请求会命中缓存。然而,在实际条件下,有很多原因致使你不能把所有对象放在缓存。你需要依靠所谓的缓存迁出为即将进来的新对象腾出空间。我将在后面再对缓存迁出多加陈述。

为了起作用,缓存软件需要保持跟踪其本身内部的度量指标。因此,大多数代理暴露这些度量指标,并允许监控工具测量和记录。

在Flickr,我们使用Squid作为反向代理来缓存照片。我们使用更慢、更便宜、更大容量的磁盘来存储照片,但是我们利用缓存系统提供照片,这些缓存系统使用的是更小但更快的磁盘。随着照片请求率增长,我们横向扩展缓存服务器的数量。随着照片数量的增长,我们还横向扩展后台存储的数量。

每个缓存服务器只有有限大小的磁盘和内存可以作为缓存使用。因为我们的照片工作集太大以至于缓存被填满。一个填满的缓存需要经常决定迁出哪个对象来为新来的对象腾出空间。该过程基于一个替换或“迁出”算法。虽然存在着很多的迁出算法,但是最通用的算法是采用最近最少使用(Least Recently Used , LRU)原则。

当请求进入缓存,基于最后一次被请求的时间,对象被组织到一个列表中。一个缓存错过的对象,一旦从原始服务器中获得,将被放在列表的顶部,而一个缓存命中对象也将从它原来的位置移到列表的顶部。这保证了所有的对象都按照最近使用的少排列。当缓存需要为新对象腾出空间时,从列表的底部移出对象。列表中最早的对象的时间即LRU参考时间,它和命中率一样,是缓存效率如何的指7K器。

LRU算法被用在Memcached、Squid, Varnish和其他无数缓存应用程序中。它的表现众所周知,而且相对容易理解。Squid为一些更复杂的迁出算法提供选择,但是几乎所有流行的数据库缓存都使用LRU方法。

跟踪任何缓存软件最重要的度量指标是:

•缓存命中率。

•总请求率。

•对象平均大小。

•LRU参考时间(当使用LRU方法时)。

让我们看看一些生产中缓存度量指标(使用Squid收集)。

« 上一篇下一篇 »