一.memcached的内存存储
1.Slab Allocation机制
最近的memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配通过malloc和free来进行,但是该机制会导致内存碎片,加重操作系统的负担;
2.原理
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块(chunk),并把尺寸相同的块分成组(chunk的集合);
3.术语
page:分配给Slab的内存空间,默认是1MB,分配给Slab之后根据slab的大小切分成chunk;
chunk:用于缓存记录的内存空间;
Slab Class:热定大小的chunk组;
4.缺点
由于分配的是特定长度的内存,因此无法有效利用分配的内存;
5.Growth Factor因子
memcached在启动时指定Growth Factor因子(-f选项),可以在某种程度上控制slab之间的差异,默认是1.25,即组的大小依次增大Wie原来的1.25倍;
6.查看memcached的内部状态,首先使用telnet HOST port连接到memcached,输入stats命令,即可获得包括资源利用率在内的各种信息,stats salbs或stats items还可获得关于缓存记录的信息。
二.memcached的分布式实现
1.原理:
首先向memcached中添加键,将键传给客户端程序库后,客户端实现的算法就会根据键来决定保存数据的memcached服务器,选定之后,保存键和值;
当要获取保存的数据时,将需要获取的键传给函数库,函数库通过与数据保存时相同的算法,根据键来选择服务器,使用的算法相同,就能选中保存时相同的服务器,然后发送get命令;
2.Cache::Memcached的分布式方法
1)Perl的memcached客户端函数库Cache::Memcached实现了分布式功能,是memcached标准的分布式方法,是根据余数计算分散,就是“根据服务器台数的余数进行分散”,求得键的整数哈希值,再除以服务器台数,根据余数来选择服务器;
2)通过该算法可以很好地实现分散,但其缺点是:当服务器台数发生变更时,缓存重组的代价巨大,影响缓存命中率;
3.Consistent Hashing
1)该算法首先求出memcached服务器的哈希值,并将其配置到0~2^32的圆上,然后用同样的方法求出存储数据的键的哈希值,并映射到圆上,然后从该位置顺时针查找memcached节点,将数据保存到找到的第一个节点上,如果没有找到,则保存在第一台上;
2)当节点数量变更时,只有在圆上增加节点附近的数据会受到影响,因此能最大程度地抑制键的重新分布,但是服务器的映射地点分布不均匀。