如何为Mongo中的每个分片定义分片范围?

时间:2011-10-28 19:47:06

标签: mongodb sharding

比方说,文件是

{
  x:Number
}

我有3个分片。

而不是自动分片,我可以定义shard1只包含数据x <0,shard2只包含数据0 =&lt; 0 x =&lt; 1000,碎片3是1000

1 个答案:

答案 0 :(得分:10)

你可以。可以手动预分割块,如下所述:http://www.mongodb.org/display/DOCS/Splitting+Chunks

仔细考虑如何分割你的块。如果你做得很糟糕,你可能会遇到很多性能问题,但如果你对键有足够的了解,你可以获得很多。

如果你这样做,你可能想要关闭平衡器:

> use config
> db.settings.update({_id: "balancer"}, {$set: {stopped: true}}, true);

(这里描述:http://www.mongodb.org/display/DOCS/Sharding+Administration

这是一个如何做到这一点的例子。根据您想要做的具体操作,您必须对其进行修改(例如,我假设您的分片键未命名为x,并且您的范围不是-1000到2000)。

> use admin
> db.runCommand({split: "my_db.my_coll", middle: {x: 0}})
> db.runCommand({split: "my_db.my_coll", middle: {x: 1000}})
> db.runCommand({movechunk: "my_db.my_coll", find: {x:   -1}, to: "shard_1_name"})
> db.runCommand({movechunk: "my_db.my_coll", find: {x:    0}, to: "shard_2_name"})
> db.runCommand({movechunk: "my_db.my_coll", find: {x: 1000}, to: "shard_3_name"})

split命令创建块。每个命令将包含中间值的块拆分为两个,因此第一个命令将包含min_value -> max_value的块拆分为min_value -> 00 -> max_value。然后,第二个命令将包含1000的块(由前一个命令创建的第二个块)拆分为两个新块。在那个命令之后你有三个块:

  • min_value -> 0
  • 0 -> 1000
  • 1000 -> max_value

以下三个命令将这些块移动到单独的分片。文档说该命令将移动包含find中值的块,因此我选择了三个我知道的不同块的值并使用了这些值(BSON中有一个符号用于min_key和{{ 1}},但我不确定如何在这种情况下正确使用它。)

也请阅读此页面http://www.mongodb.org/display/DOCS/Moving+Chunks