Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

can't shard a collection on mongodb

Tags:

mongodb


I have a db ("mydb") on mongo that contains 2 collections (c1 and c2). c1 is already hash sharded. I want to shard a second collection the same way. I get the following error :

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

So I did

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

Same error but it shows the new index.

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

Just to be sure, I run :

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

I try again the same commands on admin and it fails with the same error.

Then I tried on admin without "hashed" and it worked.

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

Problem : now my collection is sharded on something that is not hashed and I can't change it (error : "already sharded")

  1. What was wrong with what I did ?
  2. How can I fix this ?

Thanks in advance

Thomas

like image 740
Thomas Avatar asked Sep 02 '13 14:09

Thomas


1 Answers

The problem initially was that you did not have a hashed index what you proposed to use for sharding this is the error message is about. After the first error message, when you created an index which is

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

You still just have an ordinary index which is not a hashed one. If you would do this :

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

Instead of this :

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

Than would be a hashed index. As you can see in the output of the db.system.indexes.find() on the other collection you have a hashed index for the timestamp i assume this is the shard key for that collection.

So if you have no data in the c2 collection:

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

This will work properly.

like image 136
attish Avatar answered Oct 18 '22 18:10

attish