这里写自定义目录标题
- 介绍
- 一致性哈希寻找节点
- 一致性哈希介绍
- 内存管理
- slab结构
- 寻找存储chunk
- Chunk中存储的Item数据结构
- grow factor 调优
- 回收删除
- 一些特性
介绍
- 基于内置内存Key-Value形式存储数据(字符串、对象)
- 集群服务器是通过数组+链表方式存储K-V数据
- <分布式>基于哈希路由,集群之间不相互通信
- 两阶段哈希:1、Client端通过Hash(一致性hash)算法+Key计算存储节点;2、服务端通过内部Hash(取模)算法+key计算存储位置
- 集群重启之后,该集群对应数据全部丢失
一致性哈希寻找节点
通过一致性hash计算出节点编号,从而获取到节点ip+端口号,间接实现分布式存储
一致性哈希介绍
环上构建0~2^32-1虚拟节点,服务器节点均匀分布在环上,Hash找出对应节点,顺时针找出对应最近节点,从而对Key进行操作,扩容只会影响如图node2至node5之间的key对应的数据。
内存管理
Memcached采用Slab Allocator的机制分配、管理内存。
其原理:预先分配N个Slab,Slab中分隔成N个Chunk,根据数据大小选择合适的chunk。
名称解释:
- Slab
Slab是Memcached中分配的一块内存,默认大小是1M。Slab是Memcached内存分配的最小单位。 - Chunk
Slab是Memcached中分配的最小单位,而每一个Slab又会进一步划分成一个个的Chunk。Chunk是Memcached存储数据的最小单元,一个Chunk只能存储一个对象。同时,一个Slab中所有的Chunk的大小是相同的。 - Item
Item是Memcached中存储的实际数据。Item本身是一个复杂的数据结构,其中除了包含对象的Key-Value键值对,过期时间外,还有其他一些数据结构,稍后会具体介绍。Memcached将Item保存对应的Slab的某个Chunk中。 - SlabClass
SlabClass把Slab划分成不同大小的组合,每一个SlabClass对应一种Slab,在同一个SlabClass中所有的Slab都划分成相同大小的Chunk。
slab结构
slab allocator 原理: 预告把内存划分成数个 slab class 仓库.(每个 slab class 大小 1M) 各仓库,切分成不同尺寸的小块(chunk). 需要存内容时,判断内容的大小,为其选取合理的仓库.
寻找存储chunk
如果有 100byte 的内容要存,但 122 大小的仓库中的 chunk 满了 并不会寻找更大的,如 144 的仓库来存储, 而是把 122 仓库的旧数据踢掉!
由于 slab allocator 机制中, 分配的 chunk 的大小是”固定”的, 因此, 对于特定的 item,可能造 成内存空间的浪费即内存碎片。例如, 将 100字节的 item 存储到一个 128 字节的 chunk, 就有 28 字节内存浪费。
Chunk中存储的Item数据结构
grow factor 调优
- Chun暂不支持自定义,可以通过设置合理的grow factor(1.25)参数调整各slab class中chunk大小的增长速度。相邻slab内的chunk以1.25为比例进行增长
- 通过计算预先存入的数据大小,或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀,设置合理的grow factor,以尽量减少内存碎片。
回收删除
-
回收
对于过期数据,在1.5.0版本之前不主动回收,>=1.5.0版本定时扫描并回收过期数据。 -
删除
惰性删除策略:
1、get时判断数据是否过期并删除;删除过期数据时,并不是直接物理删除,而是逻辑删除打标记,set时,直接覆盖chunk。
2、set时,若无空间分配,则通过LRU算法进行删除回收空间。
LRU是通过计数器来判断使用状态的,因此未过期的key也有可能删除被删除。比如申请100KB,对应122KB的slab,122中所有chunk均被使用了,memcache不会去申请更多的比如140KB slab,会从122chunk中删除最近最小(最少)使用即覆盖。
LRU不针对整体,针对每个slab单独执行。
一些特性
- Value即单个item最大支持1MB
- Key最大支持250KB
- 最大支持30天有效期。即便expiry设置为0,表示永久有效,也会在30天后失效
- 数据存于内存中,不支持持久性存储,重启数据丢失