我有使用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。