2016-11-21 8 views
0

У меня есть приложение nodeJs, которое получает запросы от 0 до 3000 запросов в минуту (нерегулярно, без шаблона). Около 80% -90% запросов вызывают операции вставки или обновления mysql. версияКакие возможные причины могут вызвать проблему с ограничениями на ограничение очереди mysql в nodejs

Node - 4.2.2
Mysql версия - 14,14 Distrib 5.5.44, для Debian-Linux-гну (x86_64) с использованием Readline 6,2
рамки nodejs используется Restify

Я получаю связи из пула соединений mysql размера 20.

Время от времени (спорадическое) см. в вопросе «предел очереди mysql». Что, возможно, может вызвать эту проблему? (Кроме следующих причин)

  1. соединения не закрыто должным образом
  2. размера
  3. очереди не достаточно (Как я могу определить оптимальный размер очереди?)
  4. Проблемы с nodejs или MySQL версий (какие версии могут быть использованы для решения этой проблемы?)
  5. Проблема в MySQL запросов (какие возможные проблемы могут быть там в запросах, связанных с этим вопросом?)
  6. Probelm с каркасом nodejs используется (ли с помощью expressJs решения это?)

Edit1 Вот кадр, как я опрошена базу данных

connectionPool.getConnection(function (err, conn) { 
    if (err) { 
     return callback(err); 
    } else { 
     let args = [param1, param2]; 
     let query = "SELECT..."; 

     conn.query(query, args, function (err, rows) { 
      conn.release(); 
      if (err) { 
       return callback(err); 
      } else { 
       return callback(null, rows); 
      } 
     }); 
    } 
}); 

Edit2 Вот конфигурации MySQL у меня есть на данный момент. Я не очень понимаю эти ценности. Они в порядке?

{ 
    "connectionLimit": 10, 
    "acquireTimeout": 60000, 
    "host": "*****", 
    "port": "3306", 
    "user": "*****", 
    "password": "****", 
    "database": "*****", 
    "charset": "UTF8_GENERAL_CI", 
    "debug": false, 
    "waitForConnections" : true, 
    "queueLimit" : 15000 
} 
+0

Какая структура вы используете для подключения к mysql в узле? Слишком много соединений должно дать вам еще одну ошибку, поэтому, скорее всего, не проблема. размер очереди, кажется, является конструктом вашей инфраструктуры nodejs для подключения к mysql, если я не ошибаюсь, поэтому проблема может быть здесь. Я очень сомневаюсь, что причиной этой проблемы является узел или mysql. –

+0

Я использую драйвер mysql nodejs для подключения db. Казалось, что это самый стабильный и популярный драйвер. https://www.npmjs.com/package/mackql –

+0

И да, размер очереди - это конструктор драйвера, выполненный с помощью кода nodejs. –

ответ

1

Это хорошая идея с точки зрения производительности, чтобы использовать так называемый «Пулы соединений».

Пул соединений - это механизм для поддержки кеша подключения к базе данных, чтобы соединение можно было повторно использовать после его выпуска. В Node.js MySQL пул может использоваться непосредственно для обработки нескольких соединений и, что более важно, повторно использовать соединение. Например:

var express = require("express"); 
var mysql  = require('mysql'); 
var app  = express(); 

var pool  = mysql.createPool({ 
    connectionLimit : 100, //important 
    host  : 'localhost', 
    user  : '***', 
    password : '***', 
    database : 'database_name', 
    debug : false 
}); 

function db_connect(req,res) {  
    pool.getConnection(function(err,connection){ 
     if (err) { 
      res.json({"code" : "error", "status" : "Error in database connection."}); 
      return; 
     }  
     console.log('Connection ID: ' + connection.threadId); 
     connection.query("SELECT * FROM `table1`",function(err,rows){ 
      connection.release(); 
      if(!err) { 
       res.json(rows); 
      }   
     });  
     connection.on('error', function(err) {  
       res.json({"code" : "error", "status" : "Error in database connection."}); 
     return;  
     }); 
    }); 
}  
app.get("/",function(req,res){ 
     db_connect(req,res); 
}); 
//Run on port 3000 
app.listen(3000); 
+0

Как определить значение, которое будет использоваться для переменной connectionLimit. FYI, системная переменная max_connections установлена ​​равной 151 (я думаю, что это значение по умолчанию). Я даже не знаю, какое значение для системной переменной max_connections должно быть. Можете ли вы немного объяснить об этом? –

+0

Трудно сказать - это зависит от нагрузки на ваш сервер. В общем случае значения между 100 и 500 для соединений будут достаточными для загрузки сервера с низким или средним уровнем нагрузки из моего опыта. – bodi0

+1

@PubuduDodangoda Этот предел - это то, что вы должны постоянно использовать. Если у вас много медленных запросов и высокий трафик, вам нужно больше доступных подключений. если у вас есть только быстрые запросы, вы можете быть в безопасности с меньшим количеством. Теперь, почему бы вам просто не разрешить газиллические связи? Ну, вы хотите, чтобы он был как можно ближе к вашему фактическому пределу, поэтому он может срабатывать, если что-то не так. Например, если соединения не закрываются правильно, запросы заканчиваются безумно долго и т. Д. Это случаи, когда вам нужно исследовать дальше, и вы не сможете легко заметить с высоким лимитом. –