You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AWS RDS MySQL与Node服务器夜间频繁断连问题求助

解决Node服务器连接AWS RDS MySQL夜间断连宕机问题

兄弟,我太懂这种夜间服务器突然宕机、排查多日毫无头绪的痛苦了!之前我也踩过类似的坑,结合AWS RDS和Node MySQL连接池的特性,给你几个亲测有效的解决方案:

一、先排查AWS RDS本身的连接超时配置

AWS RDS MySQL默认的wait_timeoutinteractive_timeout是8小时(28800秒),如果你的Node服务器夜间长时间没有数据库请求,空闲连接会被RDS主动断开,但Node连接池可能没及时感知到,下次请求时就会抛出连接失效错误,甚至导致未处理异常宕机。

  • 登录AWS控制台,找到你的RDS实例,进入「参数组」,检查这两个参数的值。如果设置得太短(比如30分钟),建议调整为8小时或更长(根据你的业务场景)。
  • 注意:修改参数组后需要重启RDS实例才会生效。

二、优化Node MySQL连接池配置(强烈建议换用mysql2驱动)

旧版的mysql模块连接池存在一些稳定性问题,换成mysql2会省心很多,它对连接池的错误处理和keepalive支持更完善。

示例配置(带自动保活和错误处理)

const mysql = require('mysql2/promise');

// 创建连接池
const pool = mysql.createPool({
  host: '你的RDS端点',
  user: '数据库用户名',
  password: '数据库密码',
  database: '目标数据库',
  connectionLimit: 10, // 根据服务器CPU/内存合理设置,不要过大
  waitForConnections: true, // 无可用连接时等待,而非直接报错
  queueLimit: 0, // 连接请求队列无限制
  enableKeepAlive: true, // 开启TCP保活,防止中间网络设备断开连接
  keepAliveInitialDelay: 30000, // 30秒发送一次保活包
  timeout: 27000000 // 连接超时时间设为7.5小时(比RDS的8小时短一点,主动回收旧连接)
});

// 监听连接池全局错误
pool.on('error', (err) => {
  console.error(`[连接池错误] ${err.message}`);
  // 常见的ECONNRESET之类的断连错误,连接池会自动销毁无效连接,无需手动处理,做好日志即可
});

// 封装获取有效连接的函数(自动检测连接可用性)
async function getValidDbConnection() {
  let connection;
  try {
    connection = await pool.getConnection();
    // 执行简单查询检测连接是否有效
    await connection.execute('SELECT 1');
    return connection;
  } catch (err) {
    console.error(`获取有效连接失败: ${err.message}`);
    if (connection) connection.release(); // 释放无效连接回池
    // 重试一次
    return await pool.getConnection();
  }
}

三、处理未捕获异常,避免服务器直接宕机

很多时候服务器宕机不是因为断连本身,而是断连后抛出的未处理异常导致进程崩溃。务必加上全局错误监听:

// 捕获未处理的同步异常
process.on('uncaughtException', (err) => {
  console.error(`[未捕获异常] ${err.stack}`);
  // 优雅关闭连接池后重启进程
  pool.end().finally(() => process.exit(1));
});

// 捕获未处理的Promise拒绝
process.on('unhandledRejection', (reason, promise) => {
  console.error(`[未处理Promise拒绝] 原因: ${reason.stack}, Promise: ${promise}`);
  // 同样做优雅处理
  pool.end().finally(() => process.exit(1));
});

四、用进程管理器做最后一道防线

即使前面的配置都做好了,也难免有极端情况导致进程崩溃。用pm2来管理Node进程,能实现自动重启:

安装并配置pm2

npm install pm2 -g

创建ecosystem.config.js

module.exports = {
  apps: [{
    name: '你的Node服务名称',
    script: 'server.js', // 你的启动文件
    autorestart: true, // 进程崩溃自动重启
    max_memory_restart: '1G', // 内存超过1G时自动重启
    env: {
      NODE_ENV: 'production'
    }
  }]
};

启动服务:

pm2 start ecosystem.config.js

五、排查中间网络设备的超时

如果你的Node服务器和RDS不在同一个VPC,或者经过NAT网关,要注意NAT网关的空闲连接超时默认是350秒(约6分钟)。这种情况下,开启TCP keepalive(就是前面配置的enableKeepAlive)就至关重要,它会定期发送数据包保持连接活跃,避免被NAT网关断开。

按照这些步骤调整后,应该能解决夜间断连宕机的问题。如果还是有问题,可以检查RDS的日志,看看夜间有没有异常重启或连接被强制断开的记录~

内容的提问来源于stack exchange,提问作者Lambert T

火山引擎 最新活动