哪种NoSQL数据库适用于极高数据量?

4

我正在寻找适用于大量数据的NoSQL解决方案。目前我们将网页文本的缓存版本存储在MySQL中,但似乎数据库很快就会变得非常庞大。

我的要求是:

  • 持久性,刷新/写入时不能丢失数据
  • 读取非常快速,写入速度合理
  • 完全一致性复制
  • 最好是内存加上延迟磁盘写入

我正在研究:MongoDB、Redis、Raik和Cassandra。

哪种最符合我的要求?


6
问题是什么? - Zoidberg
1
我不能代表其他人,但MongoDB在这方面看起来不错——它尽可能多地使用内存(如果需要全耐久性,还有一个启动选项),但这对于一个缓存来说是奇怪的。它也具有非常快速的读取和封顶集合(非常适合缓存),随着新文档的插入而删除旧文档。 - Cameron
3
您希望写入时具有持久性,但磁盘写入应为最终结果?我认为通过使用复制,您可以取得很大进展,但我怀疑在没有磁盘写入的情况下无法实现100%的持久性。但是对于缓存来说,是否需要持久性呢? - TTT
4
你能否将"极高的容量"、"非常快的读取速度"和"相对较快的写入速度"进行量化? - DNA
1
@Cemeron,除非你使用Mongo的最新版本,否则如果发生停电或类似情况,你可能会将数据写入黑洞。 - synhershko
5个回答

5
我有使用Redis和MongoDB的经验,但不建议你在你的用例中使用它们。 Redis在所有方面都很棒,但由于它只支持RAM且没有集群功能(尽管正在开发中),所以它的扩展性不好。 MongoDB我再也不会用于任何需要除小型副本集之外的任何内容。
基本上,MongoDB还不成熟,完全不适合任何高容量、高性能需求。它有一个全局写锁,在磁盘刷新期间保持,这意味着性能可能根据您的操作而大幅度变化。实际上,它使增长文档的更新变得不可能,并且您需要非常小心地处理删除操作。说到删除,它会严重分片数据库,因此如果您进行了大量删除,则性能将受到影响。
1.8.0到1.8.1的分片是一场灾难。有些致命错误永远不应该出现在稳定版本中。配置没有正确刷新,很容易让您的数据库处于糟糕的状态,以至于块从未移出主分片。1.8.2解决了其中大部分问题,并且似乎更加稳定,但我一点也不信任分片实现。此外,即使一切正常,分片也很困难,选择自然分片键并不总是容易的,如果您不进行分片,将会带来很多麻烦。
MongoDB真的很容易使用,并且功能集非常好。文档、驱动程序和社区都很棒。 MongoDB可以作为MySQL的替代品,但不要将其用于需要扩展的任何内容。
我们目前正在考虑转向Cassandra。我发现dynamo模型(例如没有主节点;在任何地方写入和读取;只需添加节点即可增加群集)很有吸引力,而且特性基本上符合我们的要求。数据模型与MongoDB一样无架构,尽管略有限制(基本上可以选择一级或两级哈希)。我相信一旦您深入了解,社区就很好,但到目前为止,我发现很难找到解决常见问题的好信息,而且缺乏文档。从博客上找到的大多数信息都是一年前的,自那以后发生了很多事情(0.7和0.8似乎都是非常重要的更新),但大多数信息都是关于0.6的。从我迄今看到的情况来看,驱动程序也不太成熟或文档化,每个人似乎都在争论应该使用Thrift、Avro还是CQL(从0.6到0.7再到0.8都有所改变)。
Riak很有趣,原因与Cassandra相同,但对我们来说,纯键值存储不够用,我们需要能够在没有先读取的情况下进行更新。对于Riak来说,这是不可能的,因为它的值只是二进制数据。不过,这听起来对您来说可能不是问题。
HBase是另一个有竞争力的选择。由于涉及到多个不同的部分,如ZooKeeper和HDFS等,它似乎很难设置和运行。但是数据模型与Cassandra相似(列式,即一级哈希),这对我们来说效果很好,但对您可能并不重要。它看起来经过了试验和验证,但与MongoDB一样,您必须注意分片问题,必须考虑好键的设计,否则会遇到麻烦。
还有CouchDB、Project Voldemort以及无数其他可能的选择。我认为,如果你真的关心“极高的数据量”,那么选择就应该在Cassandra、Riak和HBase之间。如果纯键值存储不够用,就排除Riak。根据你对“完全一致的复制”的理解,Cassandra和Riak也不适合,因为有可能(不一定很大,而且可调整)读取到旧的值。
最终,你显然需要根据你自己特定的使用情况来尝试,所以你唯一需要从这个答案中获取的信息就是:不要去使用MongoDB。

MongoDB 的情况有没有改善?我们有类似的用例要处理。 - singhsumit
你对伯克利数据库有什么看法? - felipe
Java版的Berkeley DB有一些不错的功能,比如副本集,并且似乎很容易使用。我知道一些公司,比如Yammer,在其上构建了分片或分布式层并使其工作,但这比Cassandra已经做得更好需要更多的工作。 - Theo

4

将缓存版本存储在MemCache中而不是MySQL中,这将消除大部分写入操作。向MySQL写入是不好的,因为它会破坏查询缓存。当您将页面缓存到MemCache中时,您将减少对数据库的写入,并且读取压力也会减少。您可以缓存复杂查询的结果,或者按您喜欢的方式缓存整个页面。

也许它不会像Cassandra那样快,但与仅使用MySQL的当前情况相比,它将为您带来巨大的提升。而且您不必重写整个应用程序。


0

0

RavenDB可以每个节点存储高达16TB的数据,并且您可以有多个节点在一台机器上充当一个数据库,使用其内置的分片支持。这是最大的容量。

耐久性、速度和复制都在那里,而且也支持内存运行(但如果要扩展到每个节点的16TB,则不建议使用内存运行)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接