2013-09-02 20 views
5


Ho un db ("mydb") su mongo che contiene 2 raccolte (c1 e c2). c1 è già hash sharded. Voglio ritagliare una seconda collezione allo stesso modo. Ottengo il seguente errore:non può creare una raccolta su 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." 

così ho fatto

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

stesso errore, ma mostra il nuovo indice.

"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." 

solo per essere sicuri, corro:

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" } 

provo di nuovo gli stessi comandi di admin e viene a mancare con lo stesso errore.

Quindi ho provato su admin senza "hash" e ha funzionato.

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

Problema: ora la mia collezione è sharded su qualcosa che non è hash e non posso cambiarlo (errore: "già sharded")

  1. Cosa c'era di sbagliato in quello che ho fatto?
  2. Come posso risolvere questo problema?

Grazie in anticipo

Thomas

+4

'ensureIndex ({LOG_DATE:" hashed "})' http://docs.mongodb.org/manual/tutorial/create-a-hashed-index/, non è possibile modificare la chiave shard, sarà necessario rifare la collezione – Sammaye

+0

Ho rimosso la raccolta e ho rifatto la mia raccolta, ma non riesco a ritagliarla nuovamente. Come rimuovo le informazioni di sharding prima di fare collection.remove()? – Thomas

+0

removeShard dovrebbe essere in grado di eliminare i metadati: http://docs.mongodb.org/manual/reference/command/removeShard/#dbcmd.removeShard – Sammaye

risposta

6

Il problema inizialmente era che non c'era bisogno di un indice hash quello che si propone di utilizzare per sharding questo è il messaggio di errore è di circa. Dopo il primo messaggio di errore, quando è stato creato un indice che è

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

È ancora solo un indice normale che non è un hash uno. Se volete fare questo:

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

Invece di questo:

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

di quanto sarebbe un indice di hash. Come puoi vedere nell'output di db.system.indexes.find() sull'altra collezione hai un indice hash per il timestamp presumo che questa sia la chiave shard per quella collezione.

Quindi, se non si hanno i dati della collezione c2:

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

Questo funzionerà correttamente.

+0

In breve, se abbiamo un indice hash possiamo hash shard sulla chiave sottostante, e se non è hash, non possiamo hash shard su di esso. Ma perché è così? Sto cercando di avere un'immagine mentale di come gli indici funzionano/sono implementati in mongodb e non riesco a capire perché questo è applicato in questo modo – Thomas

+0

È come è. Devi avere un indice sulla collezione e questo indice sarà la base dello sharding (i dati saranno partizionati attraverso gli intervalli di chiavi di questo indice). Leggi i documenti su, che Sammaye ha suggerito nei commenti alla tua domanda. – attish

Problemi correlati