Memcached服务应用实践

Memcached介绍

Memcached是什么/mark>

数据库缓存都是中间键,不对用户直接 提供服务,是为了解决集群之间他们之间的效率。。。
Memcached对中小型企业,最常用,最常见,最省钱的数据库缓存

  • Memcached是一个开源的,支持高性能,高并发的分布式内存缓存系统,由C语言编写,总共2000多行代码。从软件名称上看,前3个字符“Mem”就是内存的意思,而接下来的后面5个字符“cache”就是缓存的意思,最后一个字符d,是daemon的意思,代表是服务器端守护进程模式服务。
  • Memcached服务分为服务器端和客户端两部分,其中,服务器端软件的名字形如Memcached-1.4.24.tar.gz,客户端软件的名字形如Memcache-2.25.tar.gz
  • Memcached软件诞生于2003年,最初由LiveJournal的Brad Fitzpatrick开发完成。Memcache是整个项目的名称,而Memcached是服务器端的主程序名,因其协议简单,应用部署方便,且支持高并发,因此被互联 企业广泛使用,直到现在仍然如此。其官方 站地址:http://memcached.org/.

memcache的优缺点

优点:
1:读速度非常快,比raids快
2:部署简易
Memcached的作用

  • 传统场景中,多数Web应用都将数据保存到关系型数据库中(例如:MySQL),Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,关系型数据库的负担就会出现加重,响应缓慢,导致 站打开延迟等问题,影响用户体验。
  • 这时就需要Memcached软件出马了。使用Memcached的主要目的是,通过在自身内存中缓存关系型数据库的查询结果,减少数据库被访问的次数,以提高动态Web应用的速度,提高 站架构的并发能力和可扩展性。
  • Memcached服务的运行原理是通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直接高并发访问,从而提升大规模 站集群中动态服务的并发访问能力。
    -生产场景的Memcached服务一般被用来保存 站中经常被读取的对象或数据,就像我们的客户端浏览器也会把经常访问的 页缓存起来一样,通过内存缓存来存取对象或数据要比磁盘存取快很多,因为磁盘是机械的,因此,在当今的IT企业中,Memcached的应用范围很广泛。

互联 常见内存缓存服务软件

用户访问到了应用服务器,如果是php写的代码那么就去MySQL里面找数据,如果是nginx那么就去存储找,应用服务器先去memcache缓存里面找,如果没找到那么就会去MySQL从库去要,要回来以后,写入到memcache里,然后在返回用户

如上图所示:使用Memcached缓存查询的数据来减少数据库压力的具体工作流程如下:
(1)Web程序首先检查客户端请求的数据是否在Memcached缓存中存在,如果存在,直接把请求的数据返回给客户端,此时不再请求后端数据库。

(2)如果请求的数据在Memcached缓存中不存在,则程序会

去请求数据库服务,把从数据库中取到的数据返回给客户端,同时把新取到的数据缓存一份到Memcached缓存中。

站更新Memcached数据时的工作流程
具体流程如下:
(1)当程序更新或删除数据时,会首先处理后端数据库中的数据。

(2)在处理后端数据库中数据的同时,也会通知Memcached,告诉它对应的旧数据失效,从而保证Memcached中缓存的数据始终和数据库中一致,这个数据一致性非常重要,也是大型 站分布式缓存集群最头疼的问题所在。

(3)如果是在高并发读写场合,除了要程序通知Memcached过期的缓存失效外,还可能要通过相关机制,例如在数据库上部署相关程序(如在数据库中设置触发器使用UDFs),实现当数据库有更新时就把数据更新到Memcached服务中,这样一来,客户端在访问新数据时,因预先把更新过的数据库数据复制到Memcached中缓存起来了,所以可以减少第一次查询数据库带来的访问压力,提升Memcached中缓存的命中率,甚至新浪门户还会把持久化存储Redis做成MySQL数据库的从库,实现真正的主从复制。

后缓存技术
上图是数据往memcache里面写入数据的,它采取的后缓存技术,也就说用户的第一次是找不到,在CDN里面有个未命中,找到了是叫命中率,命中率越高,缓存的好,后缓存技术先不命中,memcache缓存里面存的是热点数据,不访问的时候数据是没有的,减轻了缓存压力,这个热点技术是牺牲命中率的。

在生产工作中, 站Web服务器作为缓存应用更新数据的方案更为常用,即由 站程序负责更新Memcached缓存。
先缓存技术
用户的请求找应用服务器,应用服务器直接去找数据库,着是更新数据的过程,如果老是去找数据库里面找,那么更新数据的时候,memcached它并不知情,所以返回给用户的时候是旧的数据了,存在了一个更新数据的问题,如果是直接用户将写入的数据给应用服务器的话,应用服务器写了两份数据,一份数据库的,另一份还要写入到memcached缓存里面,着样会加重应用服务器的负担 ,写入到主库里面,在同步到从库里面,让运维开发的程序,让数据更新到memcached缓存里面。

Memcached在企业中的应用场景

作为数据库的查询数据缓存
(1)完整性数据缓存

例如:电商的商品分类功能不是经常变动的,因此可以事先放到Memcached里,然后再对外提供数据访问。这个过程被称之为“数据预热”。着种命中率会很高,完整性缓存是先缓存技术,这样就几乎不着数据库缓存要数据了,数据库的数据全部放在memcached里面,然后运维开发程序,里面添加一个类似于一个日志,如果主库数据有更新,那么就会同步过来,这些是运维开发程序干的事情,如果MySQL宕机了,那么用户的请求,和memcached同时进行,数据库是受不了的,那么就会出现了数据预热
此时只需读取缓存,无需读取数据库就能得到Memcached缓存里的所有商品分类数据了,所以数据库的访问压力就会大大降低。
为什么商品分类数据可以事先放在缓存里呢br> 因为,商品分类几乎都是由内部人员管理的,如果需要更新数据,更新数据库后,就可以把数据同时更新到Memcached里。
如果把商品分类数据做成静态化文件,然后,通过在前端Web缓存或者使用CDN加速效果更好。

(2)热点数据缓存

热点数据缓存一般是用于由用户更新的商品,例如淘宝的卖家,在卖家新增商品后, 站程序就会把商品写入后端数据库,同时把这部分数据,放入Memcached内存中,下一次访问这个商品的请求就直接从Memcached内存中取走了。这种方法用来缓存 站热点的数据,即利用Memcached缓存经常被访问的数据。

提示:
这个过程可以通过程序实现,也可以在数据库上安装相关软件进行设置,直接由数据库把内容更新到Memcached中,就相当于Memcached是MySQL的从库一样。

  • 如果碰到电商双11,秒杀高并发的业务场景,必须要事先预热各种缓存包括前端的Web缓存和后端的数据库缓存
  • 也就是先把数据放入内存预热,然后逐步动态更新。此时,会先读取缓存,如果缓存里没有对应的数据,再去读取数据库,然后把读到的数据放入缓存。如果数据库里的数据更新,需要同时触发缓存更新,防止给用户过期的数据,当然对于百万级别并发还有很多其他的工作要做。
  • 绝大多数的 站动态数据都是保存在数据库当中的,每次频繁地存取数据库,会导致数据库性能急剧下降,无法同时服务更多的用过户(比如MySQL特别频繁的锁表就存在此问题),那么,就可以让Memcached来分担数据库的压力。增加Memcached服务的好处除了可以分担数据库的压力以外,还包括无须改动整个 站架构,只须简单地修改下程序逻辑,让程序先读取Memcached缓存查询数据即可,当然别忘了,更新数据时也要更新Memcached缓存。

作为集群节点的session会话共享存储

即把客户端用户请求多个前端应用服务集群产生的session会话信息,统一存储到一个Memcached缓存中。由于session会话数据是存储在内存中的,所以速度很快。

下图为Memcached服务在企业集群架构中的常见工作位置:

2)新增数据对象存储时。因Memcached服务器中保存着slab内空闲chunk的列表,他会根据该列表选择chunk,然后将数据缓存于其中。当有数据存入时,Memcached根据接收到的数据大小,选择最适合数据大小的slab分配一个能存下这个数据的最小内存块(chunk)。例如:有100字节的一个数据,就会被分配存入下面112字节的一个内存块中,这样会有12字节被浪费,这部分空间就不能被使用了,这也是Slab Allocator机制的一个缺点。

Slab 内存管理机制特点

  • 提前分配大内存Slab 1MB,再进行小对象填充chunk。
  • 避免大量重复的初始化和清理,减轻内存管理器负担。
  • 避免频繁malloc/free内存分配导致的碎片

下面对Mc的内存管理机制进行一个小结

  • Mc的早期内存管理机制为malloc(动态内存分配)
  • malloc(动态内存分配)产生内存碎片,导致操作系统性能急剧下降。
  • Slab内存分配机制可以解决内存碎片的问题
  • Memcached服务的内存预先分割成特定长度的内存块,称为chunk,用于缓存数据的内存空间或内存块,相当于磁盘的block,只不过磁盘的每一个block都是相等的,而chunk只有在同一个Slab Class内才是相等的。
  • Slab Class指特定大小(1MB)的包含多个chunk的集合或组,一个Memcached包含多个Slab Class,每个Slab Class包含多个相同大小的chunk。
  • Slab机制也有缺点,例如,Chunk的空间会有浪费等。

Memcached Slab Allocator内存管理机制的缺点

Slab Allocator解决了当初的内存碎片问题,但新的机制也给Memcached带来了新的问题。这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了,如下图所示:

Memcached启动命令相关参数说明

进程与连接设置

命令参数 说明
-d 以守护进程(daemon)方式运行服务
-u 指定运行memcached的用户,如果当前用户为root,需要使用此参数指定用户
-l 指定memcached进程监听的服务器ip地址,可以不设置此参数
-p(小写) 指定memcached服务监听TCP端口 ,默认为11211
-P(大写) 设置保存memcached的pid文件($$),保存PID到指定文件

内存相关设置:

命令参数 说明
-m 指定memcached服务可以缓存数据的最大内存,默认是64MB
-M memcached服务内存不够时禁止LRU,如果内存满了会 错
-n 为key+value——flags分配的最小内存空间,默认为48字节
-f chunk size增长因子,默认为1。25
-L 启用大内存页,可以降低内存浪费,改进性能

并发连接设置:

并发连接设置 说明
-c 最大的并发连接数,默认是1024
-t 线程数,默认4.由于memcached采用的是NIO,所以太多线程作用不大
-R 每个event最大请求数,默认是20
-C 禁用CAS(可以禁止版本计数,减少开销)

测试参数

-v 打印较少的errors/warnings
-vv 打印非常多调试信息和错误输出到控制台
-vvv 打印极多的调试信息和错误输出,也打印内部状态转发

其他选项可通过“memcached -h”命令来显示

Memcached中的数据形式及与MySQL相关语句对比

向Memcached中添加数据时,注意添加的数据一般为键值对的形式,例如:key1–>values1,key2–>values2

这里把Memcached添加,查询,删除等的命令和MySQL数据库做一个基本类比,见下表:

MySQL数据库管理 memcached管理
MySQL的insert语句 memcached的set命令
MySQL的select语句 memcached的get命令
MySQL的delete语句 memcached的delete命令

通过printf配合nc向Memcached中写入数据,命令如下:

提示:
推荐使用上述方法测试操作Memcached

通过telnet命令写入数据时,具体步骤如下:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年1月5日
下一篇 2019年1月5日

相关推荐