`
GhostWolf
  • 浏览: 312992 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Memcache存储大数据的问题

 
阅读更多

转发&mark :http://blog.csdn.net/hguisu/article/details/6163621

 

Memcache存储大数据的问题   huangguisu

      Memcached存储单个item最大数据是在1MB内,如果数据超过1M,存取set和get是都是返回false,而且引起性能的问题。

我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql select查询里面占了30%,而且我们排行榜每小时更新一次,所以必须对数据做缓存。为了清除缓存方便,把所有的用户的数据放在同一key中,由于memcached:set的时候没有压缩数据。在测试服测试的时候,没发现问题,当上线的时候,结果发现,在线人数刚刚490人的时候,服务器load average飘到7.9。然后我们去掉缓存,一下子就下降到0.59。

 

所以Memcahce不适合缓存大数据,超过1MB的数据,可以考虑在客户端压缩或拆分到多个key中。大的数据在进行load和uppack到内存的时候需要花很长时间,从而降低服务器的性能。

Memcached支持最大的存储对象为1M。这个值由其内存分配机制决定的。

memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行mallocfree来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题.

今天(2012-03-16)我们重新测试了memcached ::set的数据大小。可能是我们用php的memcached扩展是最新版,set数据的时候是默认压缩的。set 数据:

 

  1. $ac = new memcahed();  
  2. $data = str_repeat('a', 1024* 1024); //1M的数据  
  3. $r  =  $ac->set('key', $data, 9999);  
  4. //或者  
  5. $data = str_repeat('a', 1024* 1024*100);//100M的数据  
  6. $r  =  $ac->set('key', $data, 9999);  

 

 

 

不论是1M的数据还是100M的数据,都能set成功。后来我发现,memcachedset数据的时候是默认压缩的。由于这个这个是重复的字符串,压缩率高达1000倍。因此100M的数据压缩后实际也就100k而已。

当我设置:

 

  1. $ac->setOption(memcahed::OPT_COMPRESSION,0); //不压缩存储数据。  
  2. $data = str_repeat('a', 1024* 1024); //1M数据  
  3. $r  =  $ac->set('key', $data, 9999);//1M的数据set不成功。  

 

 

 

也就是说memcached server不能存储超过1M的数据,但是经过客户端压缩数据后,只要小于1M的数据都能存储成功。

memcached相关知识:

 

1、memcached的基本设置 
1)启动Memcache的服务器端 

# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d选项是启动一个守护进程, 
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, 
-u是运行Memcache的用户,我这里是root, 
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200, 
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口, 
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定, 
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

2)如果要结束Memcache进程,执行:

# kill `cat /tmp/memcached.pid`

哈希算法任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该

段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。

 

2、适用memcached的业务场景?

1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读操作,那么memcached可以显著地减小数据库负载。

2)如果数据库服务器的负载比较低但CPU使用率很高,这时可以缓存计算好的结果( computed objects )和渲染后的网页模板(enderred templates)。

3)利用memcached可以缓存session数据、临时数据以减少对他们的数据库写操作。

4)缓存一些很小但是被频繁访问的文件。

5)缓存Web 'services'(非IBM宣扬的Web Services,译者注)或RSS feeds的结果.。

3、不适用memcached的业务场景?

 

1)缓存对象的大小大于1MB

Memcached本身就不是为了处理庞大的多媒体(large media)和巨大的二进制块(streaming huge blobs)而设计的。

2)key的长度大于250字符

3)虚拟主机不让运行memcached服务

     如果应用本身托管在低端的虚拟私有服务器上,像vmware, xen这类虚拟化技术并不适合运行memcached。Memcached需要接管和控制大块的内存,如果memcached管理      的内存被OS或 hypervisor交换出去,memcached的性能将大打折扣。

4)应用运行在不安全的环境中

Memcached为提供任何安全策略,仅仅通过telnet就可以访问到memcached。如果应用运行在共享的系统上,需要着重考虑安全问题。

5)业务本身需要的是持久化数据或者说需要的应该是database

 

4、 不能能够遍历memcached中所有的item

     这个操作的速度相对缓慢且阻塞其他的操作(这里的缓慢时相比memcached其他的命令)。memcached所有非调试(non-debug)命令,例如add, set, get, fulsh等无论

memcached中存储了多少数据,它们的执行都只消耗常量时间。任何遍历所有item的命令执行所消耗的时间,将随着memcached中数据量的增加而增加。当其他命令因为等待(遍历所有item的命令执行完毕)而不能得到执行,因而阻塞将发生。

5、  memcached能接受的key的最大长度是250个字符

memcached能接受的key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制。如果使用的Memcached客户端支持"key的前缀"或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。推荐使用较短的key,这样可以节省内存和带宽。

6、  单个item的大小被限制在1M byte之内

因为内存分配器的算法就是这样的。

详细的回答:

1)Memcached的内存存储引擎,使用slabs来管理内存。内存被分成大小不等的slabs chunks(先分成大小相等的slabs,然后每个slab被分成大小相等chunks,不同slab的chunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增长,直到达到最大的可能值。如果最小值为400B,最大值是1MB,因子是1.20,各个slab的chunk的大小依次是:

slab1 - 400B;slab2 - 480B;slab3 - 576B ...slab中chunk越大,它和前面的slab之间的间隙就越大。因此,最大值越大,内存利用率越低。Memcached必须为每个slab预先分配内存,因此如果设置了较小的因子和较大的最大值,会需要为Memcached提供更多的内存。

2)不要尝试向memcached中存取很大的数据,例如把巨大的网页放到mencached中。因为将大数据load和unpack到内存中需要花费很长的时间,从而导致系统的性能反而不好。如果确实需要存储大于1MB的数据,可以修改slabs.c:POWER_BLOCK的值,然后重新编译memcached;或者使用低效的malloc/free。另外,可以使用数据库、MogileFS等方案代替Memcached系统。

7、  memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs?

实际上,这是一个编译时选项。默认会使用内部的slab分配器,而且确实应该使用内建的slab分配器。最早的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。

8、memcached对item的过期时间有什么限制?

item对象的过期时间最长可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态,这是一个简单但obscure的机制。

9、什么是二进制协议,是否需要关注?

二进制协议尝试为端提供一个更有效的、可靠的协议,减少客户端/服务器端因处理协议而产生的CPU时间。根据Facebook的测试,解析ASCII协议是memcached中消耗CPU时间最多的

环节。

10、 memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs?

实际上,这是一个编译时选项。默认会使用内部的slab分配器,而且确实应该使用内建的slab分配器。最早的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。

11、memcached是原子的吗?

所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的。然是,命令序列不是原子的。如果首先通过get命令获取了一个item,修改了它,然后再把它set回memcached,系统不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果使用gets命令查询某个key的item,memcached会返回该item当前值的唯一标识。如果客户端程序覆写了这个item并想把它写回到memcached中,可以通过cas命令把那个唯一标识一起发送给memcached。如果该item存放在memcached中的唯一标识与您提供的一致,写操作将会成功。如果另一个进程在这期间也修改了这个item,那么该item存放在memcached中的唯一标识将会改变,写操作就会

失败。

分享到:
评论

相关推荐

    大数据技术分享.pptx

    HBase的存储结构由RegionServer、Region、Memcache、Log和Store组成。HBase的数据存储方式不同于传统的关系数据库,它是基于列的而不是基于行的模式,这使得HBase在处理大数据时具有很高的效率。 数据分析 在数据...

    大商创 最新V1.2大数据版多用户商城系统,PHP源码 支持多城市+多仓库+商家入驻+wap端+Memcache+OSS存储功能

    大商创V1.2版本增加了大数据版功能:由“Web服务器群”——“SLB负载均衡-Memcache缓存技术-数据库群-Oss云存储技术”的闭环式框架组成;从“入口层—服务层—数据层”三个层面,减少服务器负载,从而平台更加稳定。...

    memcache php2.5专用 windows

    Memcache是一种基于内存的分布式缓存系统,它可以存储数据对象(如数据库查询结果),以减少对数据库的直接访问,从而提高应用的响应速度。Memcache的特点包括高速、轻量级、无持久化存储,适合处理大量的小数据项。...

    基于5G与大数据技术的物联网智慧工地平台初探.pdf

    通过使用Memcache、Redis等缓存数据库,可以将热点数据和不常改变的数据存储于内存中,直接部署在Web前端与微服务之间。这样,能够快速读取数据,避免了频繁的硬盘读写操作,从而极大提升了系统的响应速度。 其次,...

    Memcache资料合集

    2. **避免大数据存储**:Memcache更适合存储小块数据,如用户会话信息,大文件应考虑其他存储方案。 3. **正确设置过期时间**:避免设置过长的过期时间,防止数据长时间未更新导致数据陈旧;也不要设置过短,频繁的...

    大数据应用案例 大数据培训视频教程-大数据高并发架构实战案例.docx

    同时,课程还会探讨利用Mysql解决Memcache的持久化问题,提高数据安全性。 最后,课程也关注大数据处理框架Hadoop的安装与配置。学员将学习如何同步SSH公钥,初始化Hadoop集群,格式化HDFS文件系统,以及使用jps等...

    UCloud云端大数据介绍.pdf

    本文将深入探讨UCloud云端大数据的核心特点、常见云端存储组件以及云端数据架构的设计理念。 首先,让我们回顾一下云计算的发展历程。从早期的呼叫中心、智能网系统,到互联网时代的存储和CDN服务,再到如今的全面...

    大数据运维工程师岗位的工作职责概述.docx

    大数据运维工程师是指负责大数据平台的运维、管理和维护的人员,需要具备软件系统部署、业务数据模型梳理、客户沟通、项目实施过程中遇到的质量问题和管理问题解决等多方面的能力。 职责1: * 负责软件系统的部署...

    包含Redis,memcache,encache的NoSQL入门

    NoSQL(Not Only SQL)是一种非关系型数据库技术,它在大数据、高并发场景下表现出色,具有灵活性、可扩展性和...在实践中不断探索,你会发现NoSQL数据库在解决现代互联网应用中的大数据问题时,拥有巨大的潜力和价值。

    大数据-数据库类型简介.docx

    1. **内存数据库**:如Memcache和Redis,它们将数据存储在内存中,提供高速的读写性能,适用于对响应时间要求极高的场景,如微博热搜排名或实时数据处理。 2. **列存储数据库**:如Vertica,它们优化了数据分析性能...

    php apache mysql memcache redis mongodb

    相比于Memcache,Redis提供了更丰富的数据结构(如字符串、哈希、列表、集合和有序集合),并支持持久化存储,使其在某些场景下更具优势。 **MongoDB**:MongoDB是一个基于分布式文件存储的NoSQL数据库,适用于处理...

    Memcache.pptx

    `Memcache.pptx`的主题聚焦于一个特定的问题:使用`spymemcached`客户端时遇到的`BufferOverflowException`。这个异常通常表明在尝试存储数据到Memcached时,分配的缓冲区空间不足以容纳数据,从而导致了溢出。 `...

    大数据运维工程师岗位的工作职责概述.pdf

    大数据运维工程师是大数据运维领域的专业人士,他们需要负责服务过程中问题现象和处理方案的收集撰写,形成知识库,并对知识库进行维护更新。下面是大数据运维工程师岗位的工作职责概述: 职责1 * 负责软件系统的...

    php5.3.* memcache-mongodb-redis dll扩展

    在PHP中,`memcache.dll`扩展允许开发者将数据存储在内存中,以提高数据访问速度,减轻对数据库的压力。它提供了简单的键值对存储方式,适用于快速存储和检索临时数据。 2. **MongoDB**:MongoDB是一个基于分布式...

    阿里云 专有云Enterprise版 云数据库 Memcache版 V3.1.0 产品简介 20171129.pdf

    在当今数字化时代,企业对于数据存储和处理的高效性有着越来越高的要求。为了满足这一需求,阿里云在2017年11月29日发布了专有云Enterprise版云数据库Memcache版V3.1.0,该产品以高性能和可靠性为核心,旨在为企业...

    深圳大数据行业java高级工程师岗位介绍JD模板.docx

    Oracle数据库系统用于存储海量数据,而Redis则作为高速缓存系统,提升数据读取效率。Spring和SpringBoot是广泛使用的Java开发框架,简化了应用开发和部署。Spring Cloud则提供了微服务架构的支持。MySQL和Oracle是...

    阿里云 专有云企业版 V3.8.2 云数据库 Memcache 版 产品简介 20200416.pdf

    总之,阿里云专有云企业版V3.8.2云数据库Memcache版是为企业级客户量身定制的高性能缓存解决方案,通过高效的内存存储和强大的管理功能,帮助企业应对大数据时代下的高并发挑战,提升应用性能,确保数据安全。...

    PHP数据库操作二:memcache用法分析

    - **php集成**: 在php.ini中配置`session.save_handler = memcache`和`session.save_path`来启用memcache存储session,可以实现多服务器session共享。 **使用与命令** - **memcache命令行**: 通过telnet或者专用...

    sgg-Redis6课件.docx

    大数据时代的到来带来了大量的数据,需要使用 NoSQL 数据库来解决数据存储和处理问题。HBase 和 Cassandra 是两种常用的 NoSQL 数据库,用于解决大数据量的问题。 8. 计算机存储单位 计算机存储单位有位(bit)、...

    Windows Azure多样化的存储服务

    Azure分布式缓存服务包括SQL缓存和Memcache服务,它可以帮助改善应用程序性能,缓存Session、页面信息、数据库信息等。通过缓存常用数据,可以显著减少数据库的访问次数,降低延迟,提供更高的可扩展性和性能。 ...

Global site tag (gtag.js) - Google Analytics