44

我们正在为一些读/写密集型应用程序寻找具有故障转移集群的文档数据库存储解决方案。

我们将平均每秒有 40,000 个并发写入写入数据库(期间峰值可能高达 70,000) - 并且可能发生几乎相似数量的读取。

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

就正确选择文档数据库和相关容量规划而言,什么是好的选择?

更新

关于预期的更多细节。

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

4 回答 4

8

如果“20,000 个并发写入”意味着插入,那么我会选择 CouchDB 并使用“_changes”api 进行触发器。但是对于 20.000 次写入,您还需要一个稳定的分片。那你最好看看bigcouch

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

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

于 2011-03-10T14:11:21.740 回答
6

我会推荐 MongoDB。我的要求没有你的那么高,但已经相当接近了。假设您将使用 C#,我推荐官方 MongoDB C# 驱动程序和启用SafeMode的InsertBatch方法。它会以您的文件系统可以处理的最快速度写入数据。一些警告:

  1. MongoDB 不支持触​​发器(至少在我上次检查时)。
  2. MongoDB 最初将数据缓存到 RAM,然后再同步到磁盘。如果您需要具有持久性的实时需求,您可能希望将 fsync 设置得较低。这将对性能产生重大影响。
  3. C# 驱动程序有点不稳定。我不知道是不是只有我一个人,但是每当我尝试使用它运行任何长时间运行的操作时,我都会遇到奇怪的错误。C++ 驱动程序比 C# 驱动程序(或任何其他驱动程序)要好得多,实际上也更快。

话虽如此,我还建议您也研究一下 RavenDB。它支持您正在寻找的一切,但对于我的生活,我无法让它在靠近 Mongo 的任何地方执行。

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

于 2011-09-25T18:51:27.147 回答
4

Membase(以及即将发布的 Couchbase 服务器)将轻松满足您的需求并提供动态可扩展性(动态添加或删除节点)、带故障转移的复制。顶部的 memcached 缓存层将轻松处理 200k ops/sec,并且您可以线性扩展多个节点以支持将数据持久化到磁盘。

我们最近的一些基准测试显示了极低的延迟(大致相当于高吞吐量):http: //10gigabitethernet.typepad.com/network_stack/2011/09/couchbase-goes-faster-with-openonload.html

不知道拥有支持的企业级产品以及背后的工程和 QA 资源对您来说有多重要,但这也是可用的。

编辑:忘了提到已经有一个内置的触发接口,我们正在进一步扩展它以跟踪数据何时到达磁盘(持久)或被复制。

佩里

于 2011-09-27T21:50:57.063 回答
2
  • 我们正在寻找具有故障转移集群的文档数据库存储解决方案,用于一些读/写密集型应用程序

Riak 与谷歌的 LevelDB 后端 [这里是谷歌的一个很棒的基准测试],给定足够的缓存和固态磁盘非常快。根据文档的结构及其大小(您提到 2KB ),您当然需要对其进行基准测试。[请记住,如果您能够对数据进行分片(业务方面),则不必在单个节点上保持 40K/s 的吞吐量]

LevelDB 的另一个优势是数据压缩 => 存储。如果存储不是问题,您可以禁用压缩,在这种情况下,LevelDB 会飞起来。

具有二级索引的 Riak 允许您根据需要创建数据结构 => 您只索引那些您关心搜索的字段。

成功和无痛Fail Over是Riak 的第二个名字。这里真的很耀眼。

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

您可以依靠Riakpre-commitpost-commit hooks实现该行为,但同样,作为任何触发器,它伴随着价格 => 性能/可维护性。

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

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

一般来说,如果///fault tolerance对你很重要,我会选择用 Erlang 编写的数据存储,因为 Erlang 多年来成功地解决了这些问题。concurrencyfail overscalability

于 2011-09-26T19:19:25.367 回答