比方说,文件是
{
x:Number
}
我有3个分片。
而不是自动分片,我可以定义shard1只包含数据x <0,shard2只包含数据0 =&lt; 0 x =&lt; 1000,碎片3是1000
答案 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 -> 0
和0 -> max_value
。然后,第二个命令将包含1000的块(由前一个命令创建的第二个块)拆分为两个新块。在那个命令之后你有三个块:
min_value -> 0
0 -> 1000
1000 -> max_value
以下三个命令将这些块移动到单独的分片。文档说该命令将移动包含find
中值的块,因此我选择了三个我知道的不同块的值并使用了这些值(BSON中有一个符号用于min_key
和{{ 1}},但我不确定如何在这种情况下正确使用它。)