温馨提示×

CentOS上Node.js数据库连接如何优化

小樊
45
2025-11-29 17:34:01
栏目: 编程语言

CentOS上Node.js数据库连接优化

一 连接池与驱动配置

  • 使用连接池而非单连接,优先选择支持 Promise 的驱动(如 mysql2/promisepg),便于 async/await 与统一错误处理。
  • 典型 MySQL 连接池示例(使用环境变量管理敏感信息):
// db.js
const { createPool } = require('mysql2/promise');
require('dotenv').config();

const pool = createPool({
  host: process.env.DB_HOST,
  port: parseInt(process.env.DB_PORT, 10),
  user: process.env.DB_USER,
  password: process.env.DB_PASS,
  database: process.env.DB_NAME,
  waitForConnections: true,     // 连接不足时排队等待
  connectionLimit: 10,          // 最大连接数(按负载与DB能力调整)
  queueLimit: 0,                 // 0 表示无限制排队
  enableKeepAlive: true,         // 保活,减少空闲被断开
  keepAliveInitialDelay: 0,
});

module.exports = pool;
  • 关键参数建议:
    • connectionLimit:从 10 起步,结合数据库 max_connections 与应用并发逐步压测调优。
    • waitForConnections / queueLimit:开启排队避免瞬时报错,队列过长需考虑扩容或优化慢查询。
    • idleTimeoutMillis / connectionTimeoutMillis(PostgreSQL 常用):如 idleTimeoutMillis=30000connectionTimeoutMillis=2000,及时回收空闲连接并快速失败。
    • 始终使用环境变量或 secret 管理凭证,避免硬编码。

二 SQL 与索引优化

  • 为高频查询条件建立合适的索引,避免全表扫描与不必要的 JOIN
  • 仅查询需要的列,分页与批量操作使用合适索引与 LIMIT/OFFSET 或游标。
  • 对大结果集使用流式处理或分页,减少内存占用与连接占用时间。
  • 定期分析执行计划,更新统计信息,必要时进行索引重建与归档冷数据。

三 缓存与架构层优化

  • 对不常变的数据使用缓存(如 Redis、内存缓存),设置合理 TTL,在数据库前形成多层缓存,显著降低连接与 QPS 压力。
  • CentOS 上使用 Nginx 作为反向代理与静态资源缓存,启用 HTTP/2/SSL/TLS,并可对多实例做 负载均衡,减少单实例数据库连接争用。
  • 读写分离与只读副本:将报表、搜索等读多写少流量路由到副本,缓解主库连接压力。
  • 连接治理:避免在请求作用域外长期持有连接;在 Express 等框架中使用中间件或依赖注入统一管理连接/事务生命周期。

四 CentOS 系统网络与资源调优

  • 调整内核网络参数(/etc/sysctl.conf),示例:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65535
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 2000

执行 sudo sysctl -p 使配置生效。

  • 提升文件描述符与进程数限制(/etc/security/limits.conf),避免 “Too many connections/open files”。
  • 选用 SSD、保证足够 内存/CPU,并对 Node.js 设置合理内存上限(如 --max-old-space-size),防止 OOM 影响连接稳定性。
  • 监控与维护:持续跟踪连接数、查询时延、错误率;定期备份、重建索引与更新统计信息。

五 监控排障与安全加固

  • 监控与诊断:
    • PostgreSQL 可用 pg_stat_activity 查看活跃/等待连接与慢查询;
    • 应用侧记录连接获取耗时、排队与超时,结合 APM/日志定位瓶颈。
  • 常见错误与处理:
    • ENOTFOUND:检查 DB_HOST 是否可解析、网络与防火墙策略;
    • 连接超时/队列溢出:适当提升 connectionLimit/queueLimit,并优化慢查询与引入缓存;
    • 空闲被断开:启用 keepAlive 与合理的 idleTimeoutMillis
  • 安全加固:
    • 使用环境变量或 secret 管理凭证,禁止硬编码;
    • 通过 防火墙 限制数据库访问来源,仅开放必要端口与网段;
    • 公网传输启用 TLS/HTTPS,避免明文凭据与数据泄露。

0