我可以将MongoDB的存储引擎替换为键值存储

时间:2015-08-10 04:19:20

标签: mongodb amazon-dynamodb nosql

MongoDB很容易启动,但要确保可用性并不容易(购买EC2来构建主从?或更多副本集?)。还有许多具有高可用性和良好性能的键值公共服务(Dynamo,AzureTable)。因此,如果我可以用Dynamo替换MongoDB存储引擎,那么我就获得了友好的MongoDB API和高可用存储空间。这可能吗?

1 个答案:

答案 0 :(得分:0)

实际上,使用MongoDB作为内存键值存储非常容易:

方法1:防止磁盘使用

  1. Disable journaling
  2. Set syncPeriodSecs to 0

  3. 将密钥存储在_id字段中,将值存储在value字段中。

  4. 现在你有一个所有内存中的键/值存储
  5. 这种方法的问题在于您只能使用机器RAM大小,而且数据不会持续存在。

    一种更优雅的方法是使用

    方法2:使用覆盖查询

    覆盖查询是一种只使用索引来回答的查询,只要有足够的索引,该索引就会保留在内存中。如果索引超过RAM,则最近最少使用的部分是"交换"到磁盘。此外,您的键/值对是持久的。所有这一切都是透明的。

    1. 在键和值上创建索引:

      db.keyValueCollection.createIndex({_id:1,value:1})
      
    2. 确保MongoDB被告知只需要_idvalue,并且它不需要使用投影来限制从磁盘读取任何其他内容(灵活架构!)查询中返回的字段为这两个字段:

      db.keyValueCollection.find({_id:"foo"},{_id:1,value:1})
      
    3. 完成!您的查询现在将从RAM中回答,溢出将自动处理,您的值将持续存在。

    4. 旁注

      确保MongoDB的可用性几乎是万无一失的。选择副本集名称,将其添加到所有confit文件,启动其中一个成员,启动副本集并添加成员。问题解决了。

      编辑:删除了一个人工key字段,并确保通过限制返回的字段来涵盖方法2中的查询。