【问题标题】:MySql on Azure Throwing Connection TimeoutsAzure 上的 MySql 引发连接超时
【发布时间】:2015-11-10 18:07:08
【问题描述】:

我在同一虚拟网络中的 Azure 上有 2 个虚拟机。

一个虚拟机运行一个负责 MySQL 操作的 NodeJs 进程。

其他虚拟机运行 MySQL 实例。我可以从其他 VM 和 NodeJs 进程连接到它。

从池中获取连接时,有时会失败并抛出关于连接超时的错误。

我的连接字符串使用虚拟网络中的本地 IP 地址来访问数据库,因此它应该有这么长的延迟以超过 10 秒的超时。当它起作用时它很快,我的意思是非常快!但有时它只是中断并随机重新开始工作。有人遇到过这种情况吗?

如果有帮助的话,这是一个基于 Ubuntu Server 15.10 的 MySQL 实例。

例外:

{
  "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 node.js ubuntu azure loopbackjs


【解决方案1】:

根据我的经验,有两种情况可能会引发您的问题。

连接数达到 MySQL 服务器的 max_connection 数,并且没有新的连接客户端可用的连接数。在这种情况下,您可以检查您的代码,是否在 MySQL 操作后释放连接。

另一方面,当您收到超时异常时,您可以登录 Azure 管理门户,在您的 VM 门户的监控页面中,检查指标是否达到 VM 的瓶颈,这也会出现您的问题。在这种情况下,您可以扩展您的 VM 以扩大您的 VM 硬件。

【讨论】:

    【解决方案2】:

    Node.js mysql 模块有几个options
    其中一个选项是“connectTimeout”,默认为 10000 毫秒(大约 10 秒)。

    如果这 10 秒内没有任何操作,连接会自动关闭。

    解决问题的方法是使用pooling connections

    这样,您就创建了一个连接池。每次需要执行查询时,它都会从池中获取一个连接并使用它,当它过期时,它会自动返回池中,准备重新启动,因此不会再出现连接超时错误。

    【讨论】:

    • 我已经在使用游泳池了。我做了一些挖掘,我最新的假设是 MySQL 服务器会终止睡眠连接,并且 NodeJs 池会在不知道它们已被终止的情况下保留它们,并且当我请求它失败时,因为连接已死。如何让池在一定时间后摆脱池中的连接?这样他们就可以与 MySQL 清理程序保持一致,因此双方都是最新的
    • 我也想知道这个!
    【解决方案3】:

    我有一个进程一直在运行,当它空闲一段时间时,池中的连接处于睡眠状态。最终,MySQL 会根据 my.cnf 中的 wait_timeout 设置清除这些连接。一旦发生这种情况并且我尝试使用连接,它将失败,因为模块假定连接仍然有效,并尝试使用它只是为了获得超时或连接异常。

    为防止这种情况,您可以覆盖 mysql 模块代码以支持池中的“连接生命周期”,或者停止使用池并管理您自己的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 2012-12-19
      • 2011-02-05
      • 1970-01-01
      • 2017-12-07
      • 2015-08-02
      相关资源
      最近更新 更多