memcached的深度解析

来源:互联网 发布:淘宝买家秀怎么发微淘 编辑:程序博客网 时间:2024/04/30 20:27

一、memcached的介绍

解决存储的瓶颈要通过前端web应用缓存,例如squidvarnish

cache是读缓存,buffer是写缓存,当磁盘到一定量的时候,会同步到磁盘里面

sync命令就是把缓存区的数据同步到磁盘中

memcached应用于在动态应用系统中缓存数据库的数据,它通过事先在规划好的内存空间中缓存数据库中的数据,以达到减少数据库的高并发访问

memcached是通过指定的预分配指定的内存空间来存储数据的,一次它比mysql这样的数据库直接操作磁盘要快的多,可以提供比直接读取数据库更好的性能。另外,它也可以作为session共享的存储。

 

二、当memcached宕机如何解决(机房断电或线路老化停机了)

这时应在负载均衡通过防火墙禁止对外访问

或者把real server全部卸载掉,不让real server不对外访问

通过程序把数据库中的数据推送到缓存中

 

当数据库缓存满的时候,memcached会通过LRU算法,加到期失效策略,失效的数据首先会被提到,然后是最近未使用的数据被替换掉。

 

 

三、memcached服务在大型站点中的应用

在工作中尽量把用户的请求往前推。

  

四、memcached的分布式

为了缓解数据库高并发的访问压力,我们可以在数据库层配置数据库读写分离及读数据库做负载均衡,更简单的策略是,部署memcached服务作为一个缓冲区域,把部分数据库的信息保存在内存中,这样前端就可以迅速的到数据库中读到数据了。

最重要的是如何通过memcached服务分担数据库系统的压力,由于单台memcached的内存是有限的,并且也是单点,所以采用分布式解决单点问题。因此,memcached也有负载均衡及分布式应用场景

[分布式应用1]

memcached支持分布式,我们在服务器应用程序上稍加改造,就可以更好的支持。例如:可以根据key适当进行有规律的封装。比如以用户为主的网站,我们可以根据ID进行提取和存取。比如1开头的用户,保存在第一台memcached服务器中;2开头的用户,保存在第二台memcached服务器中

[分布式应用2]

在应用服务器上通过程序及URL_HASH算法和一致性hash算法去访问memcached服务,所有memcachedd服务器的地址池可以简单的分配在每个程序的配置文件里。

比如URL_HASH算法

一个队形对一个对象的访问,存放在固定的服务器上。当在缓存中存数据的时候,a.jpg的第一次访问的时候,会存到第一次访问的缓存服务器中,下一次任何一个用户访问a.jpg的时候都会在这台服务器上。

[分布式应用3]

门户网站,会通过一个中间件代理负责请求后端的cache服务

[分布式应用4]

可以用常见的lvshaproxycache的负载均衡,和普通的web应用相比,这里的重点是调度算法cache一般会选择URL_HASH和一致性HASH。(为什么,每台cache服务器是不一样,定位某个元素,不可能挨个查找,存的时候,按照这种算法存,取得时候也按照这种算法取。)

 

cache服务器总和是总共的内容,而web没有这个问题,主要是web服务器上的内容是一样的,不一样的内容放到nfs共享存储里面了。所以web服务器可以用wrr(轮询算法)

 

五、memcached特性

①协议简单(文本行协议,telnet直接操作)②基于libevent的事件处理③内置的内存管理方式④互不通信具有分布特性。

libeventLinux系统的epoll等事件处理功能封装成一个接口,作为事件通知机制,应用程序端通过指定缓存服务器的IP和端口,就可以和memcached服务进行通信。

 

六、memcached工作原理

memcached是一套C/S模式架构软件,在服务端启动服务守护进程,可以为memcachedd服务器指定监听的IP地址、端口号、并发访问连接数以及分配多少内存来处理客户端的请求参数

需要被缓存的数据是以key/value键值对的形式保存在服务器预分配的内存中

 

七、memcached内存管理机制

memcached利用Slab Allocation机制来分配和管理内存。他按照预先规定的大小,将分配的内存分割成特定长度的内存快(chunk),再把尺寸相同的内存快分成组,这些内存快不会释放,可以重复利用。

避免内存浪费的算法:

1、预先计算出应用存入数据的大小,或者把同一业务类型的数据存入

2、启动时指定-f,能在某种程度上控制内存组之间的大小(有点类似于磁盘管理),默认值是1.25

 

八、memcached的删除机制

memcached不会自己释放已分配的内存空间(除非添加数据设定过期或内存的满了),在数据库过期后,客户端不能通过key取出它的值,其存储空间被重新利用。

1、设置时间戳,获取key查看记录的时间戳(set key flag exptime bytes

2LRU算法(先进先出):删除最近最少使用的key/value

3、启动时用-M指定,这样在memcached内存耗尽时,会返回一个报错信息

  

九、企业工作场景中如何配置memcached

工作一般是开发人员提出需求,说要部署一个memcache,我们运维接到需求,内存指定多大要根据业务有多少数据要缓存来决定,还要确定业务的重要性,进而采取负载均衡,分布式等架构,最后确定并发连接数。

 web访问memcache服务器,如果有直接返回给用户,如果没有,web会请求数据库,数据库会把数据存到memcache中一份,同时也会把数据返回给web

  

 

0 0
原创粉丝点击