《Memcached全面剖析》笔记

442 阅读3分钟

1 基础

Memcached是以 LiveJournal 旗下 DangaInteractive 公司的 Brad Fitzpatric 为首开发的一款高性能的分布式内存缓存服务器。

1.1 特征

  • 协议简单:简单的基于文本行的协议
  • 基于libevent事件处理
  • 内置内存存储方式
  • memcached不互通信的分布式:”分布式“没有在服务器端实现,而是取决于客户端。

memcached的分布式

1.2 指令

保存数据

  • add('key', 'value' ,'expire'):key不存在则保存
  • replace('key', 'value', 'expire'):key存在则保存,会覆盖旧值
  • set('key', 'value', 'expire'):直接保存

获取数据

  • get('key')
  • get_multi('key'):获取多个key

删除数据

  • delete('key', 'block time'):可以设置指定时间内禁止新增该key

增一/减一

  • incr('key')

2 内存存储

Slab Allocation机制

问题背景:内存的分配是通过对所有记录简单地进行mallocfree来进行,但这种方式导致内存碎片,加重操作系统内存管理器的负担。

机制原理:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。

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

Slab Allocation 构造图

如图所示,Slab Allocation机制即将分配好的内存页(Page)分割成各种尺寸的块(Chunk),并把尺寸相同的块组合成组(Slab Class)。

Memcached会维护着一份Slab中空闲Chunk的列表,当每次存储数据时,会根据数据大小选择最合适的组(以减少空间浪费)。

Slab缓存数据原理

但即使使用了列表记录空闲的块,还是无法做到完全消除空间的浪费,而最优的方案只能是减少各个块之间的大小差距,从而可以让缓存的数据刚好选择一个差别不大的块进行存储。而这个调优参数即是 Growth Factor 因子,默认值为1.25。

3 删除机制

memcached不会释放已分配的内存,记录超时后,客户端就无法再看见该记录(invisible,透明),其存储空间即可重复使用。

同时,memcached内部不会监视记录是否过期,而是在get请求访问记录时,检查记录的时间戳。该机制称为 Lazy Expiration(惰性过期)。

删除原理:采用 LRU(Least Recently Used)来分配空间。

4 分布式算法

分布式简介:添加时

memcached是通过分布式算法将入参映射到具体的存储节点,从而实现分布式存储。

Memcached原始的分布式是模运算。

特点:算法简单、数据分散性优秀

缺点:当机器节点改变时,数据散列受到影响,从而缓存命中率会下降

算法改进:一致性Hash算法

一致性Hash基本原理

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

一致性Hash:添加服务器

当往上图状态添加一台服务器时,只有在continuum上增加服务器的地点逆时针方向的第一台服务器的键会受到影响。

5 应用和兼容程序

参考

  • 《Memcached全面剖析》 —— 长野雅广、前坂撤