2014-02-14 74 views
0

我們正在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

+0

在我們嘗試使用node-mysql連接池之前。但是我們開始得到「No method query for undefined」或連接未找到類型錯誤。這可以與MySQL中的最大連接設置有關嗎? – user3151392

+0

「未定義的方法查詢」看起來非常像您不檢查第一個「err」參數。你可以嘗試登錄嗎? –

+0

主要問題('默默無法插入數據')聽起來很奇怪。如果你可以創建一個小型的自包含測試,請將其添加爲github問題,我將嘗試調試(mysql2作者在這裏) –

回答

2

我struggeled類似的問題。錯誤只是代碼中的拼寫錯誤(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); 
    }