Как определить диапазон сегментирования для каждого сегмента в Mongo?

#mongodb #sharding

#mongodb #сегментирование

Вопрос:

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

 {
  x:Number
}
 

и у меня есть 3 сегмента.

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

Ответ №1:

Вы можете. Можно предварительно разделить фрагменты вручную, это описано здесь: http://www.mongodb.org/display/DOCS/Splitting Куски

Тщательно подумайте о том, как вы разделяете свои фрагменты. Если вы сделаете это плохо, у вас может возникнуть много проблем с производительностью, но если вы знаете достаточно о своих ключах, вы можете многое выиграть.

Если вы это сделаете, вы, вероятно, захотите отключить балансировщик:

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

(это описано здесь: http://www.mongodb.org/display/DOCS/Sharding Администрация)

Это пример того, как вы могли бы это сделать. В зависимости от того, что именно вы хотите сделать, вам придется его изменить (я предполагаю, что ваш ключ сегментирования не назван 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 and max_key , но я не уверен, как правильно его использовать в этом контексте).

Прочитайте и эту страницу http://www.mongodb.org/display/DOCS/Moving Куски

Комментарии:

1. для моего конкретного примера, как его установить?

2. Перейдите по первой ссылке и посмотрите на первый пример.

3. Первый пример — разделение на два набора равномерно с использованием «середины». Я прочитал все три примера, но не уверен, как выполнить сегментирование, как я упоминал выше. 🙁

4. Я добавил пример. Обязательно прочитайте всю документацию в разделе сегментирование в документах Mongo, это очень полезно.

5. Что делать, если я хочу разделить на основе строки, например, A-F на сегменте 1, F-K на сегменте 2 и K-Z на сегменте 3. Подойдет любой справочный материал или ответ. Спасибо