在MongoDB中为基于时间的查询提取一个好的分片键

时间:2014-05-02 03:34:36

标签: mongodb sharding

我有一个包含以下文档的集合:

{
    "_id" : ObjectId("535e194aba863da3118cdf8a"),
    "device_id" : "1080000008",
    "others" : [ 
        {
            "mileage" : "0.0",
            "event" : "5",
            "satellite" : "8",
            "altitude" : "0",
            "heading" : "290"
        }
    ],
    "speed" : 68,
    "lat" : 1.3209,
    "lng" : 103.89139,
    "dateTime" : ISODate("2014-04-28T17:03:05.000Z"),
    "output_status" : 0,
    "street_name" : "JALAN AFIFI",
    "device_type" : "VT10",
    "__v" : 0
}

我有2个分片,A​​和B,我希望分片A包含基于DateTime和分片B的最新文档,以包含超过48小时的文档。

MongoDB有可能吗?或者是否有更好的分片组合,我可以选择,如lat / lng?或者分片键是否应该跟随索引键?

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用tag aware sharding,除了链接的文档之外,还有很好的标记识别分片写入found here。你会有一个标记为&#34的碎片(或一组碎片);短期" (或任何有意义的东西),然后标记为"长期"的另一个碎片(或一组碎片)。

选择一个分片键,您可以根据时间识别范围,然后将所有新数据标记为"短期"。现在,您所要做的就是定期更改较旧范围的标记,以将其移至"长期"。

平衡器会将块移动到适当的标签作为优先级(唯一更高的优先级是排水碎片),所以只要你能处理这样一个事实:你的"短的时间范围-term"碎片有超过48小时你应该没问题。

这样做的缺点是你会最终得到热身"短期分片上的块用于写入 - 所有对新数据的写入将始终转到单个块 - 最大块(对于任何单调增加的分片键都是如此)。如果你没关系,并且可以在一个分片上处理你的新数据写入量,那么你应该没问题。

请注意,您不必使用dateTime字段(请记住您的分片键是不可变的),您也可以在_id字段中使用ObjectID,因为它也包含基于时间的值 - 有关详细信息,请参阅我的相关Q&A here