Назад | Перейти на главную страницу

MySql на ошибках тайм-аута подключения пула метаний Azure

У меня две виртуальные машины в Azure в одной виртуальной сети.

Одна виртуальная машина запускает процесс NodeJs, который отвечает за операции MySQL.

На другой виртуальной машине работает экземпляр MySQL. Я могу подключиться к нему с другой виртуальной машины и из процесса NodeJs.

Иногда он дает сбой и выдает ошибку о тайм-ауте подключения при получении подключения из пула.

Моя строка подключения использует локальный IP-адрес из виртуальной сети для доступа к базе данных, поэтому у нее должна быть такая большая задержка, чтобы превысить 10-секундный тайм-аут. Когда это работает, это быстро, я имею в виду очень быстро! Но иногда просто ломается и случайным образом снова начинает работать. Кто-нибудь сталкивался с этим?

Если это поможет, это экземпляр MySQL, основанный на Ubuntu Server 15.10.

Исключение:

{
  "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)"
  }
}

У меня есть процесс, который работает все время, и когда он некоторое время простаивает, соединения в пуле находятся в спящем состоянии. В конце концов MySQL очищает эти соединения на основе параметра wait_timeout в my.cnf. Как только это произойдет, и я попытаюсь использовать соединение, произойдет сбой, потому что модуль предполагает, что соединение все еще живо, и пытается использовать его только для получения тайм-аута или исключения соединения.

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