1

運用ストレージにmongoDBを使用するETLアプリケーションを構築しています。ETLプロセスは、データソースから頻繁に増分ダンプを実行し、場合によっては完全なテーブルダンプを実行します。

フルダンプを実行するとき、mongoDBコレクション全体(インデックスとすべて)を置き換えたいと思います。

PHPチュートリアルでは、複数のドキュメントを挿入するためのこのアプローチを提案しています。

<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;

for ( $i = 0; $i < 100; $i++ )
{
    $collection->insert( array( 'i' => $i, "field{$i}" => $i * 2 ) );
}
?>

ただし、数百万のドキュメントがある場合、これにより、mongoDBへの数百万の接続が発生します。これは、特にリモートDBでは明らかに大きなボトルネックになります。挿入が成功したことを確認するDBからのコールバックを待ちたいかどうかは言うまでもありません。

PHPドライバーでサポートされているmongoDBに、コレクション全体を大きな配列に置き換えて、DBへの単一の呼び出しを実行するメソッドはありますか?db.colleciton.drop()vs.などのmongoDBの場合も高速になると思いますdb.collection.remove()

それが不可能な場合は、PHPスクリプトが実行されているのと同じサーバーにマスターDBを配置し、それをリモートで複製する方が効率的でしょうか。このようにして、ローカルDBからの応答が速くなり、レプリケーションから少し遅れることがありますが、それによってPHPスクリプトが以前に利用可能になると思います。

助言がありますか?

ありがとう、

gm

4

1 に答える 1

4

ただし、数百万のドキュメントがある場合、これにより、mongoDBへの接続が数百万になります。

いいえ、接続は1つだけです。各反復後に接続が閉じられることはありません。

挿入が成功したことを確認するDBからのコールバックを待ちたいかどうかは言うまでもありません。

確かにそれを回避する簡単な方法はありません。あなたが実際に挿入された何かを知りたいのなら、あなたは得た...まあ、知っている。

db.colleciton.drop()とdb.collection.remove()のように、mongoDBの場合も高速になると思います。

MongoDBの内部と、レコードオブジェクトを解放する方法(優れたプレゼンテーション: http ://www.10gen.com/presentations/storage-engine-internals )drop()により、この場合、コレクションが文字通り「ドロップ」されるため、パフォーマンスが向上します。まっすぐ。それだけでなく、すべてのレコードオブジェクトが存在しなくなり、コレクションは再び使用されるのを待つフリーエクステントとして存在します。

コレクション全体を大きな配列に置き換えて、DBへの単一の呼び出しを実行するには?

コレクションを削除した後は、いつでもbatchInserthttp://php.net/manual/en/mongocollection.batchinsert.php )を使用できます。しかし、物事が失敗した場合は奇妙になり、フォールバックシナリオが必要になります。挿入を1つずつ行うことで、実際に1回の呼び出しで、処理を続行する必要があるかどうか、または介入が必要かどうかを判断できます。

インデックスに関するいくつかの注意事項は、データを挿入した後でインデックスを削除して再構築することです。そうすればはるかに高速です。

それが不可能な場合は、PHPスクリプトが実行されているのと同じサーバーにマスターDBを配置し、それをリモートで複製する方が効率的でしょうか。

場合によります。通常、アプリサーバーで実際にMongoDBを実行できるかどうかに関するワーキングセット。もう1つの考慮事項は、単一障害点です。セカンダリが離れており、mongodこの利点を提供するためにアプリサーバー上のシングルに依存することになります。したがって、フェイルオーバーがある場合、この利点を維持することはできません。

理論的には、ローカルでホストされている時間が空いた後、これを実行してセカンダリRP_PRIMARYw1で使用し、複製することを妨げるものは何もありません。MongoClientmongod

于 2013-02-08T15:09:33.420 に答える