定义mongodb分片标记的动态范围

时间:2013-09-03 08:15:34

标签: mongodb sharding

我有一个分片的mongodb数据库设置,我使用分片标签将某些数据约束到某些分片。

我要做的是为分片标记提供动态范围。我希望过去5天的数据始终在分片标记中,而其他分片标记中的其他数据。我不能在此指定固定日期,因为它每天都在变化。

一个例子是

Shard标记从过去5天到今天的“最新”数据 分片标记“OLD”数据从最短到最近5天

我如何在分片标记上定义这样的范围,而不是每天更改分片标记范围。

先谢谢

2 个答案:

答案 0 :(得分:1)

在您的示例中,使用分片密钥分发,带有“最新”数据的分片将获得所有新写入,因为进一步的“最新”数据将是注入其中。问题是,您需要手动将旧的数据移动到另一个分片。

假设您有一个timestamp - 类似分片键或ObjectID。 (使用时间戳组件自动构造ObjectID。)这些都是单调增加的,因此当您将数据插入相应的集合时,线性平衡的卡盘每次都会失去平衡。

我不会强制旧数据或新数据到一个特定的分片,因为分片是主要用于负载平衡,在这种情况下你会避免。使用单调密钥类型可以很好地分发数据,因为MongoDB版本2.4带有Hashed Sharding

了解如何Shard a Collection Using a Hashed Shard Key

示例:sh.shardCollection( "records.active", { a: "hashed" } )

a应该是单调增加的字段类型。

答案 1 :(得分:0)

尝试使分片标记动态化的问题是标记仅在插入时受到尊重。在您的情况下,所有新数据将最终出现在一组标记的分片中,因为所有数据在插入时开始时间不到五天。自插入后五天过去,什么都不会发生。它没有提供从标记的分片中删除超过五天的文档的神奇功能,并将它们分配给另一组未标记的分片。