2013-02-03 56 views
1

我需要为项目选择一个数据库。我认为我最好的选择是像MongoDB或Cassandra这样的NoSQL解决方案,但我没有这种系统的经验。选择正确的NoSQL数据库

该项目

的要求是:

  • 主表是一个聚合初期将有3至4分亿的记录,但是应该还有进一步增长。
  • 柱的数量并不是很大,大约200.
  • 数据会有些稀疏,但不是很多,所以传统模型是不可能的。
  • 架构更新将每周进行一次。
  • 插入不会很频繁,大概不会超过一天一百万。
  • 对于记录的10%到20%,更新会非常频繁,最多每隔几分钟。
  • 整个集合的查询将非常频繁。所有查询都将覆盖多个属性并使用范围值。一般来说,它们将具有以下形式:select * from huge_table其中字符串('x','y')和整数= 1,货币介于1,05和100,00之间,日期> 2012-01-01 00:00: 00。
  • 更新和查询不需要同时处理。几分钟后罗马就会先处理一批插入和更新,然后再进行一批查询。
  • 没有要求支持复杂的数据类型。
  • SQL支持不是必需的。
  • 交易不是必需的。
  • 数据丢失是不可取的,但不是灾难性的。
  • 系统将在单个数据中心实施。
  • 硬件成本本身并不是一个问题,但我需要能够逐渐扩展硬件。因此,运行在或多或少标准Web服务器上的系统是最好的。如果它可以在虚拟机上运行,​​甚至更好。

基于这些要求,我倾向于MongoDB。但我很犹豫。一旦我做出选择,我会长期坚持下去。 任何意见是非常感谢。

+3

如果不建立一些POC,请不要作出选择,尤其是考虑到您以后无法切换的评论。这个问题并不适合StackOverflow。 – WiredPrairie

+0

^这么多。如果没有适当的POC和eval,就只能乞求失败。 – moodywoody

+0

每5分钟更换3亿条记录中的10%,每秒会发生100,000次更改。你确定你的号码是真实的吗? – Theo

回答

2

通常你的问题会被归类为过于主观,实际上也是这样。不过,我会回答一个问题,不管这个问题希望能帮助你一点。

我的回答是基于MongoDB的,因为那是我最了解的技术。

主表是一个总计,最初将有3到4亿条记录,但应该有进一步增长的空间。

这对于任何数据库都很容易,让我知道当你开始获得数十亿行时。

对于记录的10%到20%,最多每隔几分钟更新将非常频繁。

我不知道该怎么查询,如果你打算增加文件大小急剧使用这些更新,那么除非你用你的文档字段或http://docs.mongodb.org/manual/reference/command/collMod/#usePowerOf2Sizes的预页头,这将保证你会发现碎片,你会但是执行的MongoDB在记录对象中总是有足够的连续可用空间来更新它,而无需移动它。

这是因为与许多其他技术(如SQL)不同,MongoDB不会在磁盘上分割记录对象,而是将文档全部放在一个连续的空间块中。

如果您希望了解更多关于MongoDBs存储机制如何影响数据集性能的信息,您可以查看以下演示文稿:http://www.10gen.com/presentations/storage-engine-internals,我仍然认为这是最具权威性的解释。

对整个集合的查询将非常频繁。所有查询都将覆盖多个属性并使用范围值。一般来说,它们将具有以下形式:select * from huge_table其中字符串('x','y')和整数= 1,货币介于1,05和100,00之间,日期> 2012-01-01 00:00: 00。

MongoDB具有良好的“缓存”数据机制。我将缓存放入语音标记,因为MongoDB在技术上没有查询缓存,但虚拟内存映射中的所有数据(不是RAM映射,完全不同)。

当您定期执行相同的查询时,您会发现您的工作集http://en.wikipedia.org/wiki/Working_set定义了在特定间隔内需要多少数据才能执行MongoDB的高性能操作,完全在RAM中。这意味着所有的查询都可以直接从RAM中提供,使得它们超级快速(例如像Redis和Memcached的技术来自RAM的服务)。

没有要求支持复杂的数据类型。

的MongoDB并不需要复杂的数据类型,但它们可以被添加,如果你发现了以后,你真正想要他们:http://docs.mongodb.org/manual/core/document/#bson-type-considerations但它是(因为该网页说的)好随身携带的MongoDB提供到字段类型考虑。一个很好的例子是,在MongoDB中使用内建的date类型是明智的做法,这样您可以在查询中轻松访问日期操作符。

数据丢失是不可取的,但不是灾难性的。

MongoDB中被认为是从次级和无论是在与外部的单个数据中心(http://docs.mongodb.org/manual/replication/)的其它副本成员读取时具有强一致性(不像SQL不立即虽然),补充说,它是能够做复制品的ACKED写入也是如此(这增加了强大的一致性),如果一个节点发生故障并自动进行故障转移,那么这非常有用,这样可以减少数据集受到负面影响的机会(例如,您可能会遇到更多问题最终一致的环境,如在这种特殊情况下的CouchDB)。

补充说,MongoDB确实有一个日志和操作日志,以帮助它保持数据更好,干净,正确归档。

硬件成本本身并不是一个问题,但我需要能够逐渐扩展硬件。因此,运行在或多或少标准Web服务器上的系统是最好的。如果它可以在虚拟机上运行,​​甚至更好。

MongoDB能够在商品硬件上运行,所以这应该不成问题。

这应该提供一些指针让你继续。

0

检查couchbase(http://www.couchbase.com/)。研究结束后,我刚开始玩这个引擎。它看起来非常好(灵活性,可扩展性,API等),并且可以在几分钟内完成安装。