【发布时间】:2014-02-14 14:08:05
【问题描述】:
我们正在 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 个小表(500 万行)。 据我们所知,对于这种负载,nodejs 和 mysql 都不应该失败 - 每秒 600-700 次简单插入。
我们还使用 redis.io 来存储经常需要的静态数据。这部分似乎工作顺利。
关于我们应该检查什么有什么想法吗?
PS 我们在 Windows server 2008 上运行它
【问题讨论】:
-
在我们尝试使用 node-mysql 连接池之前。但是我们开始收到“No method query for undefined”或未找到连接类型错误。这可能与mysql中的最大连接设置有关吗?
-
"No method query for undefined" 看起来很像你没有检查第一个 'err' 参数。你能试着记录一下吗?
-
主要问题('默默地不插入数据')对我来说听起来很奇怪。如果您可以创建小型自包含测试,请将其添加为 github 问题,我将尝试调试(此处为 mysql2 作者)
-
我们发现一些缺失的表出现了sql查询错误。我们现在已经解决了这个问题并观察了应用程序。我们将尽快为您提供详细的更新。非常感谢您在我们的查询中提供的信息。我们非常感谢您在 mysql2 上所做的工作。这对我们帮助很大。
标签: javascript mysql node.js node-mysql