2012-02-06 1 views
5

私はMongoの私のコレクションをシャードする正しいアプローチについて、他の多くの人が考えているように思えます。主な質問は、どのように自動シャーディングが機能するかです。ObjectIDによるシャーディングは正しいですか?

「MongoDBは、自動シャーディング(パーティション分割)アーキテクチャを使用して水平にスケーリングする」および「コレクションを分割するには、シャードキーパターンを指定する」と書かれています。 「コレクションに適切なシャードキーを選択することが重要です」という注釈を付けてください。
http://www.mongodb.org/display/DOCS/Sharding+Introduction#ShardingIntroduction-ShardKeys
http://www.mongodb.org/display/DOCS/Choosing+a+Shard+Key

今の質問です - (オブジェクトIDによるシャーディング) "この右キーですか"?

db.runCommand({ shardcollection : "test", key : { _id : 1 }}) 

モンゴの内部ではどうなりますか?この場合、Mongoはどのようにデータをチャンクに分割しますか?私は最初に2つのシャードサーバーを持つ10ミリリットルのレコードを持っていると仮定します。コレクションが20ミリリットルのレコードに達したら2つのシャードサーバーを追加したい場合、モンゴサイドではどうなりますか?私はMongo関連の情報源のどこにいてもその詳細レベルを見つけることができませんでした。

iの値によって分割チャンクと最下位バイト(RTLオーダー)でシャードう...

を考慮に自動生成_idのランダムな性質を撮影し、それが構造、

だ... http://www.mongodb.org/display/DOCS/Object+IDs 2〜4バイトのシャードサーバー - シャードサーバーの2,4,8、..、256シャードサーバーで、各シャードに多かれ少なかれ均等に負荷をかけ、必要最小限の構成で簡単にシャードする方法を提供します。私が理解する限り、Mongoは明示的に定義された範囲でシャーディング/チャンクだけをサポートし、私の考えは機能しません。本当ですか?

+0

うん、私は相によアクティブなresearの新しいプロジェクトのためのch - すべての私の質問を見直し、研究が終わったら最も適切なものを受け入れます。 –

+0

@XtraCoderどのように研究を行ったのですか?この答えは受け入れに値すると思われます。 –

答えて

12

バージョン2.4では、ハッシュインデックスがサポートされ、シャードキーとして使用できるという新機能が追加されました。あなたの主な質問への答えは"ObjectIDによるシャーディング、それは正しい方法ですか?"は「はい」です!

の参照は公式ドキュメントでは、次のとおりです。

ハッシュシャードキー

http://docs.mongodb.org/manual/core/sharded-cluster-internals/#hashed-shard-keys

ハッシュされたインデックス

http://docs.mongodb.org/manual/core/indexes/#hashed-index

+0

「ObjectIdインデックス」を日付フィールドとして使用している場合、アプリケーションが実際に書き込みが集中している場合を除き、「ハッシュ・インデックス」は使用しません。 –

+1

ここで重要な点を気にしてください** "クエリの分離を減らすために**"この[リンク]を参照してください(http://docs.mongodb.org/manual/faq/sharding/#can-you-shard-on -the-id-field) –

13

デフォルトのオブジェクトIDは、タイムスタンプが埋め込まれており、時間が単調に増加するため、シャードキーとして使用することはお勧めできません。古い文書と新しい文書が均等に分散して更新されるなど、多くの更新を行うとうまくいく可能性があります。しかし、書き込みの大半が1つの断片になるため、アプリケーションがインサートに重い場合は、これは本当に悪いニュースです。これは、書き込みが[nearCurrentTimestamp - > infinity]チャンクを所有するシャードに移動するためです。

各mongosはシャードへの書き込みトラフィックを監視し、非常に単純なヒューリスティックを使用して、チャンクが大きすぎて分割する必要があるかどうかを判断します(しきい値サイズはchunkSizeで設定できます)。

クラスタに新しいシャードを追加すると、バランサ(http://www.mongodb.org/display/DOCS/Sharding+Administration#ShardingAdministration-Balancing)にチャンクの不均衡が表示され、チャンクの新しいシャードへの移行が開始されます。

Mongoは範囲ベースのシャーディングをサポートしていますが、チャンクは時間の経過とともに小さな範囲に分割して移動できるため、範囲が固定されているわけではありません。

+0

私は "私のアイデアは動作しません"(残念ながら)尋ねたものを確認してからこの答えを受け入れています:(しかし、私はそれが働くように方法を見つけたいと思います:) –

+2

これは、右? –