为 mongodb 选择一个 shardkey

picking a shardkey for mongodb

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

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

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

如果这是我的文档并且我有 100,000 台不同的机器,Machine_ID 会是一个合适的 shardkey 吗?如果是这样,MongoDB 将如何在分片上分配它,即我是否必须自己指定分片范围?比如把 Machine_ID 0-49,999 放在分片 A 上,50,000-100,000 放在分片 B 上?

我认为 Machine_ID 将是一个合适的分片键,如果您之后的查询将按机器进行,即获取特定机器在特定时间范围内的所有温度。可以在此处找到有关分片键的更多信息:Choosing shard key

MongoDB 有两种分片:散列分片和范围分片,您可以在此处阅读更多信息:Sharding strategies。话虽如此,您不需要自己指定分片的范围,mongo 会处理它。特别是当您需要添加新分片时,mongo 会将块重新排列到新分片中。

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

例如,如果某些机器的记录比其他机器多得多(例如,一台机器有 3000 条记录,即总数的 3%),那么只有两个分片不会导致问题。但是如果你的数据增长到需要100个分片,而一台机器还有总数的3%,那么Machine_ID就不再是一个好的选择了:因为单台机器的记录必须是单个chunk,不能分布在多个分片中。

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