14

私はいくつかの重要なデータが含まれているプロジェクトに取り組んでいます。これは、ライトまたはサーバーがダウンした場合でも、それを失うことはできないことを意味します。データベースにはMongoDBを使用しています。挿入後にデータがデータベースにあることを確認し、1つの要素が挿入されていない場合は、バッチ全体をロールバックしたいと思います。トランザクションを必要としないことがMongoの背後にある哲学であることは知っていますが、データが「ブラックホール」に送信されるのではなく、挿入後に本当に安全に保存されるようにするにはどうすればよいですか。

  • 検索する必要がありますか?

  • 特定のmongoDBコマンドを使用する必要がありますか?

  • 1台のサーバーで速度を十分に満たす
    ことができ、ライトが消えても何も保証されない場合でも、シャーディングを使用する必要があり
    ますか?

最善の解決策は何ですか?

4

2 に答える 2

14

最善の策は、書き込みの懸念事項を使用することです。これにより、MongoDBにデータの重要性を伝えることができます。最も速い書き込みの懸念も最も安全性が低くなります。データは、次にスケジュールされたフラッシュまでディスクにフラッシュされません。最も安全なのは、データが多数のマシンのディスクに書き込まれたことを確認してから、戻ることです。

あなたが探している書き込みの懸念は、FSYNC_SAFE(少なくともJavaドライバーの観点からはそれが呼ばれるものです)またはデータが複製されたことを確認するREPLICAS_SAFEです。

MongoDBには従来の意味でのトランザクションがないことに注意してください。これを行うようにMongoデータベースに指示することはできないため、ロールバックは手動でロールバックする必要があります。

もう1つ行う必要があるのは、比較的新しい--journalオプション(先行書き込みログを使用)を使用するか、レプリカセットを使用して多くのマシン間でデータを共有し、クラッシュ/電源喪失の場合にデータの整合性を最大化することです。

シャーディングは、特に大きなデータセットを処理するときに負荷を共有する方法として、ハードウェア障害に対する保護ではありません。シャーディングを、複数のマシン上の複数のディスクにデータを書き込む方法であるレプリカセットと混同しないでください。 。

したがって、データの価値が十分にある場合は、必要な復元力を提供するために、レプリカセットを使用する必要があります。おそらく、他のデータセンター/アベイラビリティーゾーン/ラックなどにスレーブを配置することもできます。

マスターがダウンした場合に選択された新しいマスターが同じデータ内の1つになるように、レプリカセット内の個々のノードの優先度を指定する方法があります(これがまだ実装されているかどうかは覚えていません)。そのようなマシンが利用可能な場合は中央に配置します(つまり、他の唯一のオプションでない限り、国の反対側のスレーブがマスターになるのを阻止します)。

于 2011-08-11T13:58:51.690 に答える
5

グーグルグループのGVPという人から本当にいい答えが届きました。私はそれを引用します(基本的にそれはリッチの答えになります):

挿入後にデータがデータベースにあることを確認し、1つの要素が挿入されていない場合は、バッチ全体をロールバックしたいと思います。

これは複雑なトピックであり、ここで考慮しなければならないいくつかのトレードオフがあります。

シャーディングを使用する必要がありますか?

シャーディングは書き込みをスケーリングするためのものです。データの安全性のために、レプリカセットを確認する必要があります。

特定のmongoDBコマンドを使用する必要がありますか?

最初に考慮すべきことは、Andreasによって示されている「セーフ」モードまたは「getLastError()」です。「安全な」書き込みを発行すると、データベースが挿入を受信して​​書き込みを適用したことがわかります。ただし、MongoDBは60秒ごとにディスクにフラッシュするだけなので、サーバーはディスク上のデータなしで失敗する可能性があります。

次に考慮すべきことは「ジャーナル」(v1.8 +)です。ジャーナル処理をオンにすると、データは100ミリ秒ごとにジャーナルにフラッシュされます。したがって、失敗するまでの時間枠は短くなります。ドライバには、「安全」よりも一歩進んだ「fsync」オプション(その名前を確認)があり、データがディスク(つまりジャーナルファイル)にフラッシュされたという確認応答を待ちます。ただし、これは1台のサーバーのみを対象としています。サーバーのハードドライブが停止した場合はどうなりますか?さて、あなたは2番目のコピーが必要です。

考慮すべき3番目のことはレプリケーションです。ドライバーは、戻る前に「このデータをNノードに複製する」という「W」パラメーターをサポートします。特定のタイムアウトの前に書き込みが「N」ノードに到達しない場合、書き込みは失敗します(例外がスローされます)。ただし、レプリカセット内のノードの数に基づいて「W」を正しく構成する必要があります。繰り返しになりますが、ジャーナリングを使用していてもハードドライブに障害が発生する可能性があるため、レプリケーションを確認する必要があります。次に、データセンター間でのレプリケーションがありますが、これは長すぎてここに入ることができません。最後に考慮すべきことは、「ロールバック」するための要件です。私の理解では、MongoDBにはこの「ロールバック」機能がありません。バッチ挿入を実行している場合、どの要素が失敗したかを示すのが最良の結果になります。

これに関するPHPドライバーへのリンクは次のとおりです。http://it.php.net/manual/en/mongocollection.batchinsert.php レプリケーションとWパラメーターの詳細を確認する必要があります。ここでも同じ制限が適用されると思います。

于 2011-08-12T06:34:29.980 に答える