Memcache(1.1)Memcache 基本概述与架构概述

Posted 郭大侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Memcache(1.1)Memcache 基本概述与架构概述相关的知识,希望对你有一定的参考价值。

【1】基本概念介绍

官网:https://memcached.org/

【1.1】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.2】memcached 介绍

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

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

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

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

【1.3】现状与用途

现状:就是做缓存查询

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

【1.4】基本运行机制

请求=》查看缓存中是否有=》如果有=》返回该页面给客户端

                                          =》没有=》从数据库获取该页面数据=》返回该页给客户端(同时将该页面放入memcached)

如下图:

  

 

 

【2】Memcached  特性

【2.1】与关系型数据存取对比

  

 

【2.2】Memcache 特点总结

  

 

【3】Memcached 详细介绍

【3.1】Memcached 分布式介绍

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

Memcached 分布式缓存集群的特点:

所有的 Memcached 服务器内存的内存都是不一样的,这些服务器内存加起来接近数据库的容量。

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

比如:你的mysql 数据库只有500G,两台1T内存的服务器就搞定了,一主一备。

【3.2】Memcached 分布式存取算法介绍

(1)普通哈希算法

  通过在客户端程序/memcached的负载均衡器上用 hash 算法,让统一内容都分配到一个 memcached 服务器上。

  但是普通的 Hash 算法对于节点宕机会带来大量的数据流动或者失效,可能会引起雪崩效应。

(2)一致性哈希算法(目前常用)

  一致性 Hash 可以让节点宕机对节点的数据流动/失效等影响降到最低。

【3.3】Memcached 存储方式

(1)Memcached 根据 Slabs 为存储单位

(2)Memcached 分配单位为 Page,默认是 1M一个

(3)chunk 为 Slab 中存放数据的单位,一般是 Slab 的最大上线容量。

可以理解成关系型数据库的相关概念:

page为区,slabs 为页规范,chunk为实际页可用容量;

Mysql案例:我们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】数据删除与失效机制

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

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

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

(2)LRU内存分配算法

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

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

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

【3.6】Memcached使用限制

(1)Memcached 对 key的长度有限制

  php和c的最大长度都是250字符内,数据项不能超过1M(这个值由其内存分配机制绝对),因为这是最大的块值。如果对数据超过1M的值进行 set ,则会返回 false

(2)set (key,value) 的过期时间默认为30天。

(3)Memcached 启动时指定的是数据存储量,没有包括本身占用的内存。以及为了保存数据而设置的管理空间。因此它占用的内存量会多于启动时指定的内存分配量,这点需要注意

(4)Memcached 本身是为了缓存而设计的,所以没有持久化

(5)访问限制,默认最大同时连接数为1024.

【3.7】Memcached 的应用场景

(1)解决动态网页,读请求操作的负载

(2)解决数据库服务器的CPU使用率高问题,可以缓存好计算结果和渲染后的网页模板

(3)可以缓存 session数据、临时数据以减少对他们的数据库写操作

(4)缓存一些很小但是被频繁访问的文件。

(5)Memcached 经常应用于 TB及数据量的缓存

【3.8】使用建议

(1)在实际业务中,结合使用 Memcached 和文件类型缓存。根据热度把最热的数据放入内存,把一般的数据放入文件缓存。

(2)读取数据时

memcached >>>  filecache  >>> databases

最大程度利用缓存减轻数据库查询压力。

【3.9】Memcached 与 redis 的比较

  

 

 

 【4】Memcached 集群架构

【4.1】主从

  

 

 左边:

(1)一主一从

一个Magent,然后一个主库,一个从库。Magent 负责主从同步与代理关系。

外部链接直接链接到 Magent=》 然后 Magent 转发请求到主库

如果主库挂掉,Managent 会自动把请求切换到从库。

 

右边:

配置2个 Magent,做 Magent 的高可用,避免单点故障。

右边是多个主库分布在不同机器,这样由Magent来记录分发数据到不同主库。

从库只弄了2个机器,做复制就好了。

 

【4.2】互备主从

  

 

【4.3】高可用架构

  

 

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

 

以上是关于Memcache(1.1)Memcache 基本概述与架构概述的主要内容,如果未能解决你的问题,请参考以下文章

PHP操作Memcache基本函数的方法

MemCache 基本应用

windows下安装memcache的基本步骤

PHP-MemCache的基本使用

memcache的基本操作

C# 使用memcache(memcache安装)