AWS RDS / EC2: TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full
AWS RDS / EC2: TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full
我正在尝试使用 knex
和 bookshelf ORM
从 Node js 8.12.0
API 检索用户模型。数据库是 Postgres 10.4
。
API 在本地运行良好,但托管在 ElasticBeanstalk EC2 和 RDS 上时,出现错误:
Unhandled rejection TimeoutError: Knex: Timeout acquiring a
connection. The pool is probably full. Are you missing a
.transacting(trx) call?
我可以通过连接字符串/密码分别连接并查询 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);
});
});
Knex文件:
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
所以我的代码被破坏了。
我正在尝试使用 knex
和 bookshelf ORM
从 Node js 8.12.0
API 检索用户模型。数据库是 Postgres 10.4
。
API 在本地运行良好,但托管在 ElasticBeanstalk EC2 和 RDS 上时,出现错误:
Unhandled rejection TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
我可以通过连接字符串/密码分别连接并查询 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);
});
});
Knex文件:
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
所以我的代码被破坏了。