2013-09-02 2 views
5


У меня есть db ("mydb") на mongo, который содержит 2 коллекции (c1 и c2). c1 уже hash sharded. Я хочу также очертить вторую коллекцию. Я получаю следующее сообщение об ошибке:не может осколоть коллекцию на mongodb

use mydb 
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"}) 
    { 
"proposedKey" : { 
    "LOG_DATE" : "hashed" 
}, 
"curIndexes" : [ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "ns" : "mydb.c1", 
     "name" : "_id_" 
    } 
], 
"ok" : 0, 
    "errmsg" : "please create an index that starts with the shard key before sharding." 

Так что я сделал

db.c2.ensureIndex({LOG_DATE: 1}) 
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"}) 

ту же ошибку, но это показывает новый индекс.

"proposedKey" : { 
    "LOG_DATE" : "hashed" 
}, 
"curIndexes" : [ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "ns" : "mydb.c2", 
     "name" : "_id_" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "LOG_DATE" : 1 
     }, 
     "ns" : "mydb.c2", 
     "name" : "LOG_DATE_1" 
    } 
], 
"ok" : 0, 
"errmsg" : "please create an index that starts with the shard key before sharding." 

Просто, чтобы быть уверенным, я бегу:

db.system.indexes.find() 
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "mydb.c1", "name" : "_id_" } 
{ "v" : 1, "key" : { "timestamp" : "hashed" }, "ns" : "mydb.c1", "name" : "timestamp_hashed" } 
{ "v" : 1, "key" : { "_id" : 1 }, "ns": "mydb.c2", "name" : "_id_" } 
{ "v" : 1, "key" : { "LOG_DATE" : 1 }, "ns" : "mydb.c2", "name" : "LOG_DATE_1" } 

Я снова попробовать одни и те же команды на администратора и он терпит неудачу с такой же ошибкой.

Затем я попробовал администратора без «хэширования», и это сработало.

db.runCommand({shardCollection: "mydb.c2", key: {"LOG_DATE": 1}}) 

Проблема: Теперь моя коллекция sharded на то, что не хэшируются и я не могу изменить его (ошибка: «уже sharded»)

  1. Что с того, что я сделал?
  2. Как это исправить?

Заранее спасибо

Томас

+4

'securityIndex ({LOG_DATE:" hashed "})' http://docs.mongodb.org/manual/tutorial/create-a-hashed-index/, вы не можете изменить свой ключ осколка, вам нужно будет повторить коллекция – Sammaye

+0

Я удалил коллекцию и переделал свою коллекцию, но я не могу ее снова очертить. Как удалить информацию о шарах, прежде чем делать collection.remove()? – Thomas

+0

removeShard должен быть в состоянии избавиться от метаданных: http://docs.mongodb.org/manual/reference/command/removeShard/#dbcmd.removeShard – Sammaye

ответ

6

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

{ 
    "v" : 1, 
    "key" : { 
     "LOG_DATE" : 1 
    }, 
    "ns" : "mydb.c2", 
    "name" : "LOG_DATE_1" 
} 

Вы еще просто обычный индекс, который не является хэшируются один. Если бы это сделать:

db.c2.ensureIndex({LOG_DATE: "hashed"}) 

Вместо этого:

db.c2.ensureIndex({LOG_DATE: 1}) 

Чем бы индекс Хешированное. Как вы можете видеть на выходе db.system.indexes.find() в другой коллекции, у вас есть хешированный индекс для метки времени, я предполагаю, что это ключ осколка для этой коллекции.

Так что, если у вас нет данных в коллекции c2:

db.c2.drop() 
db.createCollection('c2') 
db.c2.ensureIndex({LOG_DATE: "hashed"}) 
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"}) 

Это будет работать должным образом.

+0

Короче говоря, если у нас есть хешированный индекс, мы можем использовать хэш-хард на базовом ключе, и если он не хэширован, мы не можем на него наложить хэш-осколок. Но почему? Я пытаюсь иметь мысленный образ того, как индексы работают/реализуются в mongodb, и я не могу понять, почему это применяется таким образом. – Thomas

+0

Это как есть. У вас должен быть индекс в коллекции, и этот индекс станет основой для очертания (данные будут разбиты по диапазонам ключей этого индекса). Прочитайте документы о том, что Sammaye предложил в комментариях к вашему вопросу. – attish

Смежные вопросы