1.Memcached是什么,有什么作用?
 
         Memcached是一个开源的、高性能的内存缓存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思。
         Memcached通过在事先规划号的内存空间中临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力
2、Memcached服务在企业集群架构中应用场景
 
         1)作为数据库的前端缓存应用
            a.完整缓存(静态缓存):比如商品分类,商品信息,可事先放到内存里,然后再对外提供数据称为预热。用户访问就是只读memcached缓存,不读取数据库了。
            b.热点缓存:需要前端程序配合,只缓存经常被访问的数据。先将数据库里的基础数据,然后在动态更新。先读取缓存,如果缓存里没有对应的数据,程序再去读取数据库,然后程序把读到的数据放到缓存。
         特殊说明:
           1.如果碰到电商秒杀高并发业务,一定要事先预热,或者其他思想,秒杀获取资格,而不是瞬间秒杀到商品
           2.如果数据更新,同时触发缓存更新,防止给用户过期数据。
               c.对于持久化缓存存储系统,比如memcached\redis,可以替代一部分数据库的存储,一些简单的数据业务,投票,统计、好友关注,商品的分类等。
           2)   作为集群的session会话共享存储
3、Memcached服务在不同企业业务应用场景中的工作流程
 
        a.当web程序需要访问后端数据库获取数据的时会优先访问Memcached内存缓存,如果缓存中有数据就直接获取,反馈给前端服务和用户,如果没有数据(没有命中),在由程序请求后端的数据库服务器,获取到对应的数据后,除了返回给前端服务和用户外,还会把数据放到Memached内存中进行缓存,等待下次请求被访问,Memcached内存始终是数据库的挡箭牌,从而大大减轻数据库访问的压力,提高整个网站架构的响应速度,提升用户体验。
       b.当程序更新,修改或者删除数据库中已有的数据时,会同时发送请求通知Memcached已经缓存过的同一个ID内容的旧数据失效,从而保证Memcache中的数据和数据库中的数据一致。
           如果在高并发场所,除了通知memcache过期的缓存失效外,还会通知相关机制,使得在用户访问新的数据库时,通过程序预先把跟新的数据推送到Memcached中缓存起来,这样可以减少数据库的访问压力,提升Memcached中缓存的命中率。
        c.有一款数据库插件可以再写入更新数据库后,自动抛给Memcached缓存起来,自身不cache
 4、Memcached服务分布式集群如何实现?
      简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。分布式是指将不同的业务分布在不同的地方;而集群指的是将几台服务器集中在一起,实现同一业务。分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
      特殊说明:memcached集群和web集群是不一样的,所有memcached的数据总和才是数据库的数据,每台memcached都是部分数据。
    a.程序端实现:
           php或者java程序加载所有的mc的ip列表,通过对key做hash(一致性哈希)
    b.通过负载均衡器
           通过对key做hash(一致性哈希)
       一致性哈希算法的目的是不但保证每个对象只请求一个对应的服务器,而且当节点宕机,缓存服务器的更新重新分配比例降到最低。
 
5、Memcached服务特点及工作原理是什么?
        
 
          a. 节点之间相互独立
          b. C/S模式架构,C语言编写,总共代码2000多行
     c. 异步I/O模式,使用libevebt作为事件通知机制(I/O的输入输出是数据到内核到用户内存的过程,在这个过程中,系统完全不需要等待而且做其他操作,称为异步I/O过程)
     d. 数据是以key/value对形式存在的
          e.全部数据存放再内存中,无持久性存储的设计,重启服务,数据会丢失。
          f.当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。
          g.可以对存储的数据设置过期时间,这样过期后数据自动被清除,服务本身不会监控过期,而是在访问的时候查看key的时间戳判断是否过期。
          
          
6、简述Memcached内存管理机制原理?
   

Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。

6.1. 之前内存分配的弊端

在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。


6.2解决方案

Slab Allocator的基本原理是按照预先规定的大小,将分配的内存以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定,分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配,以解决内存碎片问题。

Page

分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。

Chunk

用于缓存记录的内存空间。

Slab Class

相同大小的chunk组成的组。

Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

如图所示,每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如:100字节大小的字符串会被存到slab2(88-112)中,每个slab负责的空间是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修改-f参数来修改增长比例。


6.3 带来的新的问题

Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。chunk是memcached实际存放缓存数据的地方,这个大小就是管理它的slab的最大存放大小。每个slab中的chunk大小是一样的,如上图所示slab1的chunk大小是88字节,slab2是112字节。由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。这里需要注意的是chunk中不仅仅存放缓存对象的value,而且保存了缓存对象的key,expire time, flag等详细信息。所以当set 1字节的item,需要远远大于1字节的空间存放。

memcached在启动时指定 Growth Factor因子(通过-f选项), 就可以在某种程度上控制slab之间的差异。默认值为1.25。


6.4 slab的内存分配具体过程如下:

Memcached在启动时通过-m参数指定最大使用内存,但是这个不会一启动就占用完,而是逐步分配给各slab的。
如果一个新的数据要被存放:

    1. 首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请,slab申请内存时以page为单位,无论大小为多少,都会有1M大小的page被分配给该slab(该page不会被回收或者重新分配,永远都属于该slab)。

    2. 申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,再从这个chunk数组中选择一个用于存储数据。

    3. 若没有空闲的page的时候,则会对该slab进行LRU,而不是对整个memcache进行LRU

         
 7、Memcached的删除原理与删除机制?
           Memcached主要的cache机制是LRU算法,加上item过去失效。如果内存不够用,就会删除过期slabs中的数据,没有的话,就通过LRU删除最老的未被使用的slabs。
8、Memcached服务端与客户端的安装部署与使用测试 
 服务端:     cd /home.oldboy/tools
            wget http://www.danga.com/memcached/dist/memcached-1.4.0.tar.gz 
           wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz  
    libevent 首先进行安装:
  1. wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
  2. tar -zxvf libevent-2.0.19-stable.tar.gz
  3. cd libevent-2.0.19-stable
  4. ./configure
  5. make
  6. make install
 memcached服务端的安装:
  1. tar -zxvf memcached-1.4.0.tar.gz
  2. cd memcached-1.4.0
  3. ./configure
  4. make
  5. make install
查看命令:
[root@djw3 memcached-1.4.0]# which memcached
/usr/local/bin/memcached
启动memcached服务命令:-m 表示占用空间  -p表示端口  -d后台启动  -c最大并发量
[root@djw3 memcached-1.4.0]# memcached -m 16m -p 11211 -d -u root -c 8192 
 启动报错:
[root@djw3 memcached-1.4.0]# memcached -m 16m -p 11211 -d -u root -c 8192
memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
 
配置/etc/ld.so.conf:  echo "/usr/local/lib" >>/etc/ld.so.conf防止启动memcached报错
ldconfig
重新启动
[root@djw3 lib]# memcached -m 16m -p 11211 -d -u root -c 8192
实例:
[root@djw3 lib]# netstat -lntup|grep mem
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      31081/memcached    
tcp        0      0 :::11211                    :::*                        LISTEN      31081/memcached    
udp        0      0 0.0.0.0:11211               0.0.0.0:*                               31081/memcached    
udp        0      0 :::11211                    :::*                                    31081/memcached 
如果还要多个实例启动,只需要修改端口就可以了如:memcached -m 16m -p 11212 -d -u root -c 8192
 
测试: key--values
  printf "set key008 0 0 10\r\noldboy0987\r\n"|nc  127.0.0.1  11211
  printf "get key008\r\n"|nc 127.0.0.1  11211
  printf "delete key008\r\n"|nc 127.0.0.1  11211
 
 memcache客户端安装:
   wget http://pecl.php.net/get/memcache-2.2.5.tgz

tar zxvf memcache-2.2.5.tgz
  cd memcache-2.2.5
  /application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
 make
 make install
  ll /application/php/lib/php/extensions/no-debug-zts-20090626/

 -rwxr-xr-x 1 root root 237930 Nov  9 09:15 memcache.so
修改php.ini文件

添加:extension=memcache.so

测试代码:

<?php
    $memcache = new Memcache;
    $memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
    $memcache->set('key001', 'oldboy001');
    $memcache->set('key002', 'oldboy002');
    $get_value01 = $memcache->get('key001');
    $get_value02 = $memcache->get('key002');
    echo $get_value02."<br>";
    echo $get_value01;
?>

测试结果:

[root@djw3 www]# /application/php/bin/php  mem.php
oldboy002<br>oldboy001

网友可以网上测试下,这里我测试是失败的,报错500,想不通为什么,我用的软件是apache,也可以进行nginx的添加。命令行如上,测试是成功的。

9、如何实现集群中的session共享存储?

web服务器上配置PHP文件,指定缓存服务器作为session服务器

vim /application/php/lib/php.ini        php.ini中进行配置

1461:session.save_handler = memcache

1490:session.save_path = "tcp://10.0.0.100:11211"

使用memcached内存缓存软件实现会话保持的配置,只需修改php.ini对应上述参数,值为上述值即可
优点:

1. memcached是内存缓存,在读写速度上会比普通files时快很多

2. 可以解决多个服务器公用session的难题

缺点说明:

1. session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说不是问题

2. 也可以用其它的持久化系统存储sessions,例如:redis,ttserver

3. 高性能高并发场景,cookies的效率比session更好很多,因此,很多大网站都会用cookies解决会话共享问题

10、如何获取MEMCACHED服务的状态信息,例如:命中率
 
 
 printf "stats\r\n"|nc 127.0.0.1 11211
当然,还有类似的监控软件参数,可以进行安装查看
11、通过Nagios监控Memcached需要监控哪些指标
   端口、命中、反应时间等;
  1)可以写一个监控指标脚本交给nagios进行插件监控
  2)通过curl http://ip/程序.php等|grep oldbooy|wc

一.Memcached企业服务的更多相关文章

  1. 有关memcached企业面试案例讲解

    有关memcached企业面试案例讲解 1.Memcached是什么,有什么作用?    a. memcached是一个开源的.高性能的内存的缓存软件,从名称上看Mem就是内存的意思,而Cache就是 ...

  2. PHPCMS v9构建模块 - 实例之企业服务模块

    下面开始第一个实例,企业服务模块,这是个比较简单的模块,做一个抛砖的作用.   模块功能分析:企业服务,企业填写招聘申请表,管理审核之后,展示作为招聘通知的功能.   ■1.文件分布 modules文 ...

  3. ESB 企业服务总线

    整理的OSChina 第 38 期高手问答 —— ESB 企业服务总线,嘉宾为@肖俊_David . @肖俊_David 恒拓开源架构师,热衷于JAVA开发,有多年的企业级开发经验.曾参和设计和开发基 ...

  4. 企业服务总线ESB

    # 企业服务总线ESB 由中间件技术实现并支持SOA的一组基础架构,支持异构环境中的服务.消息以及基于事件的交互,并且具有适当的服务级别和可管理性. 通过使用ESB,可以在几乎不更改代码的情况下,以一 ...

  5. 企业服务的3种模式:On-Premise、SaaS、Mixed,该选哪种?--创业邦

    B轮融资二三事 我们从9月份开始启动B轮融资,与这些颇具洞察力的投资人聊天,是非常有挑战的事.他们的很多观点充满智慧,能帮你突破思考局限,受益良多.当然,整个过程虽然有趣但也不轻松,毕竟你的目的是完成 ...

  6. 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能

    完全国人自主研发原创的智能软件路由器即将发布: 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能 智能软件路由器 BDS 简要介绍 http://kan.weibo.co ...

  7. [网站日志]当Memcached缓存服务挂掉时性能监视器中的表现

    我们用的Memcached缓存服务是阿里云OCS,今天晚上遇到了一次OCS挂掉的情况(计划中的升级),看一下性能监视器中的表现,也许对分析黑色1秒问题有帮助. 应用日志中错误: 2014-06-05 ...

  8. [转载]Memcached缓存服务的简单安装

    1.Linux下的安装方法 下载:wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x. ...

  9. 七牛云杜江华:让云 + AI 成为企业服务的标配

    12 月 5-6 日,2018 创业邦 100 未来领袖峰会暨创业邦年会(以下简称「创业邦 100 未来领袖峰会」)在北京国家会议中心举行.12 月 5 日下午,七牛云执行副总裁杜江华在企业服务论坛上 ...

随机推荐

  1. Codeforces 392 C Unfair Poll(模拟)

    题意:老师点名顺序规则如下:第1排,第2排,……,第n-1排,第n排,第n-1排,……,第2排,第1排,第2排,……,第n-1排,第n排,……对于每排都是从左到右依次点名,问点名k个人后,所有人中最多 ...

  2. HDU 5464:Clarke and problem

    Clarke and problem  Accepts: 130  Submissions: 781  Time Limit: 2000/1000 MS (Java/Others)  Memory L ...

  3. CGridCtrl设置行列不可拉伸

    m_HFlexGrid.SetColumnResize(FALSE); m_HFlexGrid.SetRowResize(FALSE);

  4. 正则表达式入门(ed模糊匹配)

    元字符: /b 代表着单词的开头或结尾,也就是单词的分界处.如果要精确地查找hi这个单词的话,我们应该使用/bhi/b. .是另一个元字符,匹配除了换行符以外的任意字符,*同样是元字符,它指定*前边的 ...

  5. 一、CI框架(CodeIgniter)简介

    CI是一个非常好用,非常灵活的PHP框架,在官网https://codeigniter.org.cn/ :最新版本3.1.10 版 就可以尽情使用了. 不忘初心,如果您认为这篇文章有价值,认同作者的付 ...

  6. iOS延迟执行方法

    swift 4.0中dispatch_async,dispatch_after的使用 2018年03月28日 16:15:44 xiao_yuly 阅读数:3576 版权声明:本文为博主原创文章,未经 ...

  7. Web报文压缩方法

    编译时压缩 https://www.cnblogs.com/qiuzhimutou/p/7592875.html 这里我列举几个常用的能够用于减少包体大小的插件,我们可以根据项目需求选择性的使用: c ...

  8. DRF源码-serializers

    class BaseSerializer(Field) """ The BaseSerializer class provides a minimal class whi ...

  9. android studio 黑屏问题

    AVD配置不对,打开AVD从新配置

  10. Docker安装 - CentOS7环境

    Docker安装 - CentOS7环境 安装Docker 我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核 ...