6

現在、組み込みの「_id」(ObjectId)によってインデックス付け/クエリされているコレクションがあります。このキーはシーケンシャル (日付のプレフィックス) であるため、シャードしたくありません。Mongo 2.4 のドキュメントには、このキーのハッシュを分割できると書かれていますが、これはすばらしいことです。そのようです:

sh.shardCollection( "records.active", { _id: "ハッシュ" } )

質問: 最初にアクティブなコレクションにハッシュ化されたインデックスを作成する必要がありますか?

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

それとも、それは必要ありませんか?必要以上のインデックス作成でスペースを無駄にしたくありません。

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

ありがとう...

4

2 に答える 2

3

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

レプリケーションには_idインデックスが必要です。

MongoDB でコレクションを分割するには、分割キーにインデックスが必要です。これは MongoDB 2.4 でも変更されておらず、シャーディングが機能するにはhashed _idインデックスが必要になります。

于 2013-03-28T15:03:23.387 に答える
1

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: "ハッシュ" } )

于 2014-09-16T06:36:49.403 に答える