【问题标题】:Write heavy, replicated, bigger-than-memory key-value store编写重的、复制的、大于内存的键值存储
【发布时间】:2012-11-18 20:38:16
【问题描述】:

我正在寻找可以从 EC2 实例中使用的键值存储。

  • item 只是一个非结构化字符串,不需要索引
  • 项目大小高达 ~5MB,但通常低于 10kB
  • 大量写入
  • 读取不需要很快,可以把memcache放在前面缓存经常需要的读取
  • 数据太大而无法放入内存
  • 最终的一致性很好
  • 需要可以从多台机器访问的守护进程

理想情况下,AWS 托管的东西会是完美的,但是:

  • 由于写入过多,S3 不适合
  • SimpleDB/DynamoDb 不适合,因为项目大小限制并且不需要索引

由于市场上有很多关键价值商店,因此很难选择最好的。你会推荐哪一个?

【问题讨论】:

  • @caius.howcroft:你这是什么意思?

标签: amazon-web-services nosql key-value-store


【解决方案1】:

我为我的用例找到了完美的解决方案:memcachedb

它不做花哨的文档/索引,它只是一个简单的键值存储。

不过我还没有进行任何性能测试。

编辑:

由于复制问题,我们删除了 memcachedb。相反,我们现在运行 mongodb。 Mongodb 通常需要更多的磁盘空间和更多的资源。但是副本集工作非常可靠且易于设置。

【讨论】:

  • 您可以使用 Couchbase,它允许您使用 memcached 协议非常快速地访问密钥。 Couchbase 允许您存储与密钥关联的任何类型的内容。 Couchbase 2.0 是一个面向文档的数据库,但您可以将任何类型的二进制内容存储到其中。看看这篇文章,它会帮助你看到一些关键的好处:couchbase.com/memcached
  • @TugGrall:我认为这不适用于我的用例,因为数据太大而无法放入内存。
  • 如果您选择“Couchbase Bucket”,它会在必要时自动将内容存储在磁盘上:couchbase.com/docs/couchbase-manual-1.8/…
  • @TugGrall:听起来很有趣并且符合我的用例。你能为此创建一个anwser吗?
【解决方案2】:

也许你应该试试 mongodb:
http://www.mongodb.org/display/DOCS/Amazon+EC2

快速入门:
http://www.mongodb.org/display/DOCS/Amazon+EC2+Quickstart

10gen 的免费课程和视频演示:
http://www.10gen.com/presentations/nyc-meetup-group/mongodb-and-ec2-a-love-story

其他键值存储:
http://google-opensource.blogspot.com/2011/07/leveldb-fast-persistent-key-value-store.html

关于 Riak 及其存储,尤其是 bitcask 和 innostore 的评论:
http://basho.com/blog/technical/2011/07/01/Leveling-the-Field/

RaptorDB:使用 b+tree 或 MurMur 哈希索引的极小尺寸和快速嵌入式、noSql、持久字典数据库。它主要用于存储 JSON 数据(参见我的 fastJSON 实现),但可以存储您提供的任何类型的数据。

HamsterDB:用 C++ 编写的令人愉快的引擎,给我留下了深刻的印象 当我使用 Aarons Watters 代码进行索引时,它的速度非常快。 (RaptorDB 现在把它活生生吃掉了……咳咳!) 600KB 相当大 64位版本。

Esent PersistentDictionary:CodePlex 上的一个项目,它是 另一个在内置项目上实现托管包装器的项目 Windows esent 数据存储引擎。字典表现不错 在索引了 40,000 个项目后呈指数下降,而索引文件只是 生长在引导键上。显然在与项目业主交谈后, 目前这是一个已知问题。

东京/京都内阁:C++ 密钥存储的实现非常快。东京内阁是 b+tree 索引器,Kyoto cabinet 是 MurMur2 哈希索引器。

4aTech Dictionary:这是 CodeProject 上的另一篇文章 同样的事情,网站上的商业版本是巨大的(450KB) 并且在 50,000 个项目后在 guid 键上表现不佳 索引。

BerkeleyDB:Oracle 旗下所有数据库的鼻祖 并且有 3 种风格,C++ 密钥库、Java 密钥库和 XML 数据库。

(引用来源:http://www.codeproject.com/Articles/190504/RaptorDB

【讨论】:

  • 我考虑过 mongodb - 但它在我看来设计过度:我不需要文档存储、索引、map reduce 等。
  • 可能是这里提到的 Redis 之类的:stackoverflow.com/questions/1733619/writing-a-key-value-store
  • 我需要一台服务器。 Redis 无法工作,因为我的数据太大而无法存储在内存中。
  • 一些关于 leveldb 和其他存储的 cmets(riak 使用它作为每个节点的存储):google-opensource.blogspot.com/2011/07/…
  • MongoDB 不是为大量写入而设计的——更多的是用于大量读取和高级 json 查询。
【解决方案3】:

似乎是HBase 的完美用例。它提供了出色的写入吞吐量,尤其是在您的插入键有些随机的情况下。 HBase 通常不被宣传为 K/V 存储,但它应该可以正常工作。 AWS documentation 提供了一些您可能想要仔细查看的用例。缺点是 HBase 可以做的不仅仅是 K/V,所以它可能比你需要的更复杂(和复杂)。

【讨论】:

    【解决方案4】:

    Couchbase 听起来很适合您的需求。这很像 memcached 和磁盘存储。

    优点:

    • 这是一个键/值数据库。你可以存储任何你想要的二进制 blob。从 2.0 版开始,它支持将数据存储为 json 并在其上运行一些查询和 map/reduce。但是,如果您不需要它,将其用作键/值效果很好。

    • 在我尝试过的所有 NoSQL 数据库中,它是最快的。这可能是因为您的写入没有立即提交到磁盘。相反,一旦在集群中复制写入,您就会得到确认。数据异步写入磁盘。因此,一个潜在的缺点是,如果您的所有节点同时崩溃(例如,您的数据中心断电),您可能会丢失数据。根据应用程序,这可能是也可能不是问题(如果您的整个集群出现故障,您可能会遇到更大的问题)。

    • 根据我的经验,它是可靠的。如果一个节点出现故障,集群会继续工作,并且很容易进行故障转移。添加新节点也很容易。

    • 数据不必适合内存。它被存储在磁盘上,并根据需要进行页面调入和调出。

    • 管理界面非常非常好。它有漂亮的实时图表来监控集群。

    • 它向后兼容 memcached 协议。如果您已经有使用 memcached 的代码,那么让它使用 Couchbase 会非常简单。

    缺点:

    • 该产品还有些年轻,因此文档和支持工具有些缺乏。这有时会有点烦人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2014-05-02
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多