温馨提示×

如何在CentOS上配置Node.js的高可用性

小樊
43
2025-11-27 18:23:09
栏目: 编程语言

在 CentOS 上构建 Node.js 高可用

一 架构总览

  • 进程级高可用:在每台服务器上用 PM2 集群模式启动多个 Worker,主进程异常退出会自动拉起,充分利用多核 CPU
  • 服务级高可用:多台服务器前部署 Nginx/HAProxy 做反向代理与负载均衡,单台节点故障不影响整体服务。
  • 数据与存储:会话使用 Redis 集中存储;数据库采用 MySQL 主从复制MongoDB 副本集 等方案,避免单点。
  • 监控与告警:用 PM2 monit/logs 做进程与日志观测,结合 Prometheus/Grafana 做指标可视化与告警。
  • 可选容器化:使用 Docker + Kubernetes 编排,结合 HPA 自动扩缩容,进一步提升弹性与可用性。

二 单机进程守护与集群化

  • 安装运行时与进程管理
    • 建议通过 NodeSourcenvm 安装 Node.js LTS;全局安装 PM2
    • 示例:
      • 使用 nvm:
        • curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
        • source ~/.bashrc
        • nvm install --lts
        • npm install -g pm2
      • 使用 NodeSource(示例为 Node.js 18):
        • curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
        • sudo yum install -y nodejs
        • sudo npm install -g pm2
  • 进程守护与开机自启
    • 使用 PM2 的配置文件 ecosystem.config.js
      • module.exports = {
        • apps: [{
          • name: “api-service”,
          • script: “./dist/main.js”,
          • instances: “max”, // 按 CPU 核心数启动
          • exec_mode: “cluster”,
          • env: { NODE_ENV: “production”, PORT: 3000 },
          • error_file: “/var/log/api-error.log”,
          • out_file: “/var/log/api-out.log”
        • }]
      • };
    • 常用命令:
      • pm2 start ecosystem.config.js
      • pm2 save
      • pm2 startup(按提示生成 systemd 服务,确保重启后自动拉起)
      • pm2 monit / pm2 logs
  • 会话与有状态数据
    • 集群/多实例下建议使用 Redis 集中存储会话,避免单机粘滞与状态丢失。

三 多机负载均衡与故障转移

  • 安装与启用 Nginx
    • sudo yum install -y nginx
    • sudo systemctl enable --now nginx
  • 负载均衡配置示例(/etc/nginx/conf.d/api.conf)
    • upstream node_cluster {
      • least_conn; # 或轮询
      • server 10.0.1.11:3000 max_fails=3 fail_timeout=30s;
      • server 10.0.1.12:3000 max_fails=3 fail_timeout=30s;
      • server 10.0.1.13:3000 max_fails=3 fail_timeout=30s;
      • keepalive 64;
    • }
    • server {
      • listen 80;
      • server_name api.example.com;
      • location / {
        • proxy_pass http://node_cluster;
        • proxy_http_version 1.1;
        • proxy_set_header Host $host;
        • proxy_set_header X-Real-IP $remote_addr;
        • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        • proxy_set_header X-Forwarded-Proto $scheme;
        • proxy_next_upstream error timeout http_502 http_503 http_504;
      • }
    • }
  • 健康检查与故障转移要点
    • 使用 max_fails/fail_timeoutproxy_next_upstream 实现被动健康检查与自动摘除异常节点。
    • 如需更强的控制与观测,可改用 HAProxy 的主动健康检查与统计页面。

四 数据与后端高可用

  • 数据库高可用
    • MySQL 主从复制:主库开启 binlog,从库基于复制用户同步数据,实现读写分离与故障切换基础。
    • MongoDB 副本集:多节点副本集提供数据冗余与自动故障转移能力。
  • 共享存储与静态资源
    • 多实例共享上传/静态资源时,使用 NFS/GlusterFS 等方案,避免单点存储。
  • 监控与告警
    • 进程与日志:PM2 自带 monit/logs
    • 指标与可视化:部署 Prometheus/Grafana,采集 Node.js/Prometheus 客户端指标与 Nginx 状态,配置告警规则。

五 快速验证与上线检查

  • 进程与集群:pm2 list/monit 确认 Worker 数量与重启策略生效;日志无异常。
  • 负载均衡:对 Nginx 发起请求,验证返回正常;临时停掉某台后端,确认请求自动转发至健康节点。
  • 健康检查:观察 max_fails/fail_timeoutproxy_next_upstream 是否按预期摘除/恢复节点。
  • 会话一致性:登录后写入 Redis,重启或切换节点仍能读取会话。
  • 监控告警:在 Grafana 查看 QPS/延迟/错误率,确认告警通道可用。

0