我们有一组日志数据,其中集合中的每个文档都由MAC地址和日历日标识。基本上:在MongoDB中,用于最大化写入日常日志文档性能的策略
{
_id: <generated>,
mac: <string>,
day: <date>,
data: [ "value1", "value2" ]
}
每五分钟,我们在当天的文档中追加一个新的日志条目到数据数组中。当我们为每个MAC创建一个新文档时,该文档将在UTC午夜翻阅。
我们已经注意到,按写入的字节数衡量,IO整天增加,然后在UTC的午夜时降低。这不应该发生,因为日志消息的速率是不变的。我们认为这种意外行为是由于Mongo移动文档引起的,而不是更新他们的日志阵列。对于它的价值,stats()
显示paddingFactor为1.0299999997858227。
几个问题:
- 有没有一种方法,以确认是否蒙戈在地方更新或移动?我们在缓慢的查询日志中看到了一些动作,但这似乎是一个轶事证据。我知道我可以
db.setProfilingLevel(2)
,然后db.system.profile.find()
,最后查找"moved:true"
,但我不确定是否可以在繁忙的生产系统上执行此操作。 - 每个文档的大小是非常可预测和规律的。假设mongo做了很多动作,找出为什么Mongo不能更准确地推断出来的最好方法是什么?或者让Mongo更准确地推测?假设上述问题的描述是正确的,调整填充因子看起来并不像这样做。
- 对我来说,应该很容易地推销文档并从Mongo中删除任何猜测。 (我知道padding factor文档说我不应该这样做,但我只需要把这个问题放在我后面。)预设文档的最佳方式是什么?使用垃圾字节数组字段编写文档似乎很简单,然后立即从文档中删除该字段,但是我应该注意哪些问题?例如,我可以想象在删除垃圾字段之前必须等待写入操作的服务器(即,执行安全写入)。
- 我担心在大约同一时间预先分配一天的所有文档,因为当时似乎会使磁盘饱和。这是一个有效的关注吗?我应该尝试分摊前一天的预分配成本吗?
Scott Hernandez在Google Group上回答了这个问题,所以我在他的回答中发布了一个列表:http://groups.google.com/group/mongodb-user/browse_thread/thread/8a24e7f3faf95f71# – jtoberon
最新更新:我们仍在试图弄清楚发生了什么。 – jtoberon