2013-09-02 14 views
5


2つのコレクション(c1とc2)を含むmongoのdb( "mydb")があります。 c1は既にハッシュ・シャードされています。私は同じ方法で2番目のコレクションをシャードします。私は次のエラーを取得する: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}}) 

問題:今、私のコレクションは、何かにシャードでハッシュ化されていないと私はそれを変更することはできません(エラー:「すでにシャード」)

  1. 私が何をしたかと間違っていましたか?
  2. どうすればこの問題を解決できますか?

事前に感謝

トーマス

+4

'ensureIndex({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

関連する問題