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

     下面是是启动的输出:

    

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 3rnnnnrn” |nc 127.0.0.1 11211

    注意:printf “rn”

    command name 可以是set(存储此数据),add(存储此数据,只在服务器*未保留此键值数据时)

b 取数据:printf “get key008rn” |nc 127.0.0.1 11211

    VALUE key008 0 3
    nnn
    END

c 删除数据: printf “delete key008rn” |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的测试页面,

浏览器访问后出现

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 rn”|nc 127.0.0.1  11211 

范例:

printf “stats rn”|nc 127.0.0.1  11211 | grep get
STAT cmd_get 9     
STAT get_hits 6    #命中
STAT get_misses 3   #未命中

printf “get keyrn”|nc 127.0.0.1  11211
END
printf “stats rn”|nc 127.0.0.1  11211 | grep get
STAT cmd_get 10
STAT get_hits 6
STAT get_misses 4

#如果未命中过多,会对数据库造成一定的压力。

监控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.phpction=admin

网友资料:http://storysky.blog.51cto.com/628458/244962 附件也有

如图:

wKioL1SYP7GC6S2uAANvbcY9IsQ238.jpg

或者自己写监控脚本模拟用户监控

范例:curl http://xx.check mem.php 根据返回结果监控

 #!/bin/sh
b=`printf “statsrn”|nc 10.0.0.7 11211|grep cmd_get|awk ‘{print $NF+0}’`
a=`printf “statsrn”|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协议)

 

转载于:https://blog.51cto.com/linuxboys/1593075

文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树数据库组成31279 人正在系统学习中 相关资源:实例讲解分布式缓存软件Memcached的Java客户端使用-其它代码类…

来源:weixin_33910759

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2014年11月21日
下一篇 2014年11月21日

相关推荐