注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

中吴南顾惟一笑

成功法则就是那19个字

 
 
 

日志

 
 

[转]memcache使用的一些技术  

2010-09-14 19:14:37|  分类: R&D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应迟缓、网站显示延迟等重大影响。

这时就该memcache大显身手了。memcache是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

memcache作为高速运行的分布式缓存服务器,具有以下的特点。

1).协议简单
memcache的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过telnet 也能在memcache上保存数据、取得数据。也支持二进制协议,节省了解析时间,更加高效。

2).基于libevent的事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcache使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

3).服务器端并没有分布式功能。
各个memcache不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。


内存管理
最近的memcache默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担。Slab Allocator就是为解决该问题而诞生的。

下面来看看Slab Allocator的原理。下面是memcache文档中的slab allocator的目标:

the primary goal of the slabs subsystem in memcache was to eliminate memory fragmentation issues totally by using fixed-size memory chunks coming from a few predetermined size classes.

也就是说,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。

Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)
memcache不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible),其存储空间即可重复使用。

Slab Allocation的主要术语:

Page - 分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。

Chunk - 用于缓存记录的内存空间。

Slab Class - 特定大小的chunk的组。

在Slab中缓存记录的原理
memcache根据收到的针对客户端发送数据的大小,选择最适合数据大小的slab。 memcache中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

Lazy Expiration
memcache内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy expiration。因此,memcache不会在过期监视上耗费CPU时间。

LRU:从缓存中有效删除数据的原理
memcache会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。

分布式算法
将不同的键保存到不同的服务器上,就实现了memcache的分布式。

1).memcache标准的分布式方法
就是"根据服务器台数的余数进行分散"。首先求得键的整数哈希值(比如字符串的CRC值),再除以服务器节点数目,根据其余数来选择服务器。
余数计算的方法简单,数据的分散性也相当优秀,但也有其缺点。那就是当添加或移除服务器时,缓存重组的代价相当巨大。添加服务器后,余数就会产生变化,这样就无法获取与保存时相同的服务器,从而影响缓存的命中率。

2).新的方法Consistent Hashing
首先求出memcache服务器(节点)的哈希值,并将其配置到0~2^32的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找不到服务器,就会保存到第一台memcache服务器。
在Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。因此,Consistent Hashing最大限度地抑制了键的重新分布。而且,有的Consistent Hashing的实现方法还采用了虚拟节点的思想。使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器)在continuum上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。
  评论这张
 
阅读(1447)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017