1

Node.js アプリケーションを介してデータを挿入し、node-mongodb-nativeライブラリを使用して mongodb に接続しています。Mongo DB は、合計 5 つのシャードでシャーディングされます。ノードと mongos インスタンスは、14980MB の RAM を備えたクアッド コア AWS インスタンスに含まれています。2 つのシャードと構成サーバーは単一のコア インスタンスに含まれ、残りの 3 つのシャードは単一のコア プロセッサを備えた別のインスタンスにあります。

Node.js テスト スクリプトを使用して、1000 レコードを同時に 9 秒で効果的に挿入できます。

10000 件の同時挿入の場合、そのうち約 2000 件が失敗し、次のエラー メッセージが返されます。

    [Error: failed to connect to [ip address of mongos]]

この 10000 回の挿入プロセス中、最初の 5000 回または 6000 回の挿入はエラーなしで成功します。この間、CPU 使用率は比較的低いままです (13% の使用率)。次に、1 つのコアの CPU が約 75% に跳ね上がり、MongoDB は接続を拒否するというエラー メッセージをスローします。挿入に失敗した後、一部の書き込みが断続的に成功します。

Linux では ulimit -n を 20000 に設定しました。Node.js API の挿入関数内で poolSize=5 パラメーターを渡しました。

var responseHandlers = require('./responseHandlers')
    ,schemaValidation = require('./schemaValidation')
    ,mongoDb = require('mongodb')
    ,md5 = require('MD5')
    ,ObjectID = require('mongodb').ObjectID;

function insert(data, timestamp, response) {
  // validating the data to be inserted
  schemaValidation.validate(data, function(err) {
    if(err) {
      console.log(err);
      responseHandlers.invalidRequest(response, 2); 
    } else {
      //console.log("opening db..");
      server = new mongoDb.Server(mongoConfig.host,mongoConfig.port,{'auto_reconnect': true, 'poolSize': 5});
      db = new mongoDb.Db(mongoConfig.database, server, {w: 1});
      db.open(function(err, db) {
        if(err) { 
          console.log(err);
          responseHandlers.invalidRequest(response, 2); 
        } else {
          db.collection(mongoConfig.collection, function(err, collection) {
            if(err) {
              console.log(err);
              responseHandlers.invalidRequest(response, 2); 
            } else {
              //going to instantiate document fields
              var time = new Date().getTime(),
              oid = new ObjectID(),
              hash = md5(oid.toHexString()),
                            obj = {'data_utc' : timestamp, 'server_utc' : time, '_id' : oid,    'hash' : hash}; 
                            obj.data = data;
              //inserting..
              collection.insert(obj, {w:1}, function(err, result) {
                if(err) {
                  console.log(err);
                  responseHandlers.invalidRequest(response, 2); 
                } else {
                  console.log('Insert successful');
                  responseHandlers.validRequest(response, false, result);
                }   
              db.close();
              }); 
            }   
          }); 
        }   
      });   
    }   
  }); 
}   
exports.insert = insert;

接続を拒否し、挿入に失敗する理由を誰か助けてもらえますか? インサートの一部で機能し、途中で失敗するのはなぜですか?

4

2 に答える 2

0

この問題をトラブルシューティングするには、mongod コンソールで開いている接続の数を観察する必要があります。あなたが提供したコードサンプルに基づいて、おそらく挿入ごとに新しいmongodb接続を開いています。これを修正するには、「サーバー」のインスタンス化を、この関数の呼び出しに使用している制御ループの範囲外に移動してみてください。

于 2013-06-09T20:17:34.690 に答える