【发布时间】:2020-06-27 05:16:36
【问题描述】:
我们有 30 个 DigitalOcean 液滴,每个液滴用于 Web CRM 用户,它们与 knex.js 共享同一个 MySQL 数据库。 由于很少有其他用户,我们会收到错误:
- “ER_CON_COUNT_ERROR:连接太多”
- “Knex:获取连接超时。池可能已满。是否缺少 .transacting(trx) 调用?”
- “数据包乱序。得到:1 预期:0”
MySQL 托管在具有 4Gb RAM 的单独服务器上,并且有大量可用 RAM 和 CPU(超过 50%)。
在我们的 nodejs 应用程序 knex 中引用为单例:
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-client“对于 MySQL 和 PG 库,连接池的默认设置为最小值:2,最大值:10” - 将其增加到 50 是否安全? Knex 文档没有很好地解释他们的池概念,而是引用https://github.com/vincit/tarn.js 以获得“更多详细信息”,并且没有关于 MySQL 的任何详细信息。
非常感谢任何帮助。
附言我们意识到共享数据库会导致性能问题,但我们正在考虑在达到数千名用户时迁移它,并且从常识来看,这是我们对 MySQL 的期望。现在我们遇到了超过 30 个用户的性能问题。
【问题讨论】: