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

[经验分享] memcached缓存服务器简介及其应用

[复制链接]

尚未签到

发表于 2018-12-25 06:01:07 | 显示全部楼层 |阅读模式
  目录
  一、Memcached是什么
  二、Memcached的特征
  三、Memcached的设计哲学
  四、Memcached的安装与配置
  五、安装Memcache的PHP扩展,使用php支持memcached功能
  六、使用libmemcached的客户端工具
  七、Nginx整合memcached,为nginx提供静态页面缓存功能
  Memcached是什么?
  memcached是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在
  已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
  Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。这时就该memcached大显身手了。memcached一般的使用目的是,通过缓存数据库查询的结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
  其工作流程图为:

  二、memcached的特征
  memcached作为高速运行的分布式内存缓存服务器,具有以下的特点。
  协议简单
  基于libevent的事件处理
  内置内存存储方式
  memcached不互相通信的分布式
  1、协议简单
  memcached的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。
  2、基于libevent的事件处理
  libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
  注:o(1)特性使得10000个连接和1个连接的查询速度是一样的。
  3、内置内存存储方式
  为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
  memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。 在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。 但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。
  Slab Allocator的基本原理是按照预先规定的大小, 将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合,在图中指的是slab class)。各个尺寸的chunk大小是通过其增长因子(growth  factor)来决定的,默认增长因子为1.25。下一个尺寸的chunk大小=之前一个chunk大小*增长因子。如下图所示:

  而且,slab allocator还有重复使用已分配的内存的目的。 也就是说,分配到的内存不会释放,而是重复利用。不过由于slab  Allocator分配的是特定长度的chunk,因此,当缓存的数据没有chunk长度大时,仍然会造成空间浪费。
  4、memcached不互相通信的分布式
  memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现。
  memcached的分布式可以由2种算法来实现:
  1、余数分布式算法(或者取模分布式算法)
  2、Consistent Hashing算法(一致性hash算法)
  余数分布式算法
  余数分布式算法是根据键做hash计算,将计算的结果除以服务器台数,并取最后的余数,这样余数为几,就将数据存储在哪台服务器上。

  如有3台服务器。需要将键"hello",'nice','hi'存储在memecache上,分别对这些键做has计算,并将计算的结果处于服务器台数(这里为3),然后取其余数,假设这里余数分别为0、1、2。那么余数为0则将会将键"hello"存储在第一台服务器上,余数为1表示将键"nice"存储在第二台服务器上,余数为2表示将键"hi"存储在第三台服务器上。这就是余数分布式算法。
  余数分布式算法的缺点在于,当新增或减少一台服务器上,其余数会发生改变,当程序需要获取数据时,这样会无法获取其之前相同服务器上的数据,导致缓存丢失。这种缓存丢失可能是全局的,因此,影响范围比较广,所以,此算法一般不建议采用。
  Consistent Hashing的简单说明
  首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)(图中白色的圆环)上。然后用同样的方法求出存储数据的键的哈希值(图中粉红色的圆就是键的hash值),并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。如下图所示:

  这种算法和上述算法相比,影响缓冲的命中率要小一些。不管是增加一个memcached节点,还是减少一个节点,它只会影响其该节点所在的continuum附加逆时针的少许数据。
  三、Memcached的设计哲学
  Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:
  1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
  2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;
  3. 各服务器间彼此无视:不在服务器间进行数据同步;
  4. O(1)的执行效率
  5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;
  

  四、memcached的安装与配置

  Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。
  存储类命令:set, add, replace, append, prepend
  获取数据类命令:get, delete, incr/decr
  统计类命令:stats, stats items, stats slabs, stats sizes
  清理命令: flush_all
  1、安装libevent
  memcached依赖于libevent API,因此要事先安装之,项目主页:http://libevent.org/,读者可自行选择需要的版本下载。本文采用的是目前最新版本的源码包libevent-2.0.16-stable.tar.gz。安装过程:
  # tar xf libevent-2.0.22-stable.tar.gz
  # cd libevent-2.0.22-stable
  # ./configure --prefix=/usr/local/libevent
  # make && make install
  # echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf
  # ldconfig
  2、安装配置memcached
  (1)、安装memcached
  # tar xf memcached-1.4.22.tar.gz
  # cd memcached-1.4.22
  # ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent(libevent的安装目录)
  # make && make install
  (2)、memcached SysV的startup脚本代码如下所示,将其建立为/etc/init.d/memcached文件:
  #!/bin/bash
  #
  # Init file for memcached
  #
  # chkconfig: - 86 14
  # description: Distributed memory caching daemon
  #
  # processname: memcached
  # config: /etc/sysconfig/memcached
  . /etc/rc.d/init.d/functions
  ## Default variables
  PORT="11211"
  USER="nobody"
  MAXCONN="1024"
  CACHESIZE="64"
  RETVAL=0
  prog="/usr/local/memcached/bin/memcached"
  desc="Distributed memory caching"
  lockfile="/var/lock/subsys/memcached"
  start() {
  echo -n $"Starting $desc (memcached): "
  daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch $lockfile
  return $RETVAL
  }
  stop() {
  echo -n $"Shutting down $desc (memcached): "
  killproc $prog
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $lockfile
  return $RETVAL
  }
  restart() {
  stop
  start
  }
  reload() {
  echo -n $"Reloading $desc ($prog): "
  killproc $prog -HUP
  RETVAL=$?
  echo
  return $RETVAL
  }
  case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  restart)
  restart
  ;;
  condrestart)
  [ -e $lockfile ] && restart
  RETVAL=$?
  ;;
  reload)
  reload
  ;;
  status)
  status $prog
  RETVAL=$?
  ;;
  *)
  echo $"Usage: $0 {start|stop|restart|condrestart|status}"
  RETVAL=1
  esac
  exit $RETVAL
  使用如下命令配置memcached成为系统服务:
  # chmod +x /etc/init.d/memcached
  # chkconfig --add memcached
  # service memcached start
  查看memcached进程是否已经启动了。如:
  # netstat -tnlp | grep 11211
  tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      3068/memcached
  tcp        0      0 :::11211                    :::*                        LISTEN      3068/memcached

  (3)、使用telnet命令测试memcached的使用
  Memcached提供一组基本命令用于基于命令行调用其服务或查看服务器状态等。
  查看memcached的内部状态信息
  首先是要telnet连接到memcached,然后再输入stats可以获取其memcached各种信息:
  # telnet 127.0.0.1 11211
  stats
  STAT pid 14381
  STAT uptime 307
  STAT time 1427814867
  STAT version 1.4.22
  STAT libevent 2.0.22-stable
  STAT pointer_size 64
  STAT rusage_user 0.000000
  STAT rusage_system 0.002999
  STAT curr_connections 10
  STAT total_connections 11
  STAT connection_structures 11
  STAT reserved_fds 20
  STAT cmd_get 0
  STAT cmd_set 0
  STAT cmd_flush 0
  STAT cmd_touch 0
  STAT get_hits 0
  STAT get_misses 0
  STAT delete_misses 0
  STAT delete_hits 0
  STAT incr_misses 0
  STAT incr_hits 0
  STAT decr_misses 0
  STAT decr_hits 0
  STAT cas_misses 0
  STAT cas_hits 0
  STAT cas_badval 0
  STAT touch_hits 0
  STAT touch_misses 0
  STAT auth_cmds 0
  STAT auth_errors 0
  STAT bytes_read 7
  STAT bytes_written 0
  STAT limit_maxbytes 67108864
  STAT accepting_conns 1
  STAT listen_disabled_num 0
  STAT threads 4
  STAT conn_yields 0
  STAT hash_power_level 16
  STAT hash_bytes 524288
  STAT hash_is_expanding 0
  STAT malloc_fails 0
  STAT bytes 0
  STAT curr_items 0
  STAT total_items 0
  STAT expired_unfetched 0
  STAT evicted_unfetched 0
  STAT evictions 0
  STAT reclaimed 0
  STAT crawler_reclaimed 0
  STAT lrutail_reflocked 0
  END
  输入stats slabs或stats items可以获取其缓存相关信息,如:
  stats slabs
  STAT active_slabs 0
  STAT total_malloced 0
  END
  stats items
  END
  测试,使用add命令添加数据
  add命令语法格式:
  add keyname flag  timeout  datasize
  如:
  add mykey 0 10 12
  Hello world!
  使用get命令获取指定key所对应的数据
  get命令语法格式为:
  get keyname
  如:get mykey
  VALUE mykey 0 12
  Hello world!
  END
  (4)、memcached的常用选项说明
  -l :指定进程监听的地址;
  -d: 以守护进程方式在后台运行;
  -u :以指定的用户身份运行memcached进程;
  -m :用于缓存数据的最大内存空间,单位为MB,默认为64MB;
  -c :最大支持的并发连接数,默认为1024;
  -p : 指定监听的TCP端口,默认为11211;
  -U :指定监听的UDP端口,默认为11211,0表示关闭UDP端口;
  -t :用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;
  -f :设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;
  -M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;
  -n: 指定最小的slab chunk大小;单位是字节;
  -S: 启用sasl进行用户认证;
  -s:监听的本地套接字
  注意:配到这里,memcached服务器已经搭建好了,下面还需配置php,让其支持memcached功能。上面的部分和下面的部分不是在同一个服务器上进行的。
  
(在另一台服务器上的配置)
  五、安装Memcache的PHP扩展,使用php支持memcached功能
  默认情况下。php从数据库获得数据并不会自动缓存到memcache中,需要程序员在开发时,自行调用memcache api,这样才使得memcache功能生效。要想让php从数据库获取到的数据缓存到memcache中,需要安装php的memcache扩展。这样当php需要使用数据时,首先从memcache中查找,如果在memcache中找不到,然后再去数据库查询,并将查询的结果缓存在memcache中,然后在返回给应用程序。
  对于php的安装这里不再详述了。(我这台服务器上已经安装了lnmp)
  ①安装PHP的memcache扩展
  php的memcache扩展下载地址:http://pecl.php.net/package/memcache
  # tar xf memcache-2.2.4.tgz
  # cd memcache-2.2.4
  # /usr/local/php/bin/phpize
  # ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache
  # make && make install
  上述安装完后会有类似以下的提示:
  Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
  ②编辑vim /etc/php.d/memcache.ini,添加如下行信息:
  extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/memcache.so
  而后对memcached功能进行测试,在网站根目录中建立测试页面test.php,添加如下内容:
  # vim  /usr/html/test.php
  

运维网声明 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-655391-1-1.html 上篇帖子: memcached演练(6) 高可用实例HA(伪集群方案 ) 下篇帖子: memcached做数据库缓存
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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