zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    mac 格式化U盘
    SSD接口详解,再也不会买错固态硬盘了
    详解Paste deploy
    (实用)Ubuntu Linux静态IP网络配置
    Python WSGI开发随笔
    利用CA私钥和证书创建中间CA
    使用OpenSSL创建自己的CA root certificate
    创建自己的PKI公/私密钥对和公钥证书
    openssl创建自己的CA certificate
    Keystone中间件WSGI环境变量总结
  • 原文地址:https://www.cnblogs.com/gered/p/12960271.html
Copyright © 2011-2022 走看看