几分钟后,Node Mongo插入静默失败

时间:2014-12-12 07:48:32

标签: node.js mongodb node-mongodb-native

我正在运行GPS监听程序。它从GPS设备接收数据,解码,准备最终数据对象,然后将数据存储在数据库中。 我试图使用以下代码从nodejs向mongodb插入文件 - (使用节点mongodb本机驱动程序)

var mong = require('mongodb');
var MongoClient = mongo.MongoClient
, format = require('util').format;

MongoClient.connect('mongodb://user:pass@a.b.c.d:27017/dbname', function(err, db) {
        if(err) {console.log("mongo connect error " + err); throw err};

        gpsdb = db;
        console.log("Database Ready");
        listener.listen(port);
        console.log("Listener Started on: " + port);
    });

// code to generate the object to insert - d_obj

var collection = gpsdb.collection(d_obj);
d_obj._id = new mong.ObjectID;
collection.insert(d_obj, {safe:true}, function(err, docs) {
    if (err) { console.log("mongo insert query error " + err); return; }
    console.log("Inserted 1 rec " + d_obj.imei);
    console.dir(docs);

});

启动程序后,插入操作会持续2-3分钟。插入停止后。但是,控制台日志不断出现。

示例日志 -

Inserted 1 rec 358811020044291
[ { dt_server: '2014-12-12 05:56:14',
 dt_tracker: '2014-12-12 05:56:09',
 lat: 19.123456,
 lng: 73.123456,
 angle: 81,
 speed: '47',
 signal_gsm: 3,
 signal_gps: 4,
 alarm: 'pcut',
 odo: 'y',
 offset: 0,
 time_stamp: 1418363774454,
 ltime: '2014-12-12 05:56:09',
 proto: 12,
 imei: '123456789123456',
 save_mysql: 'no',
 altitude: 0,
 _id: 548a837e4c73ebaef72d0073 } ]

只有在查询正确执行时才应执行console.dir(doc)。 我没有收到任何错误或警告。我正在为每个处理的数据对象调整此控制台日志。 但是插入不会在最初的几分钟后发生。

当我用一台设备发送数据测试程序时,它可以完美地工作几个小时。正确插入所有数据。 但是当我连接大约2000个设备运行它时,发生了无声失败。

我尝试从数据对象(d_obj)中删除具有null值的属性。这没有用。

我没有在任何地方定义任何架构或数据类型。

可能的原因

这似乎是异步插入的锁定问题。我在nodejs上的程序发送了许多并行插入。 当我正常运行程序时(以异步方式),以下是mongostat输出 -

connected to: 127.0.0.1
insert  query update delete getmore command flushes mapped  vsize    res faults        locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn set repl       time 
138     *0      1     *0      43    28|0       0   496g   992g  10.8g      1 ilogistek:144.8%          0       4|0     0|1    93k   101k    40 rs0  PRI   00:15:12 
143     *0      1     *0      70    73|0       0   496g   992g  10.8g      1 ilogistek:176.2%          0       6|0     0|1   106k   108k    40 rs0  PRI   00:15:13 
125     *0      1     *0      60    60|0       0   496g   992g  10.9g      2 ilogistek:124.2%          0       5|0     0|1    94k    95k    40 rs0  PRI   00:15:14 
181     *0      1     *0      77    96|0       0   496g   992g    11g      0 ilogistek:149.8%          0       6|0     0|1   135k   137k    40 rs0  PRI   00:15:15 
91     *0      1     *0      47    45|0       0   496g   992g  11.1g      0 ilogistek:127.0%          0       6|0     0|1    68k    70k    40 rs0  PRI   00:15:16 
211     *0      3     *0      74    94|0       0   496g   992g  11.2g      2 ilogistek:138.6%          0       6|0     0|1   152k   156k    40 rs0  PRI   00:15:18 
250     *0      2     *0      71    86|0       0   496g   992g  11.2g      5 ilogistek:203.9%          0      10|0     0|1   174k   176k    40 rs0  PRI   00:15:19 
270     *0      3     *0      76   111|0       0   496g   992g  10.9g      3  ilogistek:99.2%          0       5|0     0|1   197k   200k    40 rs0  PRI   00:15:20 
137     *0      3     *0      54    48|0       0   496g   992g  10.9g      8 ilogistek:137.7%          0       5|0     0|1    97k   100k    40 rs0  PRI   00:15:21 
203     *0      1     *0      83   114|0       0   496g   992g    11g      9 ilogistek:154.8%          0       4|0     0|1   153k   152k    40 rs0  PRI   00:15:22 

另一方面,当我以同步方式强制写入时(下一次写入前一次写入的回调),锁定不会发生,每秒写入次数会增加很多次。

insert  query update delete getmore command flushes mapped  vsize    res faults       locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn set repl       time 
1670     *0      1     *0     321   515|0       0   496g   992g  11.4g      0 ilogistek:15.7%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:47 
1830     *0      1     *0     344   621|0       0   496g   992g  11.4g      0 ilogistek:10.3%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:48 
1767     *0      1     *0     330   571|0       0   496g   992g  11.4g      1 ilogistek:14.5%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:49 
1726     *0      1     *0     337   599|0       0   496g   992g  11.4g      0 ilogistek:11.9%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:50 
1743     *0      1     *0     343   590|0       0   496g   992g  11.4g      0 ilogistek:10.9%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:51 
1758     *0      1     *0     336   605|0       0   496g   992g  11.4g      0 ilogistek:12.2%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:52 
1657     *0      1     *0     344   625|0       0   496g   992g  11.4g      0  ilogistek:9.9%          0       0|0     0|1     1m     1m    19 rs0  PRI   00:24:53 
1688     *0      1     *0     342   567|0       0   496g   992g  11.4g      0 ilogistek:10.6%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:54 
1689     *0      1     *0     344   610|0       0   496g   992g  11.4g      0 ilogistek:10.1%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:55 
1780     *0      1     *0     340   596|0       0   496g   992g  11.4g      0 ilogistek:10.8%          0       0|0     0|0     1m     1m    19 rs0  PRI   00:24:56

我无法以同步的方式运行我的程序,因为这将超越此技术堆栈的目的。

有什么东西显而易见我错过了。

大师,请帮忙!

0 个答案:

没有答案