真实世界高插入(更重要的是更新调整值)nosql

时间:2012-01-19 17:23:02

标签: database-design asynchronous transactions nosql distributed-computing

我正在研究一个可以用两个键值表表示的IR问题。

表Q:具有在插入时确定的固定大小,更新表增量计数器,大小可以随着数据在协议缓冲区中编码而移位,并且随着数值变高,它们可能会增加字节大小(变量int编码) )。

表P:包含对表Q的引用,它是一对多的关系,因为一个p可以指向许多q。更新会增加计数器并添加引用。很多碎片。

表Q和P与反向索引的标准IR全文搜索结构的数据访问特性完全相同。 Q是文件,P是文字 - 帖子。

我尝试了以下嵌入式数据库。

  1. SQLite规范化形式,太慢,不平行,存储开销太大。执行最坏的情况。
  2. Kyotodb。伪事务(全局锁定)性能下降,线性增加超过500 k源代码行。尝试了几种不同的方法。
  3. Berkley db,页面锁定事务,在内存中。超过600万条源线,性能变得不可接受。 Cpu已经饱和,但我预计死锁和自旋锁定会导致使用。
  4. Leveldb(我放弃了很快,它在全球锁IIRC下工作)。也许它保留了写性能。我没让它跑那么久。
  5. 这是我想要优化的情况:

    1. 存储/ CPU时间可预测性。
    2. 超高插入率。
    3. 一致但不耐用(异步写入)。
    4. 专为平行插入而设计。
    5. 没有Erlang,也没有java。
    6. 是的,如果需要,我可以将数据模型折叠成面向文档的结构。由于没有交易,这对mongodb来说是必须的。

      这家伙似乎知道他是什么talking about,而且因为他给了mongodb三星级的插页表演,我很受诱惑。尽管Json对我来说似乎很浪费。我也可以切换到SQL服务器,因为它在插入负载下是惊人的,但它不会扩展到重铁之外。 所以,对于我的情景来说,mongodb是蜜蜂的膝盖吗,任何人都尝试过度肥大与mongodb?其他建议?

      编辑:自我回答

      前提:

      1. 大型交易范围是恶魔。
      2. 碎片是魔鬼。
      3. 因此,在迁移到面向文档的数据库或分布式键值数据库之前,通常会修复应用程序的数据模型,以便更好地映射到此类数据模型上。分布式数据库没有事务,mongo甚至可以用于单个文档的原子更新 - 因此,要在事务范围内使用更新,Q必须是您的文档,而P将在Q中索引变量元素。 / p>

        因此,要切换到我的数据模型的不同表示。我将确保两个表的生命周期都是静态大小的(使用协议缓冲区fixed32而不是int32),而且我将对表P进行unpivot(un-invert),并为此将大部分P合并为Q.

        这将解决碎片问题并减少事务范围,插入P可以在事务之外完成。我也会在愤怒中尝试leveldb。我有一种感觉,它会在整个处理过程中保持它的性能水平,从不隐瞒它不会并行化的事实。

0 个答案:

没有答案