sql >> データベース >  >> NoSQL >> MongoDB

MongoDBの耐久性と書き込みの安全性を理解する

    耐久性は、従来のリレーショナルデータベース管理システム(RDBMS)で普及している「ACID」プロパティ(A –原子性、C –一貫性、I –分離)の「D」です。耐久性とは、書き込まれたデータが保存され、永続的に存続することを保証するものです。 MongoDBのようなNoSQLデータベースを使用すると、開発者は書き込み呼び出しの耐久性をきめ細かく制御できます。これにより、開発者は、さまざまなクラスのデータに対してさまざまな耐久性、安全性、およびパフォーマンスのモデルを選択できます。ただし、これは、さまざまな書き込み安全オプションのニュアンスを識別して理解するための開発者の負担にもなります。この投稿では、Javaドライバーで提供される書き込みの安全性に関するさまざまなオプションについて説明します。

    MongoDBの用語では、これは「懸念の書き込み」と呼ばれます。書き込みの懸念は「弱い」から「強い」までさまざまです。書き込みの懸念が弱いとスループットが高くなる可能性がありますが、データの安全性は低くなり、書き込みの懸念が強いとその逆になります。

    Javaドライバーを使用すると、いくつかの伸縮コンストラクターを使用して書き込みの安全性オプションを指定できます。すべてのオプションを備えたコンストラクターは次のとおりです。

    WriteConcern(int w, int wtimeout, boolean fsync, boolean j, boolean continueOnError)
    

    ご覧のとおり、このコンストラクターには多くのオプションがあります。開発者が簡単に使用できるように、一般的な書き込みの懸念値(Unacknowledged、Acknowledged、Journalled、Fsynced、Replica Acknowledged)に「タグ」が用意されています。各タグは、上記のコンストラクターの特定の呼び出しにマップされます。

    未確認のMongoDBモード

    これは「ファイアアンドフォーゲット」モードです。 MongoDBドライバーは、書き込み操作の受信を確認しようとはしません。たとえば、MongoDBサービスがダウンしていて、このモードを使用している場合、すべてのエラーは黙って無視され、データは失われます。明らかに、このモードは、特定の量のデータの損失よりも書き込みスループットが重要である価値の低いデータにのみ使用する必要があります。このモードは次のように指定できます。

    new WriteConcern(0) / WriteConcern.UNACKNOWLEDGED
    

    確認済みのMongoDBモード

    これは、MongoDBのデフォルトの書き込みモードです。このモードでは、MongoDBドライバーはサーバーでの書き込み操作の受信を確認しようとします。これにより、ドライバーはネットワークエラー、重複キーエラーなどをキャッチできます。ただし、これはデータがディスクに保存されることを保証するものではありません。書き込みを確認した後、ディスクにコミットする前にMongoDBサーバーがクラッシュした場合、データは失われます。このモードは次のように指定できます。

    new WriteConcern(1) / WriteConcern.ACKNOWLEDGED
    

    ジャーナリングされたMongoDBモード

    このモードでは、MongoDBサーバーは、データをジャーナルにコミットした後にのみ書き込みを確認します。このモードを使用すると、サーバーの再起動時にサーバーがクラッシュした場合でも、データはジャーナルから再適用されます。明らかに、これを機能させるにはジャーナルを有効にする必要があります。すべての本番システムでジャーナリングを有効にする必要があります。これについて詳しくは、投稿「MongoDBジャーナリングを有効にする必要がありますか?」をご覧ください。

    レプリカセットのシナリオでは、ジャーナル書き込みの懸念はプライマリにのみ適用されます。デフォルトでは、ジャーナルは100ミリ秒ごとにディスクにコミットされます。ジャーナルオプションで書き込みを指定すると、ジャーナルは30ミリ秒でディスクにコミットされます。したがって、書き込みごとにj:trueを指定すると、スループットは最大1000/30=33.3書き込み/秒になります。より高いスループットが必要な場合は、更新をバッチ処理し、バッチの最後の更新にj:trueを設定する必要があります。このモードは次のように指定できます。

    WriteConcern( 1, 0, false, true ) / WriteConcern.JOURNALLED
    

    同期されたMongoDBモード

    このモードでは、MongoDBサーバーは、書き込みがディスクに書き込まれた後にのみ書き込みを確認します。このモードは次のように指定できます。

    new WriteConcern(true) / WriteConcern.FSYNCED
    

    レプリカが承認したMongoDBモード

    以前の書き込み安全モードは、単一のサーバーにのみ適用されます。レプリカセットを実行する場合、成功したと見なされる前に書き込む必要のあるレプリカの数を制御するオプションがあります。たとえば、書き込みの懸念が「w:2」の場合、書き込みが成功したと見なされる前に、書き込みを1つのプライマリと少なくとも1つのセカンダリに書き込む必要があります。これによりスループットが低下しますが、安全性が向上します。レプリカの数を事前に知らない場合は、WriteConcern.MAJORITYタグを使用して、データがレプリカの大部分に確実に保存されるようにすることができます。これはMongoDBで最も安全なオプションです。このオプションを使用する場合は、必ず「wtimeout」値を設定して、コマンドが失敗を返すまでの待機時間を示してください。

    new WriteConcern(2)/ REPLICA_ACKNOWLEDGED
    new Majority()/ WriteConcern.MAJORITY
    

    次のタグは廃止されました(または廃止される予定です)– ERRORS_IGNORED、NORMAL、SAFE、FSYNC_SAFE、JOURNAL_SAFE、REPLICAS_SAFE。これらのオプションの代わりに、新しいオプションを使用してください。いつものように、コメントや質問がある場合は、[email protected]までご連絡ください。


    1. ドキュメントの配列内のオブジェクトをどのように更新しますか(ネストされた更新)

    2. Mongoは、2つ以上のフィールドのエントリの重複を検索します

    3. JSON形式の「説明」からオンザフライでMongooseスキーマを定義する

    4. MongoDB SELECT COUNT GROUP BY