memcached的简单剖析及试用

1、 Memcached是什么?

memcached是高性能的分布式内存缓存服务器。用于动态web应用以减轻数据库的负载。

2、 Memcached的特性

1) 协议:它是基于文本行的协议。

2) 基于Libevent的事件处理。

3)内存存储方式:它将数据保存在内存中,因此重新启动mc或者服务器的时候数据会丢失。目前Mc中采用Slab Allocatior机制分配、管理内存。

Slab Allocation机制出现之前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。 但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢。 

Slab Allocator采用按照预先规定的大小,将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合)(图1) 以完全解决内存碎片问题。

Slab Allocato的构造图

Slab Allocatior的基本原理是:Slab Allocatior按照预先规定的大小,将分配的内存分割成各种特定长度的块,并把尺寸相同的块分成组,mc每次根据收到的数据的大小,选择最适合数据大小的slab,将其保存在slab内空闲的chunk的列表中。选择存储记录的组的方式如图所示:

图 选择存储记录的组的方式

分配给Slab分配的默认内存空间是1MB,因此一般存储的信息的value值要小于等于1MB。Chunk是用于缓存记录的存储空间,它的大小可以通过Growth Factor控制,即命令下通过$ memcached -f 2 –vv来修改chunk的大小。

Slab Allocator的缺点:由于分配的是特定长度的内存,因此无法有效的利用分配的内存。通过预先估计系统中存入的数据的大小,只要使用适合数据大小的组的列表,就可以减少浪费。

4)分布式

根据键值来决定数据所在的服务器,将数据存储于不同的服务器中,而且在mc的分布式处理时一般有根据余数计算分散和Consistent Hashing两种算法。

根据余数计算分散:也就是“根据服务器台数的余数进行分散”。 求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。

它的不足是添加或者减少一台服务器时,命中率会明显降低,这样会导致瞬间db的压力增高。

Consistent Hashing:首先求出memcached服务器(节点)的哈希值, 并将其配置到0~232的圆(continuum)上。 然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。 如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。基本原理如下图所示:

Consistent Hashing 的基本原理

它添加或者去掉一个服务器的时候,只会影响逆时针方向的第一个服务器的键的情况。添加或者移除图如下。

图 Consistent Hashing 添加服务器

3mc的删除机制

mc分配的资源不会释放,只是下次数据进来的时候重复写在已分配的资源上。Mc内部也不会实时监控记录是否过期,而是在get的时候检查数据是否过期,如果已过期,将该键值的数据设为invisible,使取不到数据。

Mc有写入时,会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况, 此时就要使用名为 Least Recently UsedLRU)机制来分配空间。 顾名思义,这是删除最近最少使用的记录的机制。 因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。

但是在启动的时候使用-M 就会禁止在空间不足时使用LUR机制分配空间

4mc的使用

    1启动 memcached

./memcached -d -m 2048 -l 10.0.0.40 -p 11211

    2) 连接到 memcached

telnet localhost 11211

如果一切正常,则应该得到一个 telnet 响应,它会指示 Connected to localhost(已经连接到 localhost)。如果未获得此响应,则应该返回之前的步骤并确保 libevent 和 memcached 的源文件都已成功生成。

  3)基本 memcached 客户机命令

您将使用五种基本 memcached 命令执行最简单的操作。这些命令和操作包括:

set

add

replace

get

delete

gets

cas

使用cas是为了防止多个用户同时写入的时候,旧的数据覆盖最新的写入,所以用cas,传入最近gets到的标志,这样在cas的时候,如果判断不是最新的,则丢弃,只有最新的数据才能写入。

    4)缓存管理命令

最后两个 memcached 命令用于监控和清理 memcached 实例。它们是 stats 和 flush_all 命令。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章