Memcache(1.1)Memcache 基本概述与架构概述
Posted 郭大侠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Memcache(1.1)Memcache 基本概述与架构概述相关的知识,希望对你有一定的参考价值。
【1】基本概念介绍
【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 基本概述与架构概述的主要内容,如果未能解决你的问题,请参考以下文章