jydg 发表于 2018-12-24 13:22:10

memcached 详聊

  Memcache :
  Memcached是一个开源、高性能的内存缓存软件;
  Memcache的作用:
  Memcached通过在事先规划好在内存空间中临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力。
  

  Memcache服务在不同企业集群架构中的应用场景:
  (1)作为数据库前端缓存应用
      a 完整缓存(易),静态缓存
      例如:商品分类,商品信息可事先放到内存里,然后再对外提供数据访问,这种方式称为            预热,用户访问时可以只读取Memcached缓存,不读取数据库。
  
      b 预热缓存(难)
  特殊说明: 如果碰到电商秒杀等高并发的业务,一定要事先预热,或者其它方法实现。例如:
  秒杀只是获取资格(js、 node.js处理),把瞬间的大并发平滑的接住通过一段时
  间解决掉而不是瞬间秒杀到手商品。
  ****需要前端web程序配合,只缓存热点的数据,即缓存经常被访问的数据***。
  
      ①先把数据库的基础数据预热到MC里,然后在动态跟新。先读取缓存访问时先读取mc数据。
  如果缓存里没有对应的数据,由程序在去读取数据库,然后把读到的数据放入缓存储存。
      ②如果数据更新,同时出发MC 缓存跟新,防止给用户过期数据;
  

  c 对于持久化缓存存储系统:
  例如redis,可以替代一部分数据库的存储,一些简单的数据业务,投票、统计、好友关注、商
  品分类等,但是它将来做集群时也有一定的问题。
  

  

  (2) 作为集群的session汇话共享存储;
  Memcached服务特点及原理   

  a 、C/S模式的架构;c语言编写的,总共2000行代码;
  
b 、异步I/O模型,使用libevent作为事件通知机制;
c 、被缓存的数据以key/value的键值形式存在的;#
d 、全部数据存放于内存中,无持久性存储的设计,重启Memcached服务,Memcached内存中的数据即丢

  失;#
c 、当内存汇总缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据;


  d、可以对存储数据设置过期时间,这样过期后数据自动清楚,服务本身不会监控过期,而是在访问的时

  候查看key的时间戳判读是否过期。
  e、Memcached会对设定的内存进行分块(类似磁盘的block),块大小可能不相同,再把相同大小的块分组,然后在存储数据提供服务。


  

  Memcached内存管理机制深入剖析
  malloc 全称: memory allocation中文:动态内存分配;当无法知道内存具体位置的时候想,想要绑定真正的内存空间,就需要用到动态的分配内存。
    早期的Memcached内存管理方式是通过malloc分配的内存,使用完后通过free来回收内存呢,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。加重操作系统内存管理器的负担。
    现在的Memcached利用Slab Allocation机制来分配和管理内存,Slab Allocation 内存分配机制原理是按照预先规定的大小,将分配给Memcached服务的内存预先分割成特定长度的内存块(chunk),再把尺寸相同的内存块chunk分成组(chunks slab class),这些内存块不会释放,可以重复利用。
    Memcached 服务器端中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存与其中,当有数据存入是,Memcached根据收到数据的大小,选择最适合数据大小的slab, 分配一个能存小这个数据最小的内存块chunk。
  

  slab allocator解决了当初内存碎片问题,但新的机制也带来了新的问题,由于分配的是特定长度的内存,因此无法有效利用分配的内存(缺陷:容易浪费内存)
  避免浪费内存的方法是,预先计算出应用存入数据的大小, 或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据相对均匀,可以减少内存的浪费。

  memcached在启动指定Growth Fcator因子(通过f选项)-f ,就可以在某种程度上控制slab 之间的差异,默认值是1.25,原来默认值是2
  以verbose模式启动memcached

  ##memcached -f 2 vv
  下面是是启动的输出:
http://s3.运维网.com/wyfs02/M02/57/56/wKioL1SYPyfhdFqiAAHA8UAYAVo096.jpg
  可见,从128字节的组开始,组的大小依次增大为原来的2倍,这样设置的问题是slab之间的差别比较大,有些情况下就相对浪费内存,因此,尽量减少内存浪费
  当默认值(f=1.25)时的输出
http://s3.运维网.com/wyfs02/M02/57/59/wKiom1SYPq2zk-gdAANsQRR399Q166.jpg
  

  (一个chunk只能存一个对象)

  术语#Chunk:用于缓存数据的内存空间或内存块。
    #Slab Class:特定大小的多个chunk的集合或组。
  

  

  Memcached对象删除原理与cache机制

  Memcached 主要的cache机制是LRU机制(最近最少用)算法,加上item过期失效,当你存储数据到Memcache中,可以指定该数据在缓存中呆多久,如果Memcache的内存不够用了,过期的slabs会被替换
,接着就轮到最老的未被使用slabs。在某些情况下(完整缓存),如果不想使用LRU算法,那么可以通过使用-M 参数启动Memcache,这样Memcache在内存耗尽时,会返回一个错误信息。
  -M   return error on memory exhausted (rether than removing items)
  

  Memcached常见的参数:
  -m指定分配的内存 ,根据需求,可以自己计算。百度好像不超过4G

  -p指定tcp端口号 ,默认11211

  -d 后台运行

  -u指定Memcached运行的用户

  -c 指定并发连接数,默认是1024,按照服务器访问量设定
  -l 指定监听服务器的ip地址
  -vv 以veryvrebose模式启动,调试信息和控制信息输出到后台
  -f 调优因子
  

  Memcached服务端安装
  网友资料:http://instance.iteye.com/blog/1691705附件(Memchache)

  软件地址:
Memcached下载地址:http://www.danga.com/memcached/
libevent下载地址: http://monkey.org/~provos/libevent/

  安装环境: uname -rm
2.6.32-431.el6.x86_64 x86_64wget
  安装Memcached前需要先安装libeven事件通知机制。

  http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
tar zxf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure
make
make install
cd ../
  (也可以yum直接安装)
安装Memcached
  wget http://www.memcached.org/files/memcached-1.4.21.tar.gz
  tar zxf memcached-1.4.13.tar.gz
cd memcached-1.4.13
./configure
make
make install
cd ../
  

  注意: Memcache 是客户端。

  Memcached的启动:memcached-m 10m -u root -p 11213 -d -c 100

  当然你也可以更改端口启动多个memcached :memcached-m 10m -u root -p 11211-d -c 100
  查看命令:lsof -i:11211

  

  如遇到报错:
  memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
  报错解决:find 查找 libevent-1.4.so.2后路径添加到/etc/ld.so.conf

  echo "/usr/local/lib" >>/etc/ld.so.conf
ldconfig
  

  

  Memcache中添加数据:

  

  键值对 key1-》values1
  a 通过nc 写入 (如果没有nc,yum安装)
  范例:printf "set key008 0 0 3\r\nnnn\r\n" |nc 127.0.0.1 11211
  注意:printf “\r\n”
  command name 可以是set(存储此数据),add(存储此数据,只在服务器*未保留此键值数据时)

  b 取数据:printf "get key008\r\n" |nc 127.0.0.1 11211
  VALUE key008 0 3
    nnn
    END
  c 删除数据: printf "delete key008\r\n" |nc 127.0.0.1 11211
               DELETED
  

  

  Memcache客户端的安装
  wget http://pecl.php.net/get/memcache-2.2.5.tgz

  

  tar zxf 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/php5.3.27/lib/php/extensions/no-debug-zts-20090626/ 是否生产文件memcache.so

  

  vi /application/php/lib/php.ini

  819 ; extension_dir = "./"
  extension_dir ="/application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/"
  #注意此处不要有空格#

  且添加:   extension = memcache.so
  

  /application/apache/bin/apachectl-k restart
  

  在网站目录下创建index.php的测试页面,
  浏览器访问后出现
http://s3.运维网.com/wyfs02/M00/57/57/wKiom1SYCIDSC7K-AACdzxRzuqw723.jpg
  表示成功。
  

  

  编写php测试脚本

  vi mem.php
  

  

  通过php程序访问

  /application/php/bin/php mem.php
konglingchao
  通过文本界面访问:
  http://s3.运维网.com/wyfs02/M02/57/57/wKiom1SYEhDhTl8dAABwAkft7mQ922.jpg
  

  

  Memcache 如何实现session共享存储
  vi/application/php/lib/php.ini
  

  修改1461 session.save_handler = files
  为:session.save_handler = memcache

  #session默认是以文件形式存储的
  修改 1469      ;   session.save_path = "N;/path"
  为:session.save_path = "tcp://10.10.69.11:11211"
  #注意tcp://连接服务地址地址
  查看:
  egrep -n "memcache$|11211" /application/php/lib/php.ini
1461:session.save_handler = memcache
1469:    session.save_path = "tcp://10.10.69.11:11211"
  

  搞定!!!!
  优点:memcached 是内存缓存,在读写速度上会比普通files时快很多;
  可以解决多个服务器公用seesion的难题;
  缺点:session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说不是难题。
  也可以用其它的持久化存储系统sessons,例如:redis,ttserver
  高性能并发场景,cookies的效率比session好很多。
  

  

  集群架构服务器同步session的多种方式:
  lvs 负载均衡ipvsadm命令用-p指定汇话保持时间
  

  lvs 负载均衡keepalived 服务就是用persistent_timeout 300实现汇话保持
  

  nginx 方向代理负载均衡 ,通过nginx_hash调度算法实现。
  

  haproxy反向代理负载均衡 url_hash 、cookie insert
php,java 程序架构都可以实现上述的汇话保持

软件层session 复制:java应用服务器tomcat ,resin 这类软件用couchbase、memcached做复制

php环境用memcached或者其他nosql工具 做session 汇话共享


高并发场景,例如门户网站用cookies 或cookies 配和session 把用户级汇话信息缓存在用户本地。
  

  监控Memcached服务的状态信息获取
  通过使用stats 命令查看状态:
  printf "stats \r\n"|nc 127.0.0.111211
  范例:

  printf "stats \r\n"|nc 127.0.0.111211 | grep get
STAT cmd_get 9   
STAT get_hits 6    #命中
STAT get_misses 3   #未命中
  printf "get key\r\n"|nc 127.0.0.111211
END
printf "stats \r\n"|nc 127.0.0.111211 | grep get
STAT cmd_get 10
STAT get_hits 6
STAT get_misses4
  #如果未命中过多,会对数据库造成一定的压力。
  

  监控Memcached的管理工具:memadmin-1.0.12.tar.gz
  memadmin-1.0.12.tar.gz :php写的监控工具,虽然短小,但是很精悍!
  把memadmin-1.0.12.tar.gz解压到:/var/html/www/memadmin
  浏览器直接访问:http://10.10.69.11/memadmin/index.php?action=admin
  网友资料:http://storysky.blog.运维网.com/628458/244962 附件也有
  如图:
http://s3.运维网.com/wyfs02/M00/57/59/wKiom1SYPwbjT9G-AAIftGO_TQM272.jpg
http://s3.运维网.com/wyfs02/M01/57/56/wKioL1SYP7GC6S2uAANvbcY9IsQ238.jpg
  或者自己写监控脚本模拟用户监控
  范例:curl http://xx.check mem.php 根据返回结果监控

  #!/bin/sh
b=`printf "stats\r\n"|nc 10.0.0.7 11211|grep cmd_get|awk '{print $NF+0}'`
a=`printf "stats\r\n"|nc 10.0.0.7 11211|grep get_hit|awk '{print $NF+0}'`
percentage=$(printf "%d%%" $((a*100/b)))
echo $percentage
  

  memcached 命令:
  telnet 127.0.0.1 11211 连接后
  stats slabs 查看slabs 相关情况
  stats items 查看items相关情况
  stats sizes 查看存在item个数和大小
  stats reset 清理统计数据。

  

  

  

  补充

  redis 是什么?作用?和memcaced的区别!
  Memcachedb和TTserver持久化存储工具,原理;(兼容memcache协议)
  

  

  

  




页: [1]
查看完整版本: memcached 详聊