我們正在node.js和mysql數據庫(node-mysql2驅動程序)上構建一個實時GPS跟蹤應用程序。Nodejs MySQL失敗無聲
服務器是一個簡單的TCP服務器,它接受來自GPS設備的輸入數據,解析它們,然後寫入mysql表。 GPS設備登錄到服務器,保留一個套接字,然後開始發送位置(和其他)數據包。設備每10秒發送一次數據,每個數據包需要執行6次查詢。
它適用於多達100個設備左右。但是,當嘗試使用1000個奇數設備時,它會以無聲方式開始失敗。對於1000臺設備,每秒鐘會產生大約600個奇數查詢。
大約700臺設備登錄並開始發送數據後,我們的系統突然停止在mysql表中插入數據。它不會拋出任何錯誤,顯然它似乎是服務器運行良好。 服務器不斷接受來自設備的數據並不斷解析它們。我們的console.log語句執行,我們可以看到代碼流正在執行到最後而沒有任何錯誤。 在某個時間點(在我們的例子中,從開始到大約700個設備登錄後大約4-5分鐘)之後,沒有插入mysql。
我們用這種方法連接到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服務器上運行,這2008
在我們嘗試使用node-mysql連接池之前。但是我們開始得到「No method query for undefined」或連接未找到類型錯誤。這可以與MySQL中的最大連接設置有關嗎? – user3151392
「未定義的方法查詢」看起來非常像您不檢查第一個「err」參數。你可以嘗試登錄嗎? –
主要問題('默默無法插入數據')聽起來很奇怪。如果你可以創建一個小型的自包含測試,請將其添加爲github問題,我將嘗試調試(mysql2作者在這裏) –