9

是否有一个键值存储可以为我提供以下信息:

  • 允许我简单地添加和删除节点,并将自动重新分配数据
  • 允许我删除节点,但仍然有 2 个额外的数据节点来提供冗余
  • 允许我存储最大 1GB 的文本或图像
  • 可存储高达 100TB 数据的小型数据
  • 快速(因此将允许在其上执行查询)
  • 让所有这些对客户透明
  • 适用于 Ubuntu/FreeBSD 或 Mac
  • 免费或开源

我基本上想要一些我可以使用“单一”的东西,而不必担心拥有 memcached、一个数据库和几个存储组件,所以是的,我确实想要一个你可以说的数据库“银弹”。

谢谢

祖拜尔

到目前为止的答案:BackBlaze 之上的 MogileFS - 据我所知,这只是一个文件系统,经过一些研究,它似乎只适用于大图像文件

东京暴君 - 需要光云。当您添加新节点时,这不会自动缩放。我确实对此进行了研究,但对于适合单个节点的查询似乎非常快

Riak - 这是我自己调查的一个,但我还没有任何结果

Amazon S3 - 有人在生产中使用它作为他们唯一的持久层吗?从我所见,它似乎用于存储图像,因为复杂的查询太贵了

@shaman 建议 Cassandra - 绝对是我正在研究的一个

到目前为止,似乎没有满足我提到的标准的数据库或键值存储,即使在提供 100 分的赏金之后,问题也没有得到回答!

4

12 回答 12

17

你对开源软件的要求太多了。

如果您有几十万美元的预算来购买一些企业级软件,那么有几个解决方案。开箱即用没有什么可以满足您的需求,但有些公司的产品与您正在寻找的产品相近。

“快速(因此将允许在其上执行查询)”

如果您有一个键值存储,那么一切都应该非常快。然而,问题变成了如果没有构建在键值存储之上的本体或数据模式,您最终将针对每个查询遍历整个数据库。您需要一个包含要存储的每种“类型”数据的键的索引。

在这种情况下,您通常可以对大约 15,000 台机器并行执行查询。瓶颈在于便宜的硬盘驱动器每秒可进行 50 次寻道。如果您的数据集适合 RAM,那么您的性能将非常高。但是,如果键存储在 RAM 中但没有足够的 RAM 来存储值,则系统将在几乎所有键值查找时转到磁盘。每个键都位于驱动器上的随机位置。

这将您限制为每台服务器每秒 50 次键值查找。而当键值对存储在 RAM 中时,在商用硬件(例如 Redis)上每台服务器每秒执行 10 万次操作并不罕见。

然而,串行磁盘读取性能非常高。我在串行读取时寻求驱动器达到 50 MB/s (800 Mb/s)。因此,如果您将值存储在磁盘上,则必须构建存储结构,以便可以串行读取需要从磁盘读取的值。

那就是问题所在。除非您将键值对完全存储在 RAM 中(或 RAM 中的键与 SSD 驱动器上的值),否则您无法在 vanilla 键值存储上获得良好的性能,或者如果您在密钥,然后将数据聚集在磁盘上,以便可以通过串行磁盘读取轻松检索给定类型的所有密钥。

如果一个键有多种类型(例如,如果您在数据库中有数据类型继承关系),那么该键将是多个索引表的一个元素。在这种情况下,您将不得不进行时空权衡来构造这些值,以便可以从磁盘中连续读取它们。这需要存储键值的冗余副本。

您想要的将比键值存储更高级,特别是如果您打算进行查询。然而,存储大文件的问题不是问题。假装您的系统最多可以键入 50 兆。然后,您只需将 1 gig 文件分解为 50 meg 段,并为每个段值关联一个键。使用简单的服务器可以直接将您想要的文件部分转换为键值查找操作。

实现冗余的问题更加困难。很容易为服务器“源代码”或“部分文件”键值表,以便在特定服务器死机时,可以以线速 (1 Gb/s) 将服务器的数据重建到备用服务器上。通常,您可以使用“心跳”系统检测服务器死亡,如果服务器在 10 秒内没有响应,则会触发该系统。甚至可以针对部分文件编码的键值表进行键值查找,但这样做效率低下,但仍然为您提供了服务器故障事件的备份。一个更大的问题是,几乎不可能使备份保持最新,并且数据可能已经存在 3 分钟。如果您进行大量写入,备份功能将引入一些性能开销,

我不是在故障模式下维护数据库一致性和完整性约束的专家,所以我不确定这个要求会带来什么问题。如果您不必担心这一点,它会大大简化系统的设计及其要求。

快速(因此将允许在其上执行查询)

首先,当您的数据库这么大时,忘记连接或任何比 n*log(n) 扩展速度更快的操作。您可以做两件事来替换通常用连接实现的功能。您可以对数据进行结构化以便不需要进行连接,也可以“预编译”正在执行的查询并进行时空折衷并预先计算连接并将它们存储起来以供提前查找.

对于语义网络数据库,我认为我们将看到人们预先编译查询并进行时间-空间权衡,以便在即使是中等大小的数据集上也能获得不错的性能。我认为这可以由数据库后端自动和透明地完成,而不需要应用程序程序员的任何努力。然而,我们才刚刚开始看到企业数据库为关系数据库实施这些技术。据我所知,没有开源产品能做到这一点,如果有人试图为水平可扩展数据库中的链接数据这样做,我会感到惊讶。

对于这些类型的系统,如果您有额外的 RAM 或存储空间,则出于性能原因,最好使用它来预先计算和存储常见子查询的结果,而不是为键值存储添加更多冗余。预先计算结果并按您要查询的键排序,以将 n^2 连接转换为 log(n) 查找。任何比 n*log(n) 扩展性差的查询或子查询都需要执行其结果并将其缓存在键值存储中。

如果您正在执行大量写入,则缓存的子查询将比它们被处理的速度更快地失效,并且没有性能优势。处理缓存子查询的缓存失效是另一个棘手的问题。我认为一个解决方案是可能的,但我还没有看到它。

欢迎来到地狱。您不应该期望再过 20 年才能免费获得这样的系统。

到目前为止,似乎没有满足我提到的标准的数据库或键值存储,即使在提供 100 分的赏金之后,问题也没有得到回答!

你在祈求奇迹。等待 20 年,直到我们拥有开源奇迹数据库,否则您应该愿意为根据您的应用程序需求定制的解决方案付费。

于 2010-08-29T08:52:56.420 回答
5

Amazon S3 是一种存储解决方案,而不是数据库。

如果您只需要简单的键/值,那么最好的选择是将 Amazon SimpleDB 与 S3 结合使用。大文件存储在 S3 上,而用于搜索的元数据存储在 SimpleDB 中。这为您提供了一个可直接访问 S3 的水平可扩展键/值系统。

于 2010-01-29T07:39:21.780 回答
4

还有另一种解决方案,这似乎正是您正在寻找的:Apache Cassandra 项目:http: //incubator.apache.org/cassandra/

目前 twitter 正在从 memcached+mysql 集群切换到 Cassandra

于 2010-02-26T13:39:32.087 回答
4

HBase 和 HDFS 一起满足了这些要求中的大部分。HBase 可用于存储和检索小对象。HDFS 可用于存储大型对象。HBase 压缩小对象并将它们作为较大的对象存储在 HDFS 上。速度是相对的 - HBase 在从磁盘随机读取时不如 mysql 快(例如) - 但从内存中读取的速度非常快(类似于 Cassandra)。它具有出色的写入性能。HDFS 是底层存储层,对丢失多个节点具有完全的弹性。它还可以跨机架复制,并允许进行机架级维护。这是一个具有 Apache 许可证的基于 Java 的堆栈 - 几乎可以运行大多数操作系统。

该堆栈的主要弱点是没有达到最佳随机磁盘读取性能和缺乏跨数据中心支持(这是一项正在进行的工作)。

于 2010-04-18T17:51:08.210 回答
2

我可以建议您两种可能的解决方案:

1)购买亚马逊的服务(亚马逊S3)。对于 100 TB,每月需要花费 14 512 美元。
2)更便宜的解决方案:

构建两个自定义 backblaze 存储 pod(链接)并在其上运行 MogileFS。

目前我正在研究如何使用类似的解决方案存储 PB 级的数据,所以如果你发现一些有趣的东西,请发布你的笔记。

于 2010-01-21T10:27:18.197 回答
2

看看东京暴君。它是一个非常轻量级、高性能的复制守护程序,将东京内阁键值存储导出到网络。我听说过它的好消息。

于 2010-01-22T10:26:30.070 回答
2

从我在您的问题中看到的伏地魔项目似乎是最接近的一个。看看他们的设计页面

我看到的唯一问题是它将如何处理大文件,并且根据这个线程,事情并不全好。但是你总是可以很容易地使用文件来解决这个问题。最后 - 这是文件系统的确切目的。查看文件系统的维基百科列表- 列表非常庞大。

于 2010-01-29T08:30:59.120 回答
1

您可能想看看MongoDB

据我所知,您正在寻找数据库/分布式文件系统组合,这可能很难甚至不可能找到。

你可能想看看像MooseFSGluster这样的分布式文件系统,并将你的数据保存为文件。两个系统都是容错和分布式的(您可以根据需要放入和取出节点),并且对客户端都是透明的(构建在 FUSE 之上)——您使用的是简单的文件系统操作。这包括以下特征:1)、2)、3)、4)、6)、7)、8)。我们将 MooseFS 用于存储大约 1.5 PB 的数字电影存储,并且上传/下载速度与网络设置允许的一样快(因此性能取决于 I/O,而不取决于协议或实现)。您的列表中不会有查询(功能 5)),但您可以将此类文件系统与 MongoDB之类的文件系统结合使用甚至像 Lucene(它有聚集索引)这样的搜索引擎来查询存储在文件系统中的数据。

于 2010-01-28T21:23:28.420 回答
1

祖拜尔,

我正在开发一个迄今为止比其他任何东西都快的键值存储。

它(尚未)使用复制,缺少您的 2 个首要要求,但这个问题启发了我 - 谢谢!

否:允许我简单地添加和删除节点,并将自动重新分配数据
否:允许我删除节点,但仍有 2 个额外的数据节点以提供冗余
ok:允许我存储最大 1GB 大小的文本或图像(是:无限制)
ok:可以存储高达 100TB 的小数据(是:无限制)
ok:快速(因此将允许在其上执行查询)(是:比 Tokyo Cabinet 的 TC-FIXED 阵列更快)
ok:使所有这些对客户端透明(是:集成到 Web 服务器)
ok:适用于 Ubuntu/FreeBSD 或 Mac (是:Linux)
ok:免费或开源(是:免费软件)

除了优于哈希表和 B 树的单线程性能之外,这个 KV 存储是我所知道的唯一一个“无等待”(不阻塞,也不延迟任何操作)。

于 2011-06-07T14:44:00.037 回答
1

MarkLogic 正朝着这个方向发展。虽然不是免费的...

于 2011-07-23T23:37:57.943 回答
1

除了其他人提到的 - 你可以看看 OrientDB - http://code.google.com/p/orient/一个看起来很有前途的文档和 K/V 存储。

于 2011-10-04T22:43:26.140 回答
1

查看大沙发。它是 CouchDB,但针对集群进行了优化(以及所有适合集群的大数据问题)。正如我们所说,BigCouch 正在被 Cloudant的人们合并到 CouchDB 项目中,其中许多人是 CouchDB 的核心提交者。

您的要求概述:

允许我简单地添加和删除节点,并将自动重新分配数据

允许我删除节点,但仍然有 2 个额外的数据节点来提供冗余

是的。BigCouch 使用 Dynamo 的 Quorum 概念来设置多少个节点保留多少个数据副本。

允许我存储最大 1GB 的文本或图像

是的。就像 CouchDB 一样,您可以将任意大小的 blob(例如文件)流式传输到数据库。

可存储高达 100TB 数据的小型数据

是的。构建 BigCouch 的团队之所以这样做,是因为他们面临着一个每秒生成 PB 级数据的系统。

快速(因此将允许在其上执行查询)

是的。查询由 MapReduce 在O(log n) 时间内完成

让所有这些对客户透明

适用于 Ubuntu/FreeBSD 或 Mac

免费或开源

是的!在 Apache 2.0 许可下开源。默认安装说明适用于 Debian 系统,例如 Ubuntu。

于 2013-05-31T11:18:14.610 回答