web-dev-qa-db-ja.com

mongodb接続タイムアウトエラー

Mongodbコレクションの接続と更新には、mongodbデータベースとnode.js v12.0.10を使用しました。接続コードは次のとおりです。

 async.parallel({
        RE5: function (cb) {
            MongoClient.connect(config.riskEngineDB, function (err, r5DB) {
                cb(err, r5DB);
            })
        },
        MDB: function (cb) {
            MongoClient.connect(config.monitoringDB, function (err, mDB) {
                cb(err, mDB);
            })
        }
    },
    function (err, DBs) {
        assert.equal(null, err);
        console.log("Connected correctly to Dbs");
        // ..doing updates..

 })

しばらく実行した後、スクリプトは次のエラーを出力しました。

  { [MongoError: connection 39 to 127.0.0.1:27017 timed out]
  name: 'MongoError',
  message: 'connection 39 to 127.0.0.1:27017 timed out' }

参考までに、mongodbの接続のさまざまなオプションを使用しましたが、意味がありませんでした。

13

クエリの返信に時間がかかりすぎたため、同様の経験がありました

ノードmongoドライバーには2つの構成可能なタイムアウトがあります。

connectTimeoutMSおよびsocketTimeoutMS、両方ともデフォルトで30秒( http://mongodb.github.io/node-mongodb-native/2.2/reference/connecting/connection-settings/

クエリが最初の結果を送信するのに30秒以上かかる場合、接続タイムアウトエラーで終了します。

クエリが2つの結果の間で30秒以上かかる場合、おそらくプールの縮小によりその接続が閉じられます。

タイムアウトを増やすか、クエリが十分に高速であることを確認します(たとえば、インデックスを作成します)。タイムアウトを増やすとパフォーマンスが低下する可能性があるため、クエリを高速化することをお勧めします。

8
Charly Koza

無料のオンラインmongodb大学のmongodb試験問題で出てきたので、私はこの答えを提供したかったです。それは徹底的であり、ドキュメントを提供します。

私はそれを理解し、主にレッスンの説明の欠如によって引き起こされる混乱を一掃します。私は批判的ではありませんが、この質問に適切に回答するにはさらなる説明が必要です。

まず、アプリケーションを介してmongodbに接続する場合、ドライバーを使用します。このドライバーには、mongodbサーバーで何かをするために通過しなければならない障壁があります。この障壁の概念を理解すると、この質問を理解できます。

最終的に物事のリストを作成するすべての接続は、障壁を通過して、最終的に書き込みまたは読み取り操作を実行するために発生する必要があります。

視覚的には次のように考えることができます:

IO /書き込み要求が発生==> || 1stバリア->(サーバー選択 err-> ---(serverSelectionTimeoutMS ))==> | | 2ndバリア->サーバーへの接続 err-> ---( 'connectionTimeoutMS' )==> || 3rdバリア->ソケット接続 err-> ---( 'socketTimeoutMS' )== ****書き込み懸念オプション障壁** ==> || 4thバリア-> '書き込み懸念仕様{w:<value>、j:<boolean>、wtimeout:<number>} ' ==> || 5thバリア->成功した書き込み/読み取り操作

*****注**:このパイプラインのどこでも、ロジックに基づいて障害が発生し、書き込み/読み取り操作が成功しない場合があります。

バリア1〜3は、接続性のネットワークバリアと考えることができます。ネットワークがダウンしている場合や問題が発生している場合、これらはタイムアウトとタイムアウトの例外処理を通じて気付く問題です。理解しなければならないのは、そもそもサーバーに接続できない場合、書き込みの懸念がある書き込み操作を実行できないことです。レッスンはこれらのポイントを説明できたかもしれません。

書き込みまたは読み取り操作に対する障壁の最初のセットは、サーバーへの接続を確立することです。これは、上でbarries 1〜3によって示されています。

次に、クラスターまたはクラスターのレプリカセットを介してサーバーに接続した後、書き込みの問題を定義できます。

接続を確立した後、ネットワーク接続以外の理由で書き込みが行われない場合があります。これらは、データの衝突や、DDOSやハッキングによる書き込みの極端な割り当て、または一般にデータをサーバーに書き込むための十分なサーバースペースではない場合があります。ポイントは、何か他のものが書き込み懸念への反応を引き起こす可能性があるため、書き込み懸念エラーを処理するためのオプションによる制御です。

それが私に質問と正しい答えをそれに応じて理解させたので、これが役立つことを望みます。ほとんどの場合、私たちはこれを本当に笑わなかったので、他の人がこのフィードバックループを学び、理解するのに役立つことを願っています。

この答え/結論に到達するために私が読んだ記事をいくつか紹介します。誰かが私の説明を改善したり改善したりした場合は、フィードバックをお寄せください。

https://scalegrid.io/blog/understanding-mongodb-client-timeout-options/

https://scalegrid.io/blog/mongodb-write-concern-3-must-know-caveats/

https://docs.mongodb.com/manual/reference/write-concern/

https://www.mongodb.com/blog/post/server-selection-next-generation-mongodb-drivers

2