一、memcached的介绍
解决存储的瓶颈要通过前端web应用缓存,例如squid、varnish。
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]
可以用常见的lvs,haproxy做cache的负载均衡,和普通的web应用相比,这里的重点是调度算法,cache一般会选择URL_HASH和一致性HASH。(为什么,每台cache服务器是不一样,定位某个元素,不可能挨个查找,存的时候,按照这种算法存,取得时候也按照这种算法取。)
cache服务器总和是总共的内容,而web没有这个问题,主要是web服务器上的内容是一样的,不一样的内容放到nfs共享存储里面了。所以web服务器可以用wrr(轮询算法)
五、memcached特性
①协议简单(文本行协议,telnet直接操作)②基于libevent的事件处理③内置的内存管理方式④互不通信具有分布特性。
libevent:将Linux系统的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)
2、LRU算法(先进先出):删除最近最少使用的key/value对
3、启动时用-M指定,这样在memcached内存耗尽时,会返回一个报错信息
九、企业工作场景中如何配置memcached
工作一般是开发人员提出需求,说要部署一个memcache,我们运维接到需求,内存指定多大要根据业务有多少数据要缓存来决定,还要确定业务的重要性,进而采取负载均衡,分布式等架构,最后确定并发连接数。
web访问memcache服务器,如果有直接返回给用户,如果没有,web会请求数据库,数据库会把数据存到memcache中一份,同时也会把数据返回给web。