Memcache存储大数据的问题

Memcache存储大数据的问题  huangguisu

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

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

所以Memcahce不适合缓存大数据,超过1MB的数据,能够考虑在client压缩或拆分到多个key中。大的数据在进行load和uppack到内存的时候须要花非常长时间,从而减少server的性能。

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

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

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

$ac = new memcahed();
$data = str_repeat(‘a‘, 1024* 1024); //1M的数据
$r  =  $ac->set(‘key‘, $data, 9999);
//或者
$data = str_repeat(‘a‘, 1024* 1024*100);//100M的数据
$r  =  $ac->set(‘key‘, $data, 9999);

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

当我设置:

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

也就是说memcached
server不能存储超过1M的数据,可是经过client压缩数据后,仅仅要小于1M的数据都能存储成功。

memcached相关知识:

1、memcached的基本设置

1)启动Memcache的server端

# /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是监听的serverIP地址,假设有多个地址的话,我这里指定了server的IP地址192.168.0.200,

-p是设置Memcache监听的port,我这里设置了12000,最好是1024以上的port,

-c选项是最大执行的并发连接数,默认是1024,我这里设置了256,依照你server的负载量来设定,

-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

2)假设要结束Memcache进程,运行:

# kill `cat /tmp/memcached.pid`

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

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

2、适用memcached的业务场景?

1)假设站点包括了訪问量非常大的动态网页,因而数据库的负载将会非常高。因为大部分数据库请求都是读操作,那么memcached能够显著地减小数据库负载。

2)假设数据库server的负载比較低但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服务

假设应用本身托管在低端的虚拟私有server上,像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是memcachedserver端内部的限制。假设使用的Memcachedclient支持"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、什么是二进制协议,是否须要关注?

二进制协议尝试为端提供一个更有效的、可靠的协议,降低client/server端因处理协议而产生的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当前值的唯一标识。假设client程序覆写了这个item并想把它写回到memcached中,能够通过cas命令把那个唯一标识一起发送给memcached。假设该item存放在memcached中的唯一标识与您提供的一致,写操作将会成功。假设还有一个进程在这期间也改动了这个item,那么该item存放在memcached中的唯一标识将会改变,写操作就会

失败。

具体了解Memcached的内存分配机制:

http://cjjwzs.javaeye.com/blog/762453

时间: 2024-10-25 14:42:19

Memcache存储大数据的问题的相关文章

Memcache存储大数据的问题(大于1m)

Memcached存储单个item最大数据是在1MB内,如果数据超过1M,存取set和get是都是返回false,而且引起性能的问题. 我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql select查询里面占了30%,而且我们排行榜每小时更新一次,所以必须对数据做缓存.为了清除缓存方便,把所有的用户的数据放在同一key中,由于memcached:set的时候没有压缩数据.在测试服测试的时候,没发现问题,当上线的时候,结果发现,在线人数刚刚490人的时候,服务器load average飘

Memcache存储大量数据的问题

Memcache存储大数据的问题  huangguisu Memcached存储单个item最大数据是在1MB内,假设数据超过1M,存取set和get是都是返回false,并且引起性能的问题. 我们之前对排行榜的数据进行缓存.因为排行榜在我们全部sql select查询里面占了30%,并且我们排行榜每小时更新一次,所以必须对数据做缓存. 为了清除缓存方便,把全部的用户的数据放在同一key中,因为memcached:set的时候没有压缩数据.在測试服測试的时候,没发现问题.当上线的时候,结果发现.

海量数据查询关系型数据库存储大数据,要点就是:简单存储、分区分表、高效索引、批量写入

海量数据查询 https://www.cnblogs.com/nnhy/p/DbForBigData.html 相当一部分大数据分析处理的原始数据来自关系型数据库,处理结果也存放在关系型数据库中.原因在于超过99%的软件系统采用传统的关系型数据库,大家对它们很熟悉,用起来得心应手. 在我们正式的大数据团队,数仓(数据仓库Hive+HBase)的数据收集同样来自Oracle或MySql,处理后的统计结果和明细,尽管保存在Hive中,但也会定时推送到Oracle/MySql,供前台系统读取展示,生成

企业存储大数据的三种环境

大数据的部署实施需要结合具体的应用场景.实际上,企业大数据的存储处理可以用 “三只小猪盖房子”(分别使用稻草.木头和砖头)的故事来说明,这个故事能更形象地反映数据存储环境下与交付服务(成本)相对应的不同保护级别(完整性和可靠性). 财务数据.对外报告和法规遵从性数据需在“砖房”(BRICKS)环境中存储处理.这些数据需要可靠的硬件基础设施,并与其原始来源保持一致.企业中多个职能部门使用产品服务定价决策.销售业绩及分析以及至关重要的员工/管理层薪酬激励机制计算等财务数据,这是很常见的情况. 精心设

memcache 存储单个KEY,数据量过大的时候性能慢!以及简单的memcache不适合用到的场景。

今天有人问到我:memcache存储大数据量,10K,100K,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选项是启动一个守护

MySQL数据库如何解决大数据量存储问题

利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开关量历史数据表,这两张表字段设计的很简单(OrderNo,Value,DataTime).基本上每张表每天可以增加几千万条数据,我想问如何存储数据才能不影响检索速度呢?需不需要换oracle数据库呢?因为我是数据库方面的新手,希望可以说的详细一点,万分感谢!!?-0-#暂时可以先考虑用infobri

大数据存储的进化史 --从 RAID 到 Hdfs

我们都知道现在大数据存储用的基本都是 Hdfs ,但在 Hadoop 诞生之前,我们都是如何存储大量数据的呢?这次我们不聊技术架构什么的,而是从技术演化的角度来看看 Hadoop Hdfs. 我们先来思考两个问题. 在 Hdfs 出现以前,计算机是通过什么手段来存储"大数据" 的呢? 为什么会有 Hadoop Hdfs 出现呢? 在 Hdfs 出现以前,计算机是通过什么手段来存储"大数据" 要知道,存储大量数据有三个最重要的指标,那就是速度,容量,容错性.速度和容量

从技术架构的角度去丰富你的大数据知识

对于大数据的学习,很长一段时间,都觉得非常迷茫.不知道具体该学习什么!进而导致知识的知识点挺多,而自己所会的内容都不能够形成很好的体系,进而为自己的职场加分.而最近一直在学习相关大数的架构知识,进而具体到一个厂商.这样反而自己学的很快,总结一下前段时间的学习,温故而知新!!! 首先,大数据开始做为概念开始进入公众并在实际业务中落地是在13年.从一项技术的发展来看,这项技术会在18年形成一个很好的闭环.而在此期间,不管你是不是大数据的项目,在这五年内,只要冠以大数据名称都可以获益. 所以,大数据第

浅谈大数据

大数据概述 一.大数据是什么? 大数据目前没有一个严格的定义,但是我们可以举出很多具体的例子!例如:互联网上的网页数据.社交网站上的用户交互数据(如新浪微博).物联网中产生的活动数据(如智能家居).电话网络中的话单数据(如移动语音详单)等等都是大数据的具体表现. 二.大数据的三个特征 1.数据量大小–大容量 我们现在常说大数据,到底有多大呢?先看一组公式: 1024GB = 1TB;1024TB = 1PB;1024PB=1EB;1024EB=1ZB;1024ZB=1YB. 在淘宝上,每天新增的