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