MySql nos erros de tempo limite de conexão do Azure Throwing Pool

1

Eu tenho 2 máquinas virtuais no Azure na mesma rede virtual.

Uma máquina virtual executa um processo NodeJs que é responsável pelas operações do MySQL.

Outra máquina virtual executa uma instância do MySQL. Eu posso me conectar a ele da outra VM e do processo do NodeJs.

Às vezes, ele falhará e lançará um erro sobre o tempo limite da conexão ao adquirir uma conexão do pool.

Minha string de conexão usa um endereço IP local de dentro da Rede Virtual para acessar o banco de dados, portanto, deve ter esse atraso para exceder um tempo limite de 10 segundos. Quando funciona, é rápido, quero dizer muito rápido! Mas às vezes apenas quebra e aleatoriamente começa a trabalhar novamente. Alguém já se deparou com isso?

Se houver alguma ajuda, esta é uma instância do MySQL baseada no Ubuntu Server 15.10.

Exceção:

{
  "error": {
    "name": "Error",
    "status": 500,
    "message": "connect ETIMEDOUT",
    "errorno": "ETIMEDOUT",
    "code": "ETIMEDOUT",
    "syscall": "connect",
    "fatal": true,
    "stack": "Error: connect ETIMEDOUT
            at PoolConnection.Connection._handleConnectTimeout (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/Connection.js:375:13)
            at Socket.g (events.js:180:16)
            at Socket.EventEmitter.emit (events.js:92:17)
            at Socket._onTimeout (net.js:327:8)
            at Timer.unrefTimeout [as ontimeout] (timers.js:412:13)
            --------------------
            at Protocol._enqueue (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/protocol/Protocol.js:135:48)
            at Protocol.handshake (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/protocol/Protocol.js:52:41)
            at PoolConnection.connect (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/Connection.js:123:18)
            at Pool.getConnection (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/Pool.js:45:23)
            at MySQL.executeSQL (projectdir/node_modules/loopback-connector-mysql/lib/mysql.js:200:12)
            at projectdir/node_modules/loopback-connector-mysql/node_modules/loopback-connector/lib/sql.js:408:10
            at projectdir/node_modules/loopback-datasource-juggler/lib/observer.js:175:9
            at doNotify (projectdir/node_modules/loopback-datasource-juggler/lib/observer.js:93:49)
            at MySQL.ObserverMixin._notifyBaseObservers (projectdir/node_modules/loopback-datasource-juggler/lib/observer.js:116:5)
            at MySQL.ObserverMixin.notifyObserversOf (projectdir/node_modules/loopback-datasource-juggler/lib/observer.js:91:8)"
  }
}
    
por Daniel Wardin 10.11.2015 / 18:54

1 resposta

0

Eu tenho um processo em execução o tempo todo e quando ele fica ocioso por algum tempo, as conexões no pool estão em estado de suspensão. Eventualmente, o MySQL limpa essas conexões com base na configuração wait_timeout em my.cnf. Uma vez que isso acontece e eu tento usar uma conexão, ele falhará porque o módulo assume que a conexão ainda está ativa e tenta usá-lo apenas para obter um tempo limite ou uma exceção de conexão.

Para evitar isso, você pode sobrescrever o código do módulo mysql para suportar a "duração da conexão" no pool ou parar de usar o pool e gerenciar suas próprias conexões.

    
por 11.12.2015 / 10:02