我们通过 Node.js 应用程序插入数据并使用node-mongodb-native库连接到 mongodb。Mongo DB 共有 5 个分片。节点和 mongos 实例包含在具有 14980MB RAM 的四核 AWS 实例上。两个分片和配置服务器包含在一个单核实例中,其余三个分片位于具有单核处理器的不同实例上。
我们可以使用 Node.js 测试脚本在 9 秒内有效地同时插入 1000 条记录。
对于 10000 个并发插入,其中大约 2000 个失败并返回以下错误消息:
[Error: failed to connect to [ip address of mongos]]
在这 10000 次插入过程中,前 5000 或 6000 次插入是成功的,没有错误。在此期间,CPU 使用率保持相对较低(13% 的使用率)。然后一个核心上的 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;
谁能帮忙解释为什么它会拒绝连接,无法插入?为什么它对一部分插入有效,然后在中途失败?