2011-07-08 20 views
2

私はsharded mongodb環境を実行しています - 3つのmongodシャード、1つのmongod config、1つのmongos(複製なし)。Mongodbクラスタの設定方法は?

mongoimportを使用してcsvデータをデータベースにインポートします。私は、210のcsvファイルにまたがって50万の増分で105百万のレコードを保存しています。私はmongoimportがシングルスレッドであることを理解しています。より良いパフォーマンスを得るために、複数のmongoimportプロセスを実行する必要があることを読んでいます。しかし、私はそれを試して、速度を上げなかった:

並列で3つのmongoimportsを実行しているとき、私は1つのmongoimportを実行していたときと比べて、プロセス当たり(〜18k i/s)〜6kの挿入/ 〜20kの挿入/秒を得る。

これらのプロセスは単一のmongod configとmongosでルーティングされていたので、これが私のクラスタ構成によるものかどうかは疑問です。私の質問は、クラスター構成を別の方法で設定すると、mongoimportの速度を上げることができますか?もっとモンゴスのプロセスが必要ですか?一度にいくつのmongoimportsプロセスを起動する必要がありますか?

+0

現在210のmongoimportプロセスをテストしています。それは1つのプロセスと同等であるようだ... – jacobra

+0

それは同じ時間のまわりで右を取った。それは私の端末をクラッシュしましたが、私は正確にどのくらいの時間= Pを知らないので、 – jacobra

答えて

5

最初にする必要があるのは、チャンクを「事前分割」することです。

インポートするコレクションをすでに断片化しているとします。 「最初から」開始すると、すべてのデータが単一のノードに移動し始めます。そのノードがいっぱいになると、MongoDBはそのノードをチャンクに分割し始めます。それが約8チャンク(約8x64MBのインデックススペース)に達すると、チャンクの移行が開始されます。

基本的に、単一のノードに効果的に書き込みを行っていて、他のノードにデータを読み書きする必要があるため、そのノードの速度が低下しています。

これは、3 mongoimportでスピードアップが表示されない理由です。すべてのデータはまだ単一のノードに送られており、そのノードのスループットを最大限に引き出しています。

ここでのトリックは、データを「事前分割」することです。あなたの場合、おそらくそれはあなたが約70ファイルの各マシン上のデータの価値を取得するように設定するだろう。その後、それらのファイルを別のスレッドにインポートして、より良いスループットを得ることができます。

CraigslistのJeremy Zawodnyは、このhereに合理的な訴訟を起こしています。 MongoDBのサイトには、いくつかのドキュメントhereがあります。

+0

mongoimportの前にテーブルが存在しません。 mongodbはテーブルに関する情報をまだ持っていないので、テーブルを作成する前にデータをどのようにプリスプリットすることができますか? 私が間違っている場合は私を修正してください。ただし、プレスプリットする手順は次のとおりです。 1。セットアップ3 mongod --sharsvrs、1 mongod --config、mongosを指し示す3つのモンゴ - 2. db上でシャーディングを有効にする 3.チャンク分割が発生する場所を手動で定義する(200mb/docsize) 4.呼び出し各mongosプロセスでmongoimportします。 私はuidで分割していますが、入力ファイルはuidで分割されないことに注意してください – jacobra

+0

ステップ3は正しいです(1.8のチャンクサイズは64MBです)。正確に64MBである必要はなく、「ほぼ均等に」配布したいだけです。ステップ4は基本的に正しいです。 3つの断片がある場合、ファイルを3つのセットに分割し、3つのプロセスを実行します。ファイルにシーケンシャルUIDが含まれていない場合、事前に鍵の範囲を把握する必要があります。オリジナルはDBにありますか?それらをソートして照会できますか?あなたはファイルを実行して、それらからアイデアを得ることができますか? –

+0

よかった、ありがとう。彼らはソートされていないが、私は今何をする必要があるか分かっている!再度、感謝します! – jacobra

1

私はバルクロードに役立ついくつかを見つけました。

すべてを読み込んだ後まで、ビルドインデックスを除外します(シャードキーに付ける必要はありません)。

シャードごとに1つのmongosとmongoimportを実行し、並列に読み込みます。

そして最大の改善点:チャンクを予め分割してください。これは、あなたが必要とするチャンクの数と、データがどのように配布されているかを把握する必要があるため、ややこしいことです。分割チャンクのコマンドについては、http://www.mongodb.org/display/DOCS/Splitting+Chunksを参照してください。あなたがそれらを分割した後、ディストリビューターがそれらを全周に移動するのを待たなければなりません。

関連する問題