Nodejs MySQL молча терпит неудачу

Мы создаем приложение GPS-отслеживания в реальном времени на базе данных node.js и mysql (драйвер node-mysql2).

Сервер представляет собой простой 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 ГБ). Это очень простая структура данных с 30 маленькими (‹1000 строк) и 1000 большими таблицами (более 5 миллионов строк). Из того, что мы можем понять, ни nodejs, ни mysql не должны отказывать при такой нагрузке - 600-700 простых вставок в секунду.

Мы также используем redis.io для хранения часто необходимых статических данных. Эта часть, кажется, работает без сучка и задоринки.

Любые мысли о том, что мы должны проверить?

PS Мы запускаем это на Windows Server 2008


person user3151392    schedule 14.02.2014    source источник
comment
Прежде чем мы попытались использовать пул соединений node-mysql. Но мы начали получать запрос «Нет метода» для неопределенного типа или ошибки типа «соединение не найдено». Может ли это быть как-то связано с максимальными настройками подключения в mysql?   -  person user3151392    schedule 15.02.2014
comment
Ни один запрос метода для неопределенного не выглядит очень похоже на то, что вы не проверяете первый параметр «ошибка». Можешь попробовать записать?   -  person Andrey Sidorov    schedule 20.02.2014
comment
Основная проблема («молча не вставляет данные») звучит для меня очень странно. Если вы можете создать небольшой автономный тест, добавьте его как проблему github, и я попытаюсь отладить (здесь автор mysql2)   -  person Andrey Sidorov    schedule 20.02.2014
comment
Мы обнаружили, что для некоторых отсутствующих таблиц возникали ошибки запросов sql. Мы исправили это сейчас и наблюдаем за приложением. Мы дадим вам подробное обновление в ближайшее время. Большое спасибо за ваш вклад в наш запрос. Мы очень ценим вашу работу над mysql2. Это было прекрасным подспорьем для нас.   -  person user3151392    schedule 21.02.2014


Ответы (1)


Я боролся с похожей проблемой. Ошибка была просто опечаткой в ​​​​коде (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);
    }
person alschytt    schedule 08.08.2017