#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. Подойдет любой справочный материал или ответ. Спасибо