Nodejs MySQL无声地失败

时间:2014-02-14 14:08:06

标签: javascript mysql node.js node-mysql

我们正在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上运行它

1 个答案:

答案 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);
    }