Можно. Можно предварительно разделить фрагменты вручную, это описано здесь: 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
и max_key
, но я я не уверен, как правильно использовать его в этом контексте).
Читайте эту страницу тоже http://www.mongodb.org/display/DOCS/Moving+Chunks