Как определить диапазон шардинга для каждого шарда в Монго? - PullRequest
7 голосов
/ 28 октября 2011

допустим, документ

{
  x:Number
}

и у меня 3 шарда.

Вместо автоматического разделения можно определить, что конкретно shard1 содержит только данные x <0, shard2 содержит только данные0 = <x = <1000, а осколок 3 равен 1000

1 Ответ

10 голосов
/ 28 октября 2011

Можно. Можно предварительно разделить фрагменты вручную, это описано здесь: 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

...