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

[经验分享] memcached 介绍

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-8 08:36:46 | 显示全部楼层 |阅读模式
memcache 是一套数据缓存系统或者软件
用于在动态应用系统中缓存数据库中的数据,减少数据库的访问压力,达到提升系统性能的目的。

memcache在企业应用场景中一般只是用来做数据库的cache服务使用。
memcache是通过预先分配指定内存空间来缓存数据的,因此它比MYSQL这样数据库直接操作硬盘要快很多,可以提供比直接读取数据库更好的性能,另外,memcached也进程作为集群节点应用服务器直接session数据共享的存储

软件                         作业                           缓存数据
memcached、redies        后端数据库缓存            动态的数据,如:博文、bbs帖子
squid、nginx、varnish    前端web应用的缓存         静态数据缓存,如:图片、附件、js、html、css   

网站的瓶颈,数据库和存储,对于数据库的减压有memcached、redis等nosql数据库。对于存储的减压有nginx、squid、varnish、CDN

#############################################################################
#############################################################################
1、Memcached是什么,有什么作用?

memcached 是一个开源的、高性能的,具有分布式内存对象的缓存系统,从名字上看,mem就是内存的意思,cache就是缓存的意思,它通过在事先规划好的内存空间中缓存数据库中的数据,以达到减少数据库高并发访问,从而达到提升数据库的访问性能。加速动态应用服务的能力。

memcached是服务端主程序名,memcached服务一般被用来保存网络中经常被读取的对象或数据,就像我们客户端浏览器也会把经常访问网页缓存起来一样,通过内存缓存来存取对象或数据要比磁盘存取快很多,因为磁盘是机械的介质。

#############################################################################
#############################################################################
2、Memcached服务在企业集群架构中应用角色

  1、作为数据库的前端缓存应用
     a、可以减少数据库的压力
             这个是比较重要的,所有的完整动态数据都保存在数据库中,每次频繁的读取数据库,会导致数据库性能的急速下降,无法同时服务更多的用户,比如mysql特别频繁的锁表,那么,就可以让memcached来分担数据库的压力,增加memcached服务的好处除了可以分担数据库的压力,增加memcached架构也无需改动整个网站的架构,只需要修改程序首先来读取memcached查询的数据就可以了。当然别忘记,更新数据库时也要更新缓存
   2、sesson 会话共享的共享存储
      默认情况下,session会话保存在/tmp目录下,由php的配置文件php.ini中指定。




3、Memcached服务在不同企业业务应用场景中的工作流程

memcached是一种内存缓存,在工作中经常用来缓存数据库中的数据,数据被缓存在事先预分配的memcached管理的内存中,可以通过API的方式存取内存中缓存的这些数据,memcached服务内存中缓存的数据就像一张巨大的hash表,每条数据都是以KEY-value对的形式存在

memcached通过缓存经常被读取的数据库中的数据,当程序需要访问后端数据库获取数据时会优先访问memcached内存缓存,如果缓存中有数据就直接返回给前端服务应用,如果没有数据(没有命中)再转发给后端数据库服务器,程序服务取得memcached内存缓存中没有的对应数据后,除了返回给用户数据外,还会把数据再memcached内存缓存中进行缓存起来,等待下次被访问,从而达到大大减轻数据库的压力,提供整个网站架构的响应速度,提升了用户的体验

当程序更新。删除数据库中已有的数据时,会同时发送请求通知memcached已经缓存过同一个ID内容的数据失效。从而保证memcached中的数据和数据库中的数据一致。

如果是高并发场合,除了通知memcached过期的缓存失效外,还会通知相关机制,使得在用户访问数据库前,通过程序预先把更新的数据推送到们memcached中缓存起来,这样就可以减少数据库的访问压力,提升么么memcached中缓存的命中率

1、程序首先检查前端应用程序服务请求的数据是否在memcached缓存中存在们如果存在,直接把请求的数据返回,不在请求后端的数据库
2、如果请求的数据不在memcached缓存中,请求将被转发去查询数据库服务,把从数据库中取到的数据返回前端服务器应用,同时把新取到的数据新缓存一份到memcached缓存中
3、当程序更新或者删除数据库中已有的数据的同时,也会更新memcached中的就数据,从而保证memcached中缓存的数据和数据库中的数据是一致的,这个一致性非常重要
4、当分配给memcache内存空间用完之后,memcahced自身会使用LRU(least recently used,最近最少使用)
加到期失效策略,失效的数据将首先被替换掉,然后是最近最少使用的数据被替换




4、Memcached服务分布式集群如何实现?

为了缓解数据库的高并发访问压力,我们可以在数据库层配置数据读写分离及读数据库的负载均衡,但是更加有效简单的策略是,部署memcached服务作为一个缓存区域,把部分数据库的信息保存在内存中,这样前端的服务能够迅速的读取到原本在数据库中才能读到的数据,那么,最重要的就是如何通过memcached服务分担数据库系统的压力,由于单台memcached的内容容量是有限的,并且单台也是单点,因此,memcached也有负载均衡及分布式应用的场景

分布式应用场景1
memcached支持分布式,我们在应用服务器上稍加改造,就可以更好的支持,例如:我们的KEY可以适当进行有规律的封装,比如以用户为主的网站来说,每个用户都要userID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台memcached服务器,2开头的用户的数据保存在第二台memcached服务器上,存取数据都先安装userID来进行转换和存取

但是这个有缺点,就是需要对userID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法
############################
分布式应用场景2
在应用服务器上通过程序及URL_HASH 算法去访问memcached服务,memcached服务的地址池可以简单配置在每个程序里
############################
分布式应用场景3
门户如百度,会通过一个中间件代理负载请求后端的cache服务
############################
分布式应用场景4
可以用常见的LVS,haproxy做cache的负载均衡,和普通应用服务相比,这里的重点是轮询算法。一般会选择url_hash或者一致性哈希算法

========================================
5、Memcached服务特点及工作原理是什么?

memcached 作为高并发,高性能的缓存服务,具有如下特征
A、协议简单
        memcached的协议实现比较简单,使用的是基于文本行的协议,能通过telnet直接超值memcached服务存取数据
B、基于libevent 的事件处理
        简单的说,libevent是一套利用C语言开发的程序库,他将BSD系统的kqueue,linux系统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能
        memcached就是利用这个库进行异步事件处理。
        所有安装memcached前要安装 libevent库

C、内置的内存管理方式
   memcached有一套自己管理内存的方式,这套管理方式非常高效,所有的数据库都保存在memcached内置的内存中,当存入的数据占满了内存空间时,memcached使用URL算法自动删除最近不常使用的缓存,即重用过期数据的内存空间,memcached是为缓存系统设计的,因此,没有考虑数据的容灾问题。和机器的内存一样,重启机器,数据就会丢失,如果希望重启数据依旧能保留数据,那么就需要sina开发的memcachedb持久化内存缓存系统,当然也可以 用redis。内存缓存:

D、memcached相互之间是互不通信的。但具有下面分布式特点
   各个memcached服务器之间互不通信,都是独立存取数据,不共享任何信息,通过对客户端的设计,可以让memcached具有分布式,能支持海量缓存和大规模应用

###############################################################
###############################################################
###############################################################

6、简述Memcached内存管理机制原理?

Memcached利用slab allocation 机制来分配和管理内存。传统的内存管理方式是:
使用通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率,slab allocation机制不存在这样的问题,他按照预先规定的大小,将分配的内存分割成特点大小的内存块,再把尺寸相同的内存块分成组,这些内存块不会被释放,可以被重新利用
memcached服务器端保存着一个空闲的内存块列表,当有数据存入时根据接收到的数据大小,分配一个能存下这个数据的最小内存块,这种方式有时候会造成内存浪费。如:将一个200字节的数据存入300字节的内存块中,会有100字节被浪费掉,不能被使用,避免浪费内存的方法是,预先计算出应用存入的数据大小,把同一业务类型的数据存入到一个memcached服务器中,确保存入的数据大小均匀,这样就可以减少内存的浪费。
还有一种方法是,在启动是指点“-f” 参数,能在某种程度上控制内存组直接的大小差异,在应用中使用memcached时,通常可以不重新设置这个参数,这个参数的默认值是1.25,如果想优化memcached对内存的使用,可以考虑重新计算数据的预期平均长度,调整这个 参数来获取更加合适的设置值




                      特定长度的内存块               相同大小的内存块组成组
slab allocation 把内存======================>内存块========================>内存组
内存块不会被释放





###############################################################
###############################################################
###############################################################

7、Memcached的删除原理与删除机制?

memcached不会释放已经分配的内存空间,在数据过去后,客户端不能通过key取出它的值,其他存储空间被重新利用
memcached 使用的是一种lazy expiration策略, 自己不会监控存入的key/value对是否过期, 而是在获取key值时对查看记录的时间戳(set key flag exptime bytes ),检查key/value对空间是否过期,这种策略不会再过期检测上浪费CPU资源
memcached在分配空间时,优先使用已经过期的key/value对空间,当分配的内存空间占满时,memcached就会使用LRU算法来分配空间,删除最近最少使用的key/value对,将其空间分配给新的key/value对。在某种情况下,如果不想使用LRU算法,那么可以通过设置 -M 参数来启动memcached,这样memcached在内存耗尽的时候会返回一个报错的信息

注意:memcached不会设置自动释放内存块,除非你设置了key/value值的过期时间,或者在磁盘满的时候,你设置了LRU算法,如果这两个你都不设置,那么memcached就会在内存消耗尽的时候返回一个报错信息

###############################################################
###############################################################


运维网声明 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-124110-1-1.html 上篇帖子: Memcached简介 下篇帖子: memcache的作用及安装步骤
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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