为mongodb选择一个shardkey

时间:2017-01-22 23:22:14

标签: mongodb iot sharding distributed-system bigdata

我想对我的MongoDB数据库进行分片。我的插入率很高,并希望将文档均匀分布在两个分片上。

我考虑过了rangebase分片,因为我有范围查询;但我找不到一个选择好的分片密钥的解决方案。

{
    Timestamp : ISODate("2016-10-02T00:01:00.000Z"),
    Machine_ID: "100",
    Temperature:"50"
}

如果这是我的文档并且我有100,000台不同的机器,那么Machine_ID是否适合作为shardkey?如果是这样,MongoDB将如何在分片上分发它,即我是否必须自己指定分片范围?比如在Shard A上放置Machine_ID 0-49,999,在shard B上放置50,000-100,000?

2 个答案:

答案 0 :(得分:1)

我认为Machine_ID将是一个合适的分片密钥,如果之后的查询将是每台机器,即在特定时间范围内获取特定机器的所有温度。有关分片键的更多信息,请访问:Choosing shard key

MongoDB有两种分片:散列分片和范围分片,你可以在这里阅读更多信息:Sharding strategies。话虽如此,你不需要自己指定碎片的范围,mongo会照顾它。特别是当你需要添加一个新的分片时,mongo会将这些分块重新排列成新的分片。

答案 1 :(得分:0)

如果您的群集只有两个分片,那么设计就不难了。但是,如果您的数据将继续增长并且最终会有更多分片,那么选择分片键会更加困难。

例如,如果某些机器的记录多于其他机器(例如,一台机器有3000条记录,即总数的3%),那么这不会导致只有两个分片出现问题。但是如果你的数据增长,你需要100个分片,而且一台机器仍然占总数的3%,那么Machine_ID不再是一个不错的选择:因为单个机器的记录必须是一个块,并且不能分布在几个机器上碎片。

在这种情况下,更好的策略可能是使用时间戳的哈希值 - 但这取决于数据集的整体形状。