首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择MongoDb/CouchDb/RavenDb -性能和可伸缩性建议

选择MongoDb/CouchDb/RavenDb -性能和可伸缩性建议
EN

Stack Overflow用户
提问于 2011-03-10 10:29:16
回答 3查看 18.7K关注 0票数 45

我们正在研究一种带故障转移群集的文档db存储解决方案,用于一些读写密集型应用程序。

我们将有平均每秒40K并发写入到db (峰值可能高达70,000在此期间),并且可能有几乎相同数量的读取发生。

我们还需要一种机制,让数据库通知新写入的记录(某种db级别的触发器)。

在适当选择文件数据库和相关的容量规划方面,什么是好的选择?

更新的

关于预期的更多细节。

  • 平均来说,我们期望在3-4个数据库/文档集合中每秒有40,000 (40K)个插入数(新文档)。
  • 峰值可能高达12万(120 K)插入量。
  • 插入应该是立即可读的-几乎是实时的。
  • 除此之外,我们预计每秒将有大约5000次更新或删除。
  • 除此之外,我们还期望有500-600个并发查询访问数据。这些查询和执行计划在某种程度上是已知的,尽管这可能需要更新,例如,每周更新一次。
  • 系统应该支持存储端的故障转移群集。
EN

回答 3

Stack Overflow用户

发布于 2011-03-10 14:11:21

如果"20,000并发写入“意味着插入,那么我将选择CouchDB,并将"_changes”api用于触发器。但是有了20.000篇文章,你也需要一个稳定的切分。那你最好看看大沙发

如果"20.000“并发写包含”大部分“更新,我肯定会选择MongoDB,因为它的”更新到位“非常棒。但是,您应该手动处理触发器,但是使用另一个集合在适当的地方更新一个通用文档可以是一个方便的解决方案。再一次,切分要小心。

最后,我认为您不能选择一个只具有并发性的数据库,您需要规划api (如何检索数据),然后查看手头的选项。

票数 8
EN

Stack Overflow用户

发布于 2011-09-25 18:51:27

我推荐MongoDB。我的要求不像你的那么高,但相当接近。假设您将使用C#,我推荐正式的MongoDB C#驱动程序和打开SafeModeInsertBatch方法。它将按照您的文件系统所能处理的速度编写数据。几个注意事项:

  1. MongoDB做的是而不是支持触发器(至少是我上次检查的时候)。
  2. MongoDB在同步磁盘之前首先将数据缓存到内存中。如果您需要具有持久性的实时需求,则可能需要将fsync设置得更低。这将有一个重大的性能打击。
  3. C#驱动程序有点摇摇欲坠。我不知道是否只有我一个人,但每当我试图用它运行任何长时间运行的操作时,我都会遇到一些奇怪的错误。C++驱动程序比C#驱动程序(或其他任何驱动程序)要好得多,而且速度更快。

话虽如此,我也建议您研究一下RavenDB。它支持你所寻找的一切,除了我的生命之外,我无法让它在离蒙戈很近的地方演出。

唯一接近MongoDB的其他数据库是里克。它的默认Bitcask后端速度非常快,只要您有足够的内存来存储密钥空间,但我记得它不支持触发器。

票数 6
EN

Stack Overflow用户

发布于 2011-09-26 19:19:25

  • 我们正在研究一种带故障转移群集的文档db存储解决方案,用于某些读写密集型应用程序。

拥有谷歌LevelDB后端的Riak (这是谷歌的超棒基准 ),足够的缓存和固体磁盘非常快。当然,根据文档的结构及其大小(您提到了2KB ),您需要对其进行基准测试。请记住,如果您能够将数据碎片(从业务角度考虑),则不必在单个节点上保持40K/s的吞吐量。

LevelDB的另一个优点是数据压缩=>存储。如果存储不是一个问题,您可以禁用压缩,在这种情况下,LevelDB将按字面意思运行。

带有辅助标识的Riak允许您使您的数据结构像您喜欢的=>那样有文档化,您只索引那些您关心搜索的字段。

成功和无痛的Fail Over是里亚克的第二个名字。这里真的很亮。

  • 我们还需要一种机制,让db通知新写的记录(某种db级别的触发器)。

您可以在Riak中依赖pre-commitpost-commit hooks来实现这种行为,但是,作为任何触发器,它都伴随着价格=>性能/可维护性。

  • 插入应该是立即可读的-几乎是实时的。

Riak立即写入磁盘(没有异步MongoDB惊喜) => reliably readable。如果需要更好的一致性,可以为插入配置Riak的仲裁:例如,在将插入视为成功之前,应该返回多少节点

一般来说,如果fault tolerance / concurrency / fail over / scalability对您很重要,我会使用用Erlang编写的数据存储,因为Erlang已经成功地解决了这些问题很多年了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5258360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档