`

分布式缓存-Memcached

 
阅读更多

分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性)。分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制。其次是分布式管理和分布式算法,其次是缓存键值管理和路由。

原文:http://wenku.baidu.com/view/8686d46c7e21af45b307a8c3.html

什么是Memcached

许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,就会出现REBMS的负担加重,数据库响应恶化,网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器。一般的使用目的是通过缓存数据库查询结果,减少数据库的访问次数,以提高动态Web 应用的速度、提高扩展性。如图:

 分布式缓存-Memcached

Memcached作为高速运行的分布式缓存服务器具有以下特点。

  • 协议简单:memcached的服务器客户端通信并不使用复杂的MXL等格式,而是使用简单的基于文本的协议。
  • 基于libevent的事件处理:libevent是个程序库,他将Linux 的epoll、BSD类操作系统的kqueue等时间处理功能封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
  • 内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached,重启操作系统会导致全部数据消失。另外,内容容量达到指定的值之后memcached回自动删除不适用的缓存。
  • Memcached不互通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。他的分布式主要是通过客户端实现的。


Memcached的内存管理
   
最近的memcached默认情况下采用了名为Slab Allocatoion的机制分配,管理内存。在改机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是这中方式会导致内存碎片,加重操作系统内存管理器的负担。

Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,已完全解决内存碎片问题。Slab Allocation  的原理相当简单。将分配的内存分割成各种尺寸的块(chucnk),并把尺寸相同的块分成组(chucnk的集合)如图:

分布式缓存-Memcached

而且slab allocator 还有重复使用已分配内存的目的。也就是说,分配到的内存不会释放,而是重复利用。

Slab Allocation 的主要术语

  •     Page :分配给Slab 的内存空间,默认是1MB。分配给Slab 之后根据slab 的大小切分成chunk.
  •     Chunk : 用于缓存记录的内存空间。
  •     Slab Class:特定大小的chunk 的组。


在Slab 中缓存记录的原理

Memcached根据收到的数据的大小,选择最合适数据大小的Slab (图2) memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。
 
分布式缓存-Memcached

Memcached在数据删除方面有效里利用资源
   
Memcached删除数据时数据不会真正从memcached中消失。Memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible 透明),其存储空间即可重复使用。

Lazy Expriationmemcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术称为lazy expiration.因此memcached不会再过期监视上耗费CPU时间。

对于缓存存储容量满的情况下的删除需要考虑多种机制,一方面是按队列机制,一方面应该对应缓存对象本身的优先级,根据缓存对象的优先级进行对象的删除。

LRU:从缓存中有效删除数据的原理
   
Memcached会优先使用已超时的记录空间,但即使如此,也会发生追加新纪录时空间不足的情况。此时就要使用名为Least Recently Used (LRU)机制来分配空间。这就是删除最少使用的记录的机制。因此当memcached的内存空间不足时(无法从slab class)获取到新空间时,就从最近未使用的记录中搜索,并将空间分配给新的记录。

Memcached分布式

Memcached虽然称为“分布式“缓存服务器,但服务器端并没有“分布式”的功能。Memcached的分布式完全是有客户端实现的。现在我们就看一下memcached是怎么实现分布式缓存的。

例如下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据。
 
首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。
 
同样,“kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存。

接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。
 分布式缓存-Memcached
这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。 memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。

Memcached的缓存分布策略:http://blog.csdn.net/bintime/article/details/6259133

Consistent Hashing的简单说明

Consistent Hashing如下所示:首先求出memcached服务器(节点)的哈希值, 并将其配置到0~232的圆(continuum)上。 然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。 如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。

分布式缓存-Memcached

从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化 而影响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的 第一台服务器上的键会受到影响。

分布式缓存-Memcached

因此,Consistent Hashing最大限度地抑制了键的重新分布。 而且,有的Consistent Hashing的实现方法还采用了虚拟节点的思想。 使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。 因此,使用虚拟节点的思想,为每个物理节点(服务器) 在continuum上分配100~200个点。这样就能抑制分布不均匀, 最大限度地减小服务器增减时的缓存重新分布。

缓存多副本

缓存多副本主要是用于在缓存数据存放时存储缓存数据的多个副本,以防止缓存失效。缓存失效发生在以下几种情况:

  • 1.    缓存超时被移除(正常失效)
  • 2.    缓存由于存储空间限制被移除(异常失效)
  • 3.    由于缓存节点变化而导致的缓存失效(异常失效)


在缓存多副本的情况下,需要重新考虑缓存的分布式分布策略。其次缓存的多个副本实际本身是可能的多个读的节点,可以做为分布式的并行读,这是另外一个可以考虑的问题。

缓存数据的一致性问题

缓存数据尽量只读,因此缓存本身是不适合大量写和更新操作的数据场景的。对于读的情况下,如果存在数据变化,一种是同时更新缓存和数据库。一种是直接对缓存数据进行失效处理。

分享到:
评论

相关推荐

    hibernate-memcached, 在Hibernate中,使用Memcached作为第二级分布式缓存的库.zip

    hibernate-memcached, 在Hibernate中,使用Memcached作为第二级分布式缓存的库 休眠 memcachedHibernate中使用Memcached作为第二级分布式缓存的库。基于优秀的spymemcached客户端包含对 Whalin ( danga ) memcached...

    python-memcached python-memcached

    Memcached是一种高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。Python-memcached库则为Python开发者提供了一个简单易用的接口,能够方便地将数据存储和检索到...

    hibernate-memcached包

    **hibernate-memcached-1.2.2.jar** 文件是这个扩展的核心库,其中包含了所有必要的类和接口,使得Hibernate能够识别并使用Memcached作为二级缓存。这个版本的hibernate-memcached已经过测试和优化,确保与1.2.2版本...

    分布式键值-memcached和redis比较1

    本文主要对比两个流行的分布式缓存系统:Memcached和Redis。 **Memcached** 是一个轻量级的高性能分布式内存缓存服务器,主要用于缓存数据库查询结果或其他小块的任意数据,如字符串或对象。它的设计目标是减少...

    python-memcached-latest.tar

    **分布式缓存策略** 在分布式环境中,Memcached可以通过一致性哈希算法实现数据在多个节点间的自动分布。这允许在添加或移除服务器时,尽可能少地重新分布数据,保持系统的稳定性和性能。 总的来说,`python-...

    分布式键值-memcached1

    尽管被称为分布式缓存,但Memcached服务器之间并不直接通信以协调数据分布。分布式是通过客户端实现的,客户端负责决定数据应存储在哪个服务器上,并处理数据的一致性和复制。这意味着如果某个服务器失效,存储在该...

    分布式缓存客户端MemcachedProviders最新下载

    分布式缓存客户端MemcachedProviders是IT领域中一种用于提高应用程序性能和可伸缩性的关键工具。Memcached是一种广泛使用的开源高性能、分布式内存对象缓存系统,它可以存储数据并提供高速访问,减轻数据库负载,...

    分布式缓存系统Memcached

     Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及...

    分布式缓存系统Memcached简介及开发环境搭建

    在Windows上搭建Memcached开发环境,首先需要下载对应版本的memcached软件,例如`memcached-win32-1.4.4-14`,解压并运行服务。默认情况下,memcached会监听11211端口。可以通过运行`memcache.exe -h`命令查看帮助...

    python-memcached

    Memcached是一种高性能、分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的响应速度。Python-Memcached库允许Python开发者方便地利用Memcached的功能。 Python-Memcached的主要特点包括: 1. **简单...

    hibernate-memcached-1.1.0-sources.zip

    `hibernate-memcached-1.1.0-sources.zip`提供的源码实现了一个Hibernate二级缓存提供者,它将Hibernate的查询结果缓存在Memcached中,当再次进行相同查询时,可以直接从缓存中获取数据,避免了重复的数据库查询。...

    Java系统分布式缓存PPT

    常见的分布式缓存系统如Redis、Memcached等,它们支持键值对存储,提供了高并发、低延迟的数据访问能力。此外,本章可能还会涉及一致性哈希算法,它是分布式缓存中解决数据分片和负载均衡的关键技术。 “分布式缓存...

    分布式缓存系统Memcached学习心得.zip

    分布式缓存系统在现代Web开发中扮演...总的来说,分布式缓存系统Memcached是现代Web应用中不可或缺的工具。通过深入学习和实践,我们可以充分利用其优势,优化应用性能,减轻数据库压力,从而提供更高效、稳定的服务。

    Nagios-Plugins-Memcached-0.02.tar.gz

    而Memcached则是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提高网站的响应速度。 "Nagios-Plugins-Memcached-0.02.tar.gz" 是一个针对Nagios的插件包,专门用于监控Memcached服务。这个压缩包...

    Linux运维-d8企业架构缓存中间件分布式memcached-01学习目标和内容04.mp4

    Linux运维-d8企业架构缓存中间件分布式memcached-01学习目标和内容04.mp4

    cachelot, 缓存库和分布式缓存服务器 Memcached兼容.zip

    cachelot, 缓存库和分布式缓存服务器 Memcached兼容 什么是Cachelot库如果应用程序需要一个以光速工作的LRU缓存。 这就是Cachelot库的意思。库与固定预先分配的内存一起工作。 你告诉内存大小,LRU缓存已经就绪。...

    simple-spring-memcached

    Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用来缓存数据库查询结果,减少对数据库的直接访问,从而提高系统的响应速度。它通过简单的键值对存储方式,实现数据的快速读取。 Simple-...

    simple-spring-memcached集成memcache

    而Memcached则是一种高性能、分布式内存对象缓存系统,常用于缓解数据库负载,提高应用程序性能。当我们需要在Spring应用中集成Memcached时,"simple-spring-memcached"(SSM)是一个很好的选择。这篇博客(链接:...

    php-memcached-demo.tar.gz

    PHP-Memcached-Demo项目,通过一个压缩包形式(php-memcached-demo.tar.gz)提供了一个实战示例,帮助开发者了解并掌握如何在PHP环境中使用Memcached作为缓存服务,以实现数据的快速访问和存储。本文将深入探讨这一...

Global site tag (gtag.js) - Google Analytics