MongoDB,Lucene等频繁的大型多记录更新

时间:2011-03-14 21:29:49

标签: mongodb lucene scalability nosql

我正在开发具有以下特征的Web应用程序的高级设计:

  • 数百万条记录
  • 按各种标准严格索引/搜索
  • 可变文档架构
  • 一次更新10K - 200K记录块
  • 数据需要在更新期间保持高可用性
  • 必须水平有效缩放

今天,这个应用程序存在于MySQL中,我们遇到了一些巨大的问题,特别是适应灵活的架构很有挑战性,并且大批量更新一次锁定数据10-15秒,这是不可接受的。其中一些可以通过在MySQL环境中更好的数据库设计来解决,但是,我正在寻找更好的“下一代”解决方案。

我从未使用过MongoDB,但它的功能集似乎与我想要的最匹配,所以这是我感兴趣的第一个领域。它有一些我很兴奋的东西,比如数据分片,在单个语句中查找 - 更新 - 返回的能力,当然还有NoSQL的模式灵活性。

但是,有两件事我不确定,使用MongoDB:

  1. 我似乎无法找到稳固的 有关并发性的信息 使用大型数据集进行更新(请参阅我的 上面的用例)所以我很努力 时间了解它的可能性 执行。

  2. 我确实需要开放式文字搜索

  3. 第二个要求将我带到了Lucene(或者可能是Solr,如果我把它保留在外面)作为搜索商店。我确实读过一些案例,其中Lucene被用来代替像MongoDB这样的NoSQL数据库,这让我想知道我是否因为试图在一个应用程序中同时使用它们而过于复杂 - 也许我应该直接存储所有内容在Lucene并像那样运行它?

    鉴于上述要求,看起来像MongoDB和Lucene的组合会使这项工作有效吗?如果没有,试图在Lucene完全解决它可能会更好吗?

1 个答案:

答案 0 :(得分:1)

目前使用MongoDB,更新将在服务器级锁定。有一些JIRA可以解决这个问题,计划用于v1.9-2.0。我相信当前的计划是产生写入以允许读取更好。

话虽如此,有很多很好的方法可以扩展MongoDB以实现超高并发性 - 其中许多方法都适用于MySQL。其中一个例子是使用RAID 10.另一个例子是使用主从,您可以在其中写入主设备并从从设备读取。

您还需要考虑您的“书面”数据是否需要1)持久且2)可以立即通过奴隶访问。 mongodb驱动程序允许您指定是否要立即将数据写入磁盘(或在下一个fsync的内存中挂起),并允许您指定应将数据写入的从站数量。这两种方法都会降低MongoDB的写入速度,如上所述,这会影响读取性能。

MongoDB也几乎没有Solr \ Lucene所拥有的全文搜索功能,您可能希望同时使用它们。我目前正在使用Solr和MongoDB,并对此感到满意。