7

私はmongodbで予期せず閉じられた接続をたくさん探してきましたが、接続を閉じたい人からの質問しか見つけることができません.

node-mongodb-native を使用してデータベースに接続していますが、一見ランダムな「エラー: 接続が閉じられました」というメッセージが表示され続けます。リクエストを手動で再試行すると(ブラウザの更新)、リクエストは機能します。

これの原因は何ですか?役立つ簡単なオプションはありますか?

次を使用してdbハンドルを取得しています:

     MongoClient.connect(connection_string, { auto_reconnect: true }, function (err, db) {
     //server code/routes in here
     }

私はhttps://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/connection/server.jsを調べていましたが、接続プールが一般的にどのように管理されているかについての私の限られた理解が私をつまずかせていることに気づきました上。サーバーの存続期間中、それらは開いたままになるという印象を受けました。誰か助けてくれませんか?

編集: mjhm のコメントを読んだ後、私は TCP キープアライブをより深く調べ始めました。これが Azure の行為である可能性があることを示唆するいくつかのサイトに出くわしました (そして、この質問は現在誤分類されています!)。どうやら、Azure ロード バランサーは 1 分間のアクティビティ後に接続を切断するようです。私は Azure Websites を使用しているため、当てはまる場合と当てはまらない場合がありますが、この洞察は新しい調査を開始するのに十分有望だと思います。詳細はこちらhttp://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx

4

1 に答える 1

5

から: http://christiankvalheim.com/post/32209721702/tcp-keepalive

TCP キープアライブ mongodb node.js ドライバーを使用しているときによく質問されるのは、応答を停止するソケットです。通常、これには 2 つのソースがあります。

アプリケーションと mongodb インスタンスの間にファイアウォールがあり、keepAlive を観察しません。

システムのソケット タイムアウトが高すぎるため、ソケットがハングしたままになり、閉じられません。最初の状況は、ソケット接続オプションを設定し、keepAlive を有効にし、ソケットにハード タイムアウト値を設定することで解決できます。これにより、正しく構成されたファイアウォールが接続を維持し、そうでない場合はタイムアウトになります。微調整するもう 1 つのことは、os tcp_keepalive_time です。基本的に、MongoDB のようなものには高すぎます (Linux ではデフォルトで 2 時間)。これを低く設定すると、デッド ソケットが正しくタイムアウトになり、ドライバが回復します。

それについてもっと読むための良いリンク。 http://www.mongodb.org/display/DOCS/Troubleshooting#Troubleshooting-Socketerrorsinshardedclustersandreplicasets

于 2013-01-05T02:06:56.133 に答える