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

mur*_*lai 7 sharding mongodb

比方说,文件是

{
  x:Number
}
Run Code Online (Sandbox Code Playgroud)

我有3个碎片.

而不是自动分区,我可以定义shard1只包含数据x <0,shard2只包含数据0 = <x = <1000,而shard 3是1000

The*_*heo 10

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

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

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

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

(这里描述: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"})
Run Code Online (Sandbox Code Playgroud)

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

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

以下三个命令将这些块移动到单独的分片.该文件说,该命令将移动包含在价值块find,所以我选择了三个值,我知道在不同的块,并用这些(存在BSON一个符号min_keymax_key,但我不知道如何正确使用它在这种情况下).

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