设为首页 收藏本站
查看: 927|回复: 0

[经验分享] memcached 详聊

[复制链接]

尚未签到

发表于 2018-12-24 13:22:10 | 显示全部楼层 |阅读模式
  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
  下面是是启动的输出:

  可见,从128字节的组开始,组的大小依次增大为原来的2倍,这样设置的问题是slab之间的差别比较大,有些情况下就相对浪费内存,因此,尽量减少内存浪费
  当默认值(f=1.25)时的输出

  

  (一个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的测试页面,
  浏览器访问后出现

  表示成功。
  

  

  编写php测试脚本

  vi mem.php
  

  

  通过php程序访问

  /application/php/bin/php mem.php
konglingchao

  通过文本界面访问:
  
  

  

  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.1  11211
  范例:

  printf "stats \r\n"|nc 127.0.0.1  11211 | grep get
STAT cmd_get 9     
STAT get_hits 6    #命中
STAT get_misses 3   #未命中
  printf "get key\r\n"|nc 127.0.0.1  11211
END
printf "stats \r\n"|nc 127.0.0.1  11211 | 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 附件也有
  如图:


  或者自己写监控脚本模拟用户监控
  范例: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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-655338-1-1.html 上篇帖子: memcached的简单配置 下篇帖子: Linux memcached 安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表