Предварительно разделить на составной ключ осколка - PullRequest
1 голос
/ 01 марта 2012

Для своих нужд я должен выполнить предварительное разбиение, но мой ключ шарда является составным ключом.оба ключа моего составного ключа (k1 и k2) имеют тип int, и моя желаемая структура чанка выглядит примерно так:

chunk1: k1 = minkey to 1, k2 = minkey to maxkey

chunk2: k1= От 1 до 2, k2 = от minkey до maxkey

chunk3: k1 = от 2 до 3, k2 = от minkey до maxkey

chunk4: k1 = от 3 до 4, k2 = от minkey до maxkey ...

Итак, что я действительно хочу сделать, так это разделить только первый ключ и оставить второй ключ, чтобы включить все возможные диапазоны, но если запустить этот

db.runCommand( { split : "db.mycollection" , middle : { k1: 1} } );

, произойдет сбой, говоря полныйключ шарда не предоставлен, поэтому он заставляет меня вызывать эту

db.runCommand( { split : "db.mycollection" , middle : { k1: 1, k2:somenumber } } );

эта команда работает, но результирующий сплит плох, потому что он дает мне куски, как показано ниже

chunk1: k1 = minkey to 1, k2 = minkey для somenumber

chunk2: k1 = 1 для maxkey, k2 = somenumber для maxkey

это плохо, потому что если пользователи вставляют что-то в документ, где k1 <1 и k2> somenumber,в системе, которая его закрывает, нет фрагмента, и вставка должна выйти из строя.

Как я могу создать такие границы чанков с помощью составного ключа?

ПРИМЕЧАНИЕ. Можно спросить, почему у меня k2, если это всегда minkey to maxkey.У меня есть k2, чтобы позволить дальнейшее разбиение на k2 для того же самого k1 в будущем, если это будет необходимо (и я уверен, что это понадобится для некоторых кусков)

1 Ответ

0 голосов
/ 01 марта 2012

Это должно сделать это:

db.runCommand( { split : "db.mycollection" , middle : { k1: 1, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 2, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 3, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 4, k2:MaxKey } } );

Кстати, вы никогда не сможете создать ситуацию, в которой определенный диапазон не будет покрыт кусками, поскольку все, что вы делаете, это разбиваете существующие диапазоны. Также обратите внимание, что k2 не может быть от MinKey до MaxKey технически. Ваш диапазон для первого чанка будет от {k1: MinKey, k2: MinKey} до {k1:1, k2: MaxKey}. Следующий будет от {k1: 1, k2: MaxKey} до {k1:2, k2: MaxKey} и так далее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...