【问题标题】:Can I replace storage engine of MongoDB as a Key-Value store我可以将 MongoDB 的存储引擎替换为 Key-Value 存储吗
【发布时间】:2015-08-10 04:19:20
【问题描述】:

MongoDB 上手容易,但保证可用性并不容易(买 EC2 搭建主从?还是更多副本集?)。并且有许多具有高可用性和良好性能的键值公共服务(Dynamo、AzureTable)。因此,如果我可以用 Dynamo 等替代 MongoDB 存储引擎,那么我将获得友好的 MongoDB API 和高可用存储。这可能吗?

【问题讨论】:

  • 有货吗?还没有。 MongoDB 3.0 发布后完成的部分工作是使存储引擎“可插入”,以支持新的 WiredTiger 存储引擎。在“理论”中,可以插入另一个解决方案的任何“适配器”并用作配置中的备用引擎。这是一直到那里吗?并不真地。因此,目前没有其他可插拔引擎可用。
  • @BlakesSeven 虽然没有可用的键/值存储专用引擎,但在这种情况下配置和使用 MongoDB 很容易,甚至有一些变化。请参阅下面的答案。
  • @MarkusWMahlberg 为什么你似乎认为你在告诉我一些事情?这不是 OP 专门要求的,也不是编程主题。
  • @BlakesSeven 你似乎错过了这种可能性,我只是想让你知道。稍微思考一下,这个问题对我来说已经足够接近数据建模了;)如果造成伤害,请原谅。
  • @MarkusWMahlberg 我不会错过任何东西。不是提出的问题,因此我没有那样回答。

标签: mongodb amazon-dynamodb nosql


【解决方案1】:

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

方法一:防止磁盘使用

  1. Disable journaling
  2. Set syncPeriodSecs to 0

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

  4. 现在您有了一个全内存键/值存储

这种方法的问题是您受限于您的机器 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 中得到答复,溢出将被自动处理并且您的值将保持不变。

旁注

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

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

【讨论】:

  • 我的问题不是使用 MongoDB 作为键值存储,而是用流行的键值存储替换现有的 MongoDB 存储引擎。无论如何,谢谢。
  • @Raymond 把你的问题弄错了。不过,我不明白这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多