我们正在node.js和mysql数据库(node-mysql2驱动程序)上构建一个实时GPS跟踪应用程序。
服务器是一个简单的TCP服务器,它接受来自GPS设备的传入数据,解析它们然后写入mysql表。 GPS设备登录到服务器,保留套接字然后开始发送位置(和其他)数据包。设备每10秒发送一次数据,每个数据包需要执行6个查询。
适用于最多100台设备。但是当尝试使用1000多个设备时,它会开始无声地失败。对于1000个设备,它将达到每秒约600个奇数查询。
大约700个设备登录并开始发送数据后,我们的系统突然停止在mysql表中插入数据。它不会抛出任何错误,显然似乎服务器运行良好。 服务器不断接受来自设备的数据并继续解析它们。我们的console.log语句执行,我们可以看到代码流正在执行到最后而不会抛出任何错误。 只是在一个时间点之后没有插入mysql(在我们的情况下,从开始大约4-5分钟并且大约有700个设备已经登录)。
我们正在使用此方法连接到Mysql -
var mysql = require('mysql2');
var connection = mysql.createConnection({
host : 'localhost',
port : 3306,
database : sample
user : sample
password : pwd
});
connection.connect(function(err) {
if(err){console.log("couldnt connect to mysql" + err)};
console.log("connected to mysql");
});
var sql_query1 = "SELECT `dt_tracker` FROM gs_tracker_data_"
+ imei + " ORDER BY dt_tracker DESC LIMIT 1" ;
connection.query(sql_query1, function(err,rows,fields)
{
if (err) { console.log("sql_query1 " + err); return; }
if(rows.length != 0)
{
//processing
}
});
var sql_query4 = "INSERT INTO gs_tracker_data_"
+ imei
+ " (`dt_server`, `dt_tracker`, `lat`, `lng`, " +
"`altitude`, `angle`, `speed`, `signal_gsm`, " +
"`signal_gps`, `offset`, `params`) VALUES ('"
+ decoded_data.dt_server + "','"
+ decoded_data.dt_tracker + "'," + decoded_data.lat
+ "," + decoded_data.lng + ","
+ 0 + "," + decoded_data.angle + ","
+ decoded_data.speed + "," + decoded_data.signal_gsm
+ "," + decoded_data.signal_gps + "," + 0 + ",'"
+ params + "')";
connection.query(sql_query4, function(err,rows)
{
if (err) { console.log("sql_query4 " + err); return; }
});
Mysql数据库中等大小(mysqldump大小现在约为35 GB)。这是一个非常简单的数据结构,具有30个小(<1000行)和1000个大表(> 500万行)。 从我们可以理解的情况来看,nodejs和mysql都不会因为这种负载而失败 - 每秒600-700次简单插入。
我们还使用redis.io存储经常需要的静态数据。这部分似乎没有任何障碍。
我们应该检查什么?
PS我们在Windows Server 2008上运行它
答案 0 :(得分:2)
我遇到了类似的问题。错误只是代码中的拼写错误(activeDb在'logger.info'中拼写错误)并且导致了mysql连接的无声失败。
connection = mysql.createConnection(activeDB);
connection.connect( error => {
if (error) {
logger.error("Database error: " + error);
res.status(503).send(error);
}
logger.info("Database " + activeDB.server);
res.status(200).send("Connected to " + activeDB.server);
});
} catch (error) {
logger.error("Database error ", error);
res.status(503).send("Database connection problem " + error);
}