繁体   English   中英

AWS RDS / EC2:超时错误:Knex:获取连接超时。 游泳池可能已满

[英]AWS RDS / EC2: TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full

我正在尝试使用knexbookshelf ORMNode js 8.12.0 API 检索用户模型。 数据库是Postgres 10.4

API 在本地运行良好,但托管在 ElasticBeanstalk EC2 和 RDS 上,出现错误:

未处理的拒绝 TimeoutError:Knex:获取连接超时。 游泳池可能已经满了。 您是否错过了 .transacting(trx) 电话?

我可以通过连接字符串/密码分别连接和查询 RDS 实例(在我输入后它会提示输入密码):

psql -h myinstance.zmsnsdbakdha.us-east-1.rds.amazonaws.com -d mydb -U myuser

安全组:

  • EC2 安全组(由 EB 设置)是sg-0fa31004bd2b763ce ,RDS 对 PostgreSQL / TCP / 端口 5432 / 匹配源( sg-0fa31004bd2b763ce )有入站安全规则 - 所以它看起来不像安全组是个问题

RDS 是在 VPC 中创建的,但 VPC 的安全规则也是开放的:

- security groups attached (multiple)
    - name: mysgname
    - group ID: sg-05d003b66fe1a4a94
    - Inbound rules: 
        - All Traffic (0.0.0.0/0) 
        - HTTP (80) for TCP (0.0.0.0/0) 
        - SSH (22) for TCP (0.0.0.0/0) 
        - PostgreSQL (5432) for TCP (0.0.0.0/0) 

可公开访问: Yes

用户控制器:

router.get('/users', function(req, res) {
    new User.User({'id': 1})
        .fetch({withRelated: ['addresses']})
        .then((user) => {
            res.send(user);
    });
});

文件:

production: {
    client: 'pg',
    version: '7.2',
    connection: {
        host: process.env.PG_HOST || 'localhost',
        port: process.env.PG_PORT || '5432',
        user: process.env.PG_USER || 'myuser',
        password: process.env.PG_PASSWORD || '',
        database: process.env.PG_DB || 'mydb',
        charset: 'utf8',
    },
    pool: {
        min: 2,
        max: 20
    },
},

首先,为什么这只发生在 AWS 托管环境而不是本地。 其次,我该如何解决这个问题? 我应该增加池的max吗?

您需要检查VPC中的网络访问控制列表(NACL),并确保正确配置了INBOUND和OUTBOUND。 安全组处于实例安全级别,而NACL是子网级安全。

大多数情况下,在连接到自定义VPC上的某个内容时遇到超时错误时,安全组或NACL或两者都会出现配置问题。

我有一个在heroku实例中运行的工作代码。 我已迁移到 EBS 并在此错误中停留了数小时。 Heroku 默认设置NODE_ENV=production ,我的节点中有相应的配置。

但是 EBS 默认没有设置NODE_ENV=production所以我的代码被破坏了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM