Memcached介绍

一、简介

1.1 介绍

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站的访问速度。

Memcached是使用的key-value存储(数据按照键值对的形式进行组织、索引和存储),数据可以来自数据库调用、API调用 或者页面渲染结果。

Memcached 能用于 java/c/c++/c#/Perl/Python/php/ruby等大部分流行语言

Memcached 仅支持简单的 key-value结构的数据记录。

memcached缺乏认证以及安全管制,应该将memcached服务器放置在防火墙后。

memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据。

1.2 memcache与memcached

memcache:是早期使用的,与php结合的,是Php中常用的一个原生插件,完全在php框架内开发的

memcached:是建立在 libmemcached的基础上,所以相对而言版本的功能更全面。现在都是用这个

区别:Memcached 是一个内存缓存系统,而 Memcache 是php的一个扩展插件,是php用于操作和管理 Memcached 的工具,

  • 如果安装了 Memcached 但没有安装 Memcache,则php 无法操作 Memcached,但是可以使用命令来操作 Memcached;
  • 如果安装了 Memcache却没有安装 Memcached,则无法使用。
  • 只有同时安装了 Memcached 和 Memcache ,才能在 PHP 中使用 Memcached。
1.3 现状与用途

现状:就是做缓存查询

用途:减少访问压力,作后端的session会话保持。

1.4 基本运行机制

请求=》查看缓存中是否有=》

  • 有=》返回该页面给客户端
  • 没有=》从数据库获取该页面数据=》返回该页给客户端(同时将该页面放入memcached)
1.5 服务器要求
1.6 支持命令

二、特性

2.1 与关系型数据存取对比
2.2 特点总结

三、详细介绍

3.1 分布式介绍

Memcached 天生不支持分布式集群,只能通过程序支持分布式存储。

Memcached 分布式缓存集群的特点:所有的 Memcached 服务器内存的内存都是不一样的,这些服务器内存加起来接近数据库的容量。

比如2个TB的数据库,一台缓存数据库的内存没有那么大,因此可以分成10台/20台缓存服务器来使用(现在配2T、4T的服务器也行)

3.2 分布式存取算法介绍

普通哈希算法:通过在客户端程序/memcached的负载均衡器上用 hash 算法,让统一内容都分配到一个 memcached 服务器上。但是普通的 Hash 算法对于节点宕机会带来大量的数据流动或者失效,可能会引起雪崩效应。

一致性哈希算法(目前常用):一致性 Hash 可以让节点宕机对节点的数据流动/失效等影响降到最低。

3.3 存储方式
  • Memcached 根据 Slabs 为存储单位
  • Memcached 分配单位为 Page,默认是 1M一个
  • chunk 为 Slab 中存放数据的单位,一般是 Slab 的最大上线容量。

可以理解成关系型数据库的相关概念:page为区,slabs 为页规范,chunk为实际页可用容量;

mysql每次分配是按区分配的,一个区=16个页,而一个页是16K。

memcached中,这个16K的规范就是我们所说的 slab 规范, chunk为实际页可用容量也就是16K。

Memcached案例:结合下面三个图即可。

每一个slab_class都会有它自己的一个属性,然后每个slab规则 下面对应不同的chunk。chunk之间采用双向链表。

item为实际存储在 chunk中的 数据(相当于mysql中的行数据,当这个数据并没有到chunk最大值时,会有空间浪费。比如chunk为128byte,而item只有100 byte,这样就浪费了28 byte)

Memcache 采用 hash 表索引,每个hash表索引值,对应的是各个页上的 chunk。具体 slab_class 与 页、chunks的关系。

如上图,我们把一共4G内存,按照40个 slab_class方案去分配,最终memcached 会根据 key大小对应存储在不同的 slab_class 对应的 chunk下。每个 slabclass下的分配如下图

总结

  • slab Class :特定大小的 chunk的组,内存分配区间(48byte~~1MB)
  • page:分配给 slab 的内存空间,默认是1MB。分配给 Slab 之后根据 slab的大小切分成 chunk。
  • chunk:数据区块,固定大小,用于缓存记录的内存空间。
  • item:实际存储在 chunk中的数据项

memcached 根据收到的数据的大小,选择最合适数据大小的 slab。

memcached中保存着 slab 内空间 chunk 的列表,根据该列表选择 chunk,然后将数据缓存于其中。

3.4 内存分配、处理机制
3.5 数据删除与失效机制

Memcached在删除数据时,不回收chunk与 slab,而是链表删除反复利用

数据不会真正从 Memcached中消失,因为 Memcached根据数据的大小选择存储 Slab 中的 chunk块,一旦数据存入,将不再释放已经分配的内存。(可以理解成,只是把它踢出双向链表了而已)

记录超时后,客户端就无法再看见该记录(invisible,透明),其存储空间即可重复使用。

LRU内存分配算法

Memcache 使用的是一种 Lazy Expiration 策略,Memcached会有限使用已超时的记录空间,就算是这样,也有可能出现追加新记录时空间不足的情况,这个时候就得用 Least Recently Used(LRU,删除最近最少使用的记录机制)机制在分配内存。

所以,当 Memcached内存空间不足时,即获取不到新的 slab class 时,就根据LRU的原则去记录中搜索,将最近最少使用的记录内存分配给新记录数据作为存储空间,从缓存的使用角度来看,该模型比较理想,但内存用尽时 memcached会返回错误。

注意,内存过期检测会浪费大量CPU资源

3.6 使用限制
  • Memcached 对 key的长度有限制:php和c的最大长度都是250字符内,数据项不能超过1M(这个值由其内存分配机制绝对),因为这是最大的块值。如果对数据超过1M的值进行 set ,则会返回 false
  • set (key,value) 的过期时间默认为30天
  • Memcached 启动时指定的是数据存储量,没有包括本身占用的内存。以及为了保存数据而设置的管理空间。因此它占用的内存量会多于启动时指定的内存分配量,这点需要注意
  • Memcached 本身是为了缓存而设计的,所以没有持久化
  • 访问限制,默认最大同时连接数为1024.
3.7 的应用场景
  • 解决动态网页,读请求操作的负载
  • 解决数据库服务器的CPU使用率高问题,可以缓存好计算结果和渲染后的网页模板
  • 可以缓存 session数据、临时数据以减少对他们的数据库写操作
  • 缓存一些很小但是被频繁访问的文件。
  • Memcached 经常应用于 TB及数据量的缓存
3.8 使用建议
  • 在实际业务中,结合使用 Memcached 和文件类型缓存。根据热度把最热的数据放入内存,把一般的数据放入文件缓存。
  • 读取数据时:memcached >>>  filecache  >>> databases,最大程度利用缓存减轻数据库查询压力。
3.9 与 redis 的比较

四、集群架构

因为memcached的服务器并不支持集群,所以有两种方案支持,一种是客户端支持集群,一种是代理端支持集群(性能会有所损耗,大概20%)。推荐使用客户端。

4.1 主从架构

左边:

  • 一主一从
  • 一个Magent,然后一个主库,一个从库。Magent 负责主从同步与代理关系。
  • 外部链接直接链接到 Magent=》 然后 Magent 转发请求到主库
  • 如果主库挂掉,Managent 会自动把请求切换到从库。

右边:

  • 配置2个 Magent,做 Magent 的高可用,避免单点故障。
  • 右边是多个主库分布在不同机器,这样由Magent来记录分发数据到不同主库。
  • 从库只弄了2个机器,做复制就好了。
4.2 互备主从
4.3 高可用架构

 比如,keepalived+magent,外部访问 vip

发表回复