簡體   English   中英

如何在 RDS 上正確使用帶有 MySQL 的 Knex / Bookshelf

[英]How to properly use Knex / Bookshelf with MySQL on RDS

我有一個Node.js應用程序,在帶有BookshelfKnex庫的AWS RDS上使用MySQL RDS 實例的max_connections值為90 我使用以下作為連接 object。

knex: {
  client: 'mysql',
    connection: {
      host: 'xxxxxxx.rds.amazonaws.com',
      user: 'xxx',
      password: 'xxxxx',
      database: 'xxxx',
      charset: 'utf8'
  },
  debug: true,
  pool: {
    min: 2,
    max: 20
  },
  acquireConnectionTimeout: 10000
},
const config = require('./environment');
const knex = require('knex')(config.knex);
module.exports = require('bookshelf')(knex).plugin('registry');
'use strict';

const bookshelf = require('../config/bookshelf');
const config = require('../config/environment');
module.exports = bookshelf.model(`TableA`, {
    tableName: 'TableA'
}, {});

我有很多請求伴隨着應用程序,有時會因以下錯誤而崩潰。

未處理的拒絕 TimeoutError:Knex:獲取連接超時。 游泳池可能已經滿了。 你錯過了 a.transacting(trx) 電話嗎?

錯誤:ER_CON_COUNT_ERROR:連接太多

此外,我在服務器PROCESSLIST中看到許多連接(平均 40 到 50 個),其中Commandsleep

我懷疑這些錯誤發生在服務器上的所有90連接完全使用/knex 嘗試從他的池中獲取新連接時。 什么可能是解決此問題的永久解決方案,以及處理此類應用程序的最佳實踐。

我不認為是導致問題的 RDS max_connections ,假設您在任何時候都只有一個上述應用程序代碼的實例。

您的應用程序使用數據庫連接池,最多可容納 20 個連接。 如果所有這些連接都在使用中,那么在您的情況下,應用程序最多等待acquireConnectionTimeout毫秒,即連接超時之前的10000毫秒。

所以我懷疑您的應用程序要么由於負載而需要處理大量數據庫查詢,要么有一些慢速查詢占用連接。 這會導致等待最終超時的連接的查詢積壓。 調查可能是這種情況並更新我們。

您可以在此期間嘗試的事情。

  • 增加acquireConnectionTimeout
  • 增加連接池大小。

如果是由慢查詢引起的,請在嘗試上述操作之前對其進行優化。

記錄慢速查詢的可能方法:

  • 在 RDS 上啟用慢查詢日志。
  • 假設您正在使用事務,則 Knex查詢事件以記錄事務持續時間。

當客戶端完成 MySQL 后,將其斷開。

另外,檢查wait_timeout的值。 降低它會強制斷開連接,而不是“睡眠”,直到你回來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM