我们有30个digitalocean droplets,每个都是针对web crm用户的,他们与knex.js共享同一个mysql数据库。由于几乎没有其他用户,我们得到了错误:
“er\u con\u count\u错误:连接太多”
“knex:获取连接超时。游泳池可能满了。您是否错过了一个.transacting(trx)电话?”
“包坏了。获取:1应为:0“
mysql托管在独立的服务器上,内存为4gb,有大量的空闲内存和cpu(超过50%)。
在我们的nodejs应用程序中,knex被称为singleton:
const knex = require('knex')({
client: 'mysql',
connection: {
host: mySqlHost,
user: mySqlUser,
password: mySqlPass,
database: mySqlDb
}
})
module.exports = {
knex
};
那么,为什么我们的mysql即使默认最大连接数为150个,也有可能达到连接数限制呢(因为我们说的是30个用户,他们做了很多读写操作,但毕竟是30个用户)?!
根据http://knexjs.org/#installation-客户端“对于mysql和pg库,连接池的默认设置为min:2,max:10”-将其增加到50安全吗?!knex文档没有很好地解释他们的池概念,而是引用了https://github.com/vincit/tarn.js 对于“更多细节”,没有任何关于mysql的细节。
非常感谢您的帮助。
p、 我们意识到共享数据库会导致性能问题,但我们正在考虑当我们接触到成千上万的用户时进行迁移,从常识上讲,这是我们对mysql的期望。现在我们有30多个用户的性能问题。
1条答案
按热度按时间hgtggwj01#
我们有30个digitalocean droplets,每个都是针对web crm用户的,他们与knex.js共享同一个mysql数据库。由于几乎没有其他用户,我们得到了错误:
如果我在这里理解正确的话https://www.digitalocean.com/products/droplets/ 是独立的虚拟服务器。因此,如果您正在运行30个单独的节点进程来初始化“相同”的knex示例,那么就不可能在它们之间实际共享同一个单例knex示例。每个节点进程初始化它自己的副本。
因此,当您创建了30个knex示例并且默认情况下knex以池大小10初始化时,将尝试创建最多300个到db的连接。
根据http://knexjs.org/#installation-客户端“对于mysql和pg库,连接池的默认设置为min:2,max:10”-将其增加到50安全吗?!knex文档没有很好地解释他们的池概念,而是引用了https://github.com/vincit/tarn.js 对于“更多细节”,没有任何关于mysql的细节。
没有什么特别的mysql要说,也没有理由为什么knex应该复制
tarn.js
库(或mysql数据库/驱动程序)文档。可以安全地将其增加到数据库配置允许的任何数字。尽管在您的情况下,如果您运行30个knex示例,最大连接数应该比数据库硬限制少30倍。
处理连接同一个数据库的多个knex进程有点复杂,我只想考虑将mysql服务器的连接限制提高到500个或更多,以便它能够为您的30个水滴提供服务,每个水滴最多可能使用10个连接。
p、 我们意识到共享数据库会导致性能问题,但我们正在考虑当我们接触到成千上万的用户时进行迁移,从常识上讲,这是我们对mysql的期望。现在我们有30多个用户的性能问题^
共享同一个数据库可能会或可能不会导致性能问题。。。这完全取决于对数据库进行何种类型的查询。