Memcached原理及安装操作实战

来源:互联网 发布:mac版是什么意思 编辑:程序博客网 时间:2024/06/04 19:24

1.Memcached是什么,有什么作用?
  Memcached是一个开源的,高性能的,具有分布式内存对象的缓存系统,它通过在事先规划好的内存空间中临时缓存数据库中的各类数据,以达到减少业务
对数据库的直接并发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力。
2.Memcached服务在企业集群架构中的应用场景?
  (1)作为数据库的前端缓存应用
   a.完整缓存(易) 静态缓存
   例如:商品分类,以及商品信息等不常发生变化的数据,可事先放到内存里,然后再对外提供访问,这个被称为预热。用户访问时可以只读取
memcached缓存,不读取数据库了。
   b.热点缓存(难)
   需要前端程序配合。只缓存热点的数据,即缓存经常被访问的数据
   先预热基础数据,然后再动态更新。程序先将数据库的数据缓存到memcached,用户访问,程序先读取缓存,如果缓存里没有对应的数据,程序再去读取数据库,然后程序把读到的数据放在缓存里。
  特殊说明:
   1.如果碰到电商秒杀等高并发的业务,一定要先预热,或者其他思想实现,例如:秒杀只是获取资格,而不是瞬间秒杀到手商品
   2.如果数据更新,同时触发缓存更新,防止给用户过期数据
  c.对于持久化缓存存储系统,例如redis,可以替代一部分数据库的存储。一些简单的数据业务,投票,统计,好友关注,商品分类等。
http://oldboy.blog.51cto.com/2561410/736710
(2)作为集群的session会话共享存储
http://oldboy.blog.51cto.com/2561410/1331316
http://oldboy.blog.51cto.com/2561410/1323468
3.memcached服务在不同企业业务应用场景中的工作流程
 a.当web程序需要访问后端数据库获取数据时会优先访问Memcached内存缓存,如果缓存中有数据就直接获取,返回前端服务及用户;如果没有数据(没命中),在由程序请求后端的数据库服务器,
获取到对应的数据后,除了返回给前端服务及用户数据外,还会把数据放到Memcached内存中进行缓存,等待下次请求被访问,Memcached内存始终是数据库的挡箭牌
 b.当程序更新,修改或删除数据库中已有的数据时,会同时发送请求通知Memcached,已经缓存过的同一个ID内容的旧数据失效,从而保证Memcached中的数据和数据库中的数据库一致。
 
  如果是在高并发场合,除了通知Memcahed过期的缓存失效外,还会通过相关机制,使得在用户访问新数据前,通过程序预先把更新过的数据推送到memcached中缓存起来,这样可以减少数据库的
访问压力,提升memcached中缓存的命中率
 
c.有一款数据库插件可以再写入更新数据库后,自动抛给MC缓存起来,自己不缓存
4.Memcached的分布式集群如何实现?
 
 a.程序端实现
  程序加载所有mc的ip列表,通过对key做hash(一致性哈希)
  特殊说明:memcached和web服务集群是不一样的,所有memcached的数据总和才是数据库的数据。
http://blog.csdn.net/cutesource/article/details/5848253
 b.负载均衡器,通过对key做hash(一致性哈希)
一致性哈希算法的目的不但是保证每个对象之请求一个对应的服务器,而且当节点宕机,缓存服务器的更新重新分配比例降到最低
5.Memcached服务的特点及工作原理?
 a.完全基于内存的,无持久性存储的设计,重启服务,内存里的数据全部丢失
 b.节点之间相互独立,不通信
 c.异步I/O模型,基于libevent模型的事件通知机制
 d.数据以key/value形式的方式存储
 e.C/S模型架构,C语言编写,总共代码2000多行
 f.可以对存储的数据设置过期时间,这样过期后数据自动被清除,服务本身不会监控过期,而是在访问的时候查询key的时间戳判断是否过期
 g.memcache内存分配机制是对特定的内存进行分块,再把多个块分为一组
6.简述Memcached内存管理机制原理?
  malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
  早期的Memcached内存管理方式是通过malloc分配的内存,使用完通过free来回收内存。这种方式容易产生内存碎片并降低操作系统对内存的管理效率。
加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还蛮,为了解决这个问题,Slab Allorcator内存分配机制就诞生了。
  现在的Memcached就是利用Slab Allocator机制分配和管理内存。它的机制原理是按照预先规定的内存大小,分配给memcached的内存分割成特定长度的内存
块(chunk),再把尺寸相同的内存块分成组(chunk slab class),这些内存块不会释放,可以重复利用。
  Memcached服务器端保存中slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存与其中。当有数据存入时,Memcached根据接收到的数据大小,
选择最适合数据大小的slab,分配一个能存下这个数据的最小内存块。例如;有100字节的一个数据,就会被分配存入下面112字节的一个内存块中,会有12字节被
浪费掉,这部分空间不能被使用了,这是slab allocator机制的一个缺点。
  slab allocator还有重复使用已分配内存的作用。也就是说,分配到的内存不会释放,而是重复利用。
避免浪费的办法是,预先计算出应用存入的数据大小,或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀,这样就剋可以减少内存
的浪费。还有一种办法,在启动时指定-f参数,优化因子,能在某种程度下控制内存组之间的大小差异。
7.Memcached对象删除原理与cache机制?
 Memcached主要的cache机制是LRU(最近最少用)算法,加上数据自身过期失效。当您存数据到memcached中,可以指定该数据在缓存中呆多久。如果memcached的内存不够用了,
过期的slabs会优先被替换,接着就轮着最老的未被使用的slabs。在某些情况下,如果不想使用LRU算法,那么可以通过"-M"参数来启动Memcached,这样,Memcached在内存耗尽
时,会返回一个报错信息。
8.Memcached服务端与客户端的安装部署
一.安装Memcached实战
安装memcached服务端
安装libevent
wget https://github.com/libevent/libevent/archive/release-1.4.15-stable.tar.gz
tar zxf libevent-1.4.15-stable.tar.gz
cd libevent-1.4.15-stable
./configure
make && make install
cd ..
安装memcached
tar zxf memcached-1.4.13.tar.gz
cd memcached-1.4.13
./configure
make && make install
memcahced命令
memcached -m 16m -d -u root -c 4082 #启动memcached
参数:
-p 指定memcached服务监听TCP端口号。默认为11211
-m 指定memcached服务可以缓存数据的最大内存,默认是64M
-u 运行memcached的用户
-d 作为守护进程在后台运行
-c 最大的并发连接数,默认是1024,按照服务器的并发访问量来设定
-vv 以very verbose模式启动,调试信息和错误输出到控制台
-P 设置保存Memcached的pid文件
-l 设置监听的服务器IP地址
memcached命令的语法
set              key    0          0           10
<command name>  <key>  <flags>   <exptime>   <bytes>\r\n
存储数据
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
也可以使用telnet连接操作
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set user01 0 0 6
oldboy
STORED
get user01
VALUE user01 0 6
oldboy
END
delete user01
DELETED
get user01
END
安装memcache客户端
测试memcached客户端与服务端连接
<?php
  $memcache = new memcache;
  $memcache ->connect('192.168.1.113', 11211) or die ("could not connect memcached server!");
  $memcache->set('key001','oldboy001');
  $get_value1 = $memcache->get('key001');
  echo $get_value1;
?>

9.Memcached如何实现集群中的session共享存储?
只需在php.ini中修改两个参数
session.save_handler = memcache
session.save_path = "tcp://192.168.1.113:11211"
用memcached存储session特点:
优点:
 1)memcached是内存缓存,在读写速度上比普通文件要快很多
 2)可以解决多个服务器公用session的难题
缺点:
 1) session数据都保存在内存中,持久化方面有所欠缺,可能会丢失session
 2)也可以用其他的持久化系统存储session,例如redis,ttserver
 3)高性能高并发场景,cookies的效率要比session好很多,因此,很多大网站都会用cookies解决会话共享问题
10.memcached状态信息如何获取?
printf "stats\r\n"|nc 127.0.0.1 11211
使用memadmin监控

11.监控memcached需要监控那些具体指标?
1.端口11211
2.命中
3.反映时间
4.模拟用户登录

原创粉丝点击