MongoDB書き込み注目

3901 ワード

MongoDBは、データベースの書き込み操作が情報を返す保証レベルを記述するための書き込みの関心を提供します.書き込みの関心の強さは保証のレベルを決定します.挿入,更新,削除が弱書き注目の場合,操作の戻り速度は速い.書き込みの関心が弱い場合は、書き込みに失敗した場合、書き込み操作が長続きしない可能性があります.書き込みの注目度が高いほど、クライアントはMongoDBの書き込み確認を待つ時間が長くなります.
MongoDBは、異なるアプリケーションのニーズをよりよく満たすために、異なる書き込み注目レベルを提供します.実際のMongoDB導入では、クライアントは重要な書き込み操作の持続性を確保するために、書き込みの関心レベルを調整する必要があります.他の重要でない書き込み操作では、クライアントは、より良いパフォーマンスを保証するために弱い書き込み関心に調整する必要があります.
書き込みの関心レベル
MongoDBは、以下の4つの書き込み関心レベルを定義し、弱いものから強いものまで順に定義します.
Unacknowledged
Acknowledged
Journaled
Replica Acknowledged
実際の応用ではClient Driverに書き込み注目を設定するのが一般的で、dbと同じである.getLastError()メソッドは大きく関係しています.一般に、Mongo Driverは、書き込み操作(insert,update,delete)を実行すると、すぐにdbを呼び出す.getLastError()コマンド.このようにして、さっきの書き込み操作が成功したかどうかを知る機会があり、エラーをキャプチャすれば、対応する処理を行うことができます.MongoDBサーバはエラーに関心がなく、Clientにエラーが発生したことを通知するだけです.
ここで2つ注意しなければならないことがあります:1.db.getLastError()メソッドはDriverが呼び出すので、ビジネスコードは明示的に呼び出す必要はありません.2.Driverがdbを呼び出す.getLastError()関数ですが、エラーがキャプチャされるとは限りません.これは主にWrite Concernの設定レベルに依存します.
Unacknowledged
このような書き込み関心レベルでは、MongoDBはすぐに結果を返し、書き込みエラーを無視するのと同じように書き込み操作を実行します.ただし、ドライバはネットワークエラーを受信および処理します.だからgetLastError()の戻り値はnullに違いないし、その後のApplyでエラーが発生してもDriverはわかりません.このレベルのWrite Concernを使用すると、Driverの書き込み呼び出しがすぐに戻ってくるので、性能は最高ですが、信頼性は最悪なので、推奨されません.各プラットフォームの最新バージョンのDriverでも、0をデフォルトレベルとしない.実はもう一つのw:-1のレベルはerror ignoredで、基本的にw:0とあまり差がありません.違いは、w:-1はエラーをキャプチャしませんが、w:0はnetwork errorをキャプチャできます.
Acknowledged
このような書き込み関心レベルでは、mongodは書き込み操作を確認し、メモリビューでデータの変更を完了します.クライアントは、ネットワーク、重複キーなどの他のエラーをキャプチャできます.Unacknowledgedとの違いは、MongoDBがApply(実際の書き込み操作)が完了した後にのみgetLastError()の応答を返すようになったことです.したがって,書き込み中にエラーが発生した場合,Driverはキャプチャし,処理を行うことができる.このレベルのWrite Concernは基本的な信頼性を備えています.しかし、Acknowledgedレベルの書き込み関心は、MongoDBのデフォルトの書き込み関心レベルであるシステムハードディスク(HDD)にデータが永続化されていることを保証しません.
Journaled
AcknowledgedレベルのWrite Concernも絶対的に信頼できるものではありません.MongoDBのApply操作はメモリにデータを書き込むので、定期的にfsyncでハードディスクに書き込みます.Applyの後、fsyncの前にmongodが切れたり、サーバが切れたりした場合、永続化は実際には失敗します.しかし、w:1のレベルでは、responseはApplyの後にDriverに戻ったため、Driverはこの場合のerrorを取得できません.MongoDBがこの問題を解決する方法は、Journalメカニズムを使用して、書き込み操作はメモリに書き込まれた後、journalファイルに書き込まれます.これにより、mongodが正常でない場合、再起動後、journalファイルの内容に基づいて書き込み操作を復元することができます.Driverレベルでは、w:1の設定に加えてjournal:trueまたはj:trueを設定して、この場合のerrorをキャプチャします.このような関心レベルでは、MongoDBは、書き込み操作がjournalログにデータを送信したことを保証することができる.この書き込み関心は、MongoDBがクラッシュした後にデータを復元することを保証します.もちろん、journalログ機能をオンにする必要があります.ただし、書き込み操作は次のログのコミットまで待たなければ結果を返さず、操作の遅延を減らすためにログのコミットの頻度構成を向上させる必要があります.
Replica Acknowledged
この書き込み注目レベルでは、SecondaryがPrimaryからコピーを完了した後にgetLastError()の結果が返されます.journal:trueまたはj:trueを同時に設定すると、journalの書き込みが成功するまで戻ってこないこともできます.ただし、Primaryのjournal書き込みを待つ必要はなく、Primaryのjournal書き込みを返すことに注意してください.同様にw:3を設定して、少なくとも3つのノードにデータがあることを示すこともできます.あるいはw:majorityは,>1/2のノードにデータがあることを示す.一般的に小規模なクラスタは3ノード配置であるため,w:2を構成すればよい.
小結
Write Concernレベルを設定することは、書き込み操作のパフォーマンスと信頼性のバランスをとることです.書き込み操作の待ち時間が長ければ長いほど、信頼性が向上します.非キーデータの場合はデフォルトのw:1を使用することを推奨し、キーデータの場合はw:1&j:trueを使用するとよい.ここでは、journalはどうしても開くことをお勧めします.j:trueを設定します.ただし、DriverがgetLastError()を呼び出した後、journalの書き込みが完了してから戻るかどうかを待つ必要があります.j:trueを設定せずにserver側のjournalを閉じたわけではありません.
getLastError()について
一般に、開発者が書くコードは、dbを自分で呼び出す必要はない.getLastError()関数は、Driverが書き込み操作のたびに、すぐに自動的に呼び出されます.
db.collection("test", {}, function(err, collection) {
    collection.insert({
        name: "world peace"
    },
    function(err, result) {
        assert.equal(null, err);
        console.log(result);
        db.close();
    })

});

このコードは、driverがinsert()の後、dbを暗黙的に呼び出す.getLastError()は、エラーがキャプチャされると、コールバック関数のerrパラメータに割り当てられます.違いは、エラーをキャプチャできるかどうかです.w:-1の場合、errは常にnullである(errorをキャプチャする機会がない).w:0ではnetwork errorを除いて一般的にはキャプチャされません.w:1でmongod applyにエラーが発生するとerrパラメータに渡されます.コードはすべて同じで、違いは設定したWrite Concernレベルにあります.詳しくはご参考くださいhttp://docs.mongodb.org/manual/reference/command/getLastError/.