【问题标题】:How to protect db when using npm mysql library?使用 npm mysql 库时如何保护数据库?
【发布时间】:2017-12-21 09:21:12
【问题描述】:

如果db server同时有很多请求说QPS是100,而db server的连接限制是1000,那么如果请求是慢查询最终会得到inactivity timeout,此时我应该怎么做才能防止npm package mysql 创建新连接?

因为npm package mysql 会从连接对象池中删除连接对象,并出现inactivity timeout 之类的致命错误,并为创建新连接留出空间。

【问题讨论】:

  • 100 次查询/秒大约是中位数。 max_connections = 1000 相当高。连接应该在一段时间不活动(wait_timeout)后被丢弃。客户端不应长时间(数小时)挂在连接上。除了'npm',还有什么问题?
  • @Rick James,内置连接池将从池中删除可能出现致命错误(如inactivity timeout)的坏连接对象,套接字将发送一个FIN数据包,然后池将创建一个新的。如果超时查询持续了几个小时,并且 db 服务器最终将用完其连接。

标签: mysql node.js database performance database-connection


【解决方案1】:

对于高负载,您应该使用具有持久连接的连接池。这些通常在高级查询构建器和 ORM 中可用,例如 knexsequelize

但如果你不想使用它们,你也可以试试native pools

【讨论】:

  • 感谢您的回答。但是mysq 的池将删除一个致命错误连接并在请求继续时创建一个新连接,这可能会耗尽数据库服务器的连接限制
  • 您应该同时配置最大连接数、最大池和最大连接超时以避免达到连接限制。您还可以手动终止运行时间过长的连接。没有什么魔法能以另一种方式解决这个问题。
  • 如果负载很高,即使您将最大连接数设置为 10,它也可能创建许多连接。例如,我请求 QPS 1000 的数据库,每个请求都是慢查询许多count order by不使用索引,如果我模拟请求40分钟,数据库服务器有450个连接!
  • Needing 450 connections 告诉我您有一些缓慢的查询(需要调查)或连接未能及时disconnect
猜你喜欢
  • 1970-01-01
  • 2021-01-14
  • 2021-09-09
  • 1970-01-01
  • 2011-09-29
  • 2021-03-19
  • 2010-12-10
  • 2019-09-21
  • 1970-01-01
相关资源
最近更新 更多