2012-03-01 4 views
1

私の必要に応じて、私は事前分割をしなければならないが、私のシャードキーは複合キーである。私の複合キー(K1およびK2)の両方のキーはint型であり、私の希望チャンクの構造は、この複合シャードキーで事前分割

chunk1のようなものです:2に、K1 = 1:

chunk2をmaxkeyするK1 = 1にminkey、K2 = minkey

chunk4 maxkeyする= 2〜3、K2 = minkey K1: をmaxkeyするk1は= 3〜4、K2 = minkey ...

をだから何

chunk3をmaxkeyするため、K2 = minkey私は本当にしたい最初のキーのみに分割され、彼は、第2の鍵は、すべての可能な範囲を含むことが、この

db.runCommand({ split : "db.mycollection" , middle : { k1: 1} }); 

を実行する場合、それは私がこの

db.runCommand({ split : "db.mycollection" , middle : { k1: 1, k2:somenumber } }); 

このコマンドは動作しますが、結果を呼び出すようになりますので、完全なシャードキーが提供されていないと言って失敗しますK1 = 1にminkey、K2 = minkey

chunk2 somenumberする:maxkeyへ= 1 K1、K2 = somenumberをそれは私に

chunk1以下のようなチャンクを与えるので、分割が悪いです〜maxkey

これは悪いことですが、ユーザーがk1 <とk2> somenumberのいずれかのドキュメントを挿入すると、それをカバーするシステムにチャンクがなく、挿入が失敗するからです。

複合キーでこのようなチャンク境界を作成するにはどうすればよいですか?

注:maxkeyを常にminkeyにすると、k2を持つ理由がわかります。私は、これはそれを行う必要があります

答えて

0

(と私はそれが塊の一部に必要とされるであろうと確信しています)、必要に応じても、将来的に同じK1のためのK2にさらに分割を可能にするためにそのようなK2があります

db.runCommand({ split : "db.mycollection" , middle : { k1: 1, k2:MaxKey } }); 
db.runCommand({ split : "db.mycollection" , middle : { k1: 2, k2:MaxKey } }); 
db.runCommand({ split : "db.mycollection" , middle : { k1: 3, k2:MaxKey } }); 
db.runCommand({ split : "db.mycollection" , middle : { k1: 4, k2:MaxKey } }); 

ことでところで、あなたがしていることはすべて既存の範囲を分割しているので、ある範囲がチャンクで覆われていない状況を作り出すことはできません。また、k2は、技術的にはMinKeyからMaxKeyになることはできません。最初のチャンクの範囲は{k1: MinKey, k2: MinKey}から{k1:1, k2: MaxKey}になります。次のいずれかが{k1:2, k2: MaxKey}{k1: 1, k2: MaxKey}になるだろうし、そう

+0

に私はこれを試してみましたが、Idは動作しませんでしたし、私は常にthisCommand「スプリット」を取得していませんでした:{「原因」:{「スプリットは (失敗応答""、 "ts":ObjectId( "4f4ffdda58ee8c3d2948d640")、 "状態": "プロセス": "blahmachine:27018:1330601796:1743958884"、 " :ISODate( "2012-03-01T22:53:14.839Z")、 "who": "blahmachine:27018:1330601796:1743958884:conn3:1105345454"、 "why": "migrate- {k1:0、k2 : "、" ok ":0.0}、 " ok ":0.0、" er ":" errmsg ":"コレクションのメタデータロックが取られました。 – iCode

+0

クラスタが新しく、データが記録されていません – iCode

+0

また、maxkey iCode

関連する問題