7

MongoDBにはの書き込みメカニズムがありfire and forgetます。しかし、これは私の書き込みが最終的にディスクに書き込まれることを保証しますか?だから私がこのようなステートメントを持っているなら(pymongoで)

collection.insert(doc)     #not passing safe=True

上記のステートメントへの書き込みはすぐにはディスクに到達しないことを理解していますが、ディスクに到達する(おそらく翌日ま​​たは1週間後)か、紛失して二度と戻らないという保証があります。私のアプリケーションは、書き込みが同期的に行われることを望んでいませんが、数時間後であっても書き込みが行われることを望んでいます。

4

3 に答える 3

11

「ファイア アンド フォーゲット」(別名 MongoDB のデフォルトの書き込み) の意味は、ドライバーがサーバーで書き込みを確認しないことです。書き込みはネットワーク上に配置され、ドライバーはそれがネットワーク トランスポートに到達したことを確認しますが、それ以降は他のチェックは実行されません。

サーバーとネットワークが稼働している限り、書き込みは成功すると予想されます。ただし、これは、一意のインデックスに違反しているなどの問題を検出できないことも意味します。

書き込みは最初にメモリで行われ、少なくとも60 秒ごとにディスクにフラッシュされます。ジャーナリングがオンになっている場合、書き込みは 100 ミリ秒以内にジャーナルに記録されます。このジャーナルは、mongod の再起動時にクラッシュした場合に回復できます。

書き込みが mongod に行われ、メモリに正常に適用されたことを確認する場合は、safe=True を設定する必要があります。

于 2012-07-19T15:24:55.590 に答える
0

失われて二度と戻ってこない可能性があります。これは、停電、ハードウェア障害、またはその他の環境問題が原因で発生する可能性があります。ドキュメントが一意のインデックスに違反している場合にも発生する可能性があります。

safe=True挿入中にデータベース エンジン エラーが発生しなかったことを確認します。これにより、ドライバーgetLastErrorは書き込みの直後にコマンドを発行し、書き込みが一意のインデックスに違反している場合、または基になる Mongo の問題があった場合は、エラーが返されます。ただし、メモリ内書き込みとジャーナルへの書き込みの間に電力が失われた場合、これは役に立ちません。

コマンドが戻る前に書き込みが確実にジャーナルに行われるようにする (永続的)、または複製されるようにするために、オプションを渡すことができる他の多くのオプションがあります。私たちは一般的に、重要な書き込みには最低限ジャーナリング オプションを使用するよう人々に伝えています。getLastErrorsafe

于 2012-07-19T15:09:25.420 に答える