2013-03-28 12 views
5

私は現在、組み込みの "_id"(ObjectId)によって索引付け/照会されているコレクションを持っています。私はシーケンシャル(日付接頭辞)なので、このキーを破ることはしません。 Mongo 2.4のドキュメントでは、この鍵のハッシュを破ることができますが、これは素晴らしいことです。MongoDBのHashed Shard Keyの適切な実装

sh.shardCollection( "records.active"、{_id: "ハッシュされた"})

質問:

:私が最初にアクティブなコレクションのハッシュ化されたインデックスを作成する必要がありますので、同様db.active.ensureIndex({_id: "hashed"})

これは必須ではありませんか?私は、必要以上に索引を付けてスペースを無駄にしたくありません。

関連する質問:ensureIndex({_id: "hashed"})でハッシュされたインデックスを作成すると、デフォルトの "id"インデックスを削除できますか? Mongoは_idフィールドをクエリしてハッシュし、ハッシュされたインデックスに対してそれらを実行することを知っていますか?

おかげで...

答えて

3

_idインデックスとハッシュ化された_idインデックスが必要になります両方。 MongoDB 2.4では、コレクションをシャーディングする前にdb.active.ensureIndex({_id: "hashed"})を明示的に呼び出す必要はありませんが、sh.shardCollection( "records.active"、{ _id: "hashed"})は、ハッシュされたインデックスを作成します。

_idインデックスは複製に必要です。

MongoDBでコレクションを断片化するには、シャードキーにインデックスを付ける必要があります。これはMongoDB 2.4では変更されておらず、ハッシュ付き_idシャーディングが機能するためにインデックスが必要になります。

0

私はmongoDB 2.4.11を使用して自分で試しました。

新しいコレクションにドキュメントを作成して挿入します。クエリがmongosサーバーに起動されました。私が挿入したすべての1,000,000文書は、シャードクラスタプライマリとしてシャードAに送られます(sh.status()を使用して確認できます)。私は以下のとおりシャードコレクションにコマンドを実行しようとしましたが

sh.shardCollection("database.collection",{_id:"hashed"}) 

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

次だから、答えは

  1. はい、それですと、それはエラーを示していハッシュドインデックスが必要です
  2. 事前にそれを食べ、MongoDBは以下のコマンドを使用して手動で実行する必要があり:

    db.collection.ensureIndex({_id: "ハッシュ"})

関連する問題