温馨提示×

Node.js应用在Linux上如何实现高可用

小樊
42
2025-11-16 19:09:16
栏目: 编程语言

Node.js应用在Linux上的高可用实践

一 架构总览

  • 进程层高可用:在单机上用 Node.js 内置 ClusterPM2 集群模式启动多个工作进程,充分利用多核并在进程崩溃时自动重启,提升稳定性与吞吐。
  • 服务层高可用:在主机前部署 Nginx/HAProxy 做反向代理与负载均衡,对外暴露 80/443,将流量分发到多个应用实例;支持健康检查与故障摘除。
  • 数据与存储高可用:数据库与缓存采用主从/副本集/集群等机制(如 MySQL 主从复制、MongoDB 副本集),避免单点。
  • 运行与编排:使用 Docker 容器化,配合 Kubernetes/Docker Swarm 做多实例编排、滚动升级与自愈。
  • 可观测性与自动化:接入 Prometheus/Grafana 监控与告警,集中日志(如 ELK),并通过 CI/CD 实现自动化构建、测试与发布。

二 单机多进程与进程管理

  • 使用 PM2 快速启用集群与守护
    • 安装与启动:
      • 安装:npm install pm2 -g
      • 启动:pm2 start app.js -i max(按 CPU 核心数启动工作进程)
      • 自启动:pm2 startup(按提示生成并启用开机自启脚本)
      • 常用:pm2 status/monit/logs/restart
    • 适用场景:快速获得进程守护、零停机重启、日志聚合与集群能力。
  • 使用 Node.js Cluster 模块
    • 核心思路:主进程 fork 多个工作进程共享同一端口;监听 exit 事件并重新 fork,实现故障恢复。
    • 示例:
      • const cluster = require(‘cluster’); const http = require(‘http’); const numCPUs = require(‘os’).cpus().length;
      • if (cluster.isMaster) { for (let i = 0; i < numCPUs; i++) cluster.fork(); cluster.on(‘exit’, (w) => console.log(‘worker’, w.process.pid, ‘died’)); }
      • else http.createServer((_, res) => res.end(‘ok’)).listen(3000);
    • 适用场景:需要更细粒度控制进程生命周期与自定义调度策略。

三 多机横向扩展与负载均衡

  • Nginx 反向代理与负载均衡示例
    • 安装(Ubuntu/CentOS):sudo apt install nginxsudo yum install nginx
    • 配置要点(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/*.conf):
      • upstream node_app { server 192.168.1.11:3000; server 192.168.1.12:3000; server 192.168.1.13:3000; }
      • server { listen 80; location / { proxy_pass http://node_app; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ‘upgrade’; 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; } }
    • 启用与验证:sudo systemctl enable --now nginx;访问域名/端口验证转发与健康检查。
  • 扩展建议
    • 结合 systemd容器编排 保证 Nginx 高可用(多实例 + Keepalived VIP)。
    • 在 upstream 中使用 least_connip_hash 等策略;为关键路径配置 主动健康检查熔断

四 容器化与编排

  • Docker 化最小示例
    • Dockerfile:
      • FROM node:18
      • WORKDIR /usr/src/app
      • COPY package*.json ./
      • RUN npm ci --only=production
      • COPY . .
      • EXPOSE 3000
      • CMD [“node”,“app.js”]
  • Docker Compose 快速多实例
    • docker-compose.yml:
      • version: ‘3’
      • services: app: build: . ports: [“3000”] deploy: replicas: 4
    • 启动:docker-compose up -d --scale app=4
  • Kubernetes 生产就绪
    • 建议以 Deployment 管理副本(如 replicas: 3)、Service 暴露端口、Ingress 提供域名与 TLS;结合 readiness/liveness 探针实现自动摘除与恢复。

五 数据库与缓存高可用及可观测性

  • 数据库高可用
    • MySQL 主从复制:主库开启 log_bin,从库配置 server-id/read_only 并执行 CHANGE MASTER TO …; START SLAVE; 实现数据冗余与读写分离。
    • MongoDB 副本集:部署 3/5/7 节点副本集,提供自动故障切换与数据高可用。
  • 可观测性与自动化
    • 监控告警:以 Prometheus 采集 Node.js/Prometheus Client 指标,Grafana 可视化与阈值告警。
    • 日志管理:集中收集到 ELK(Elasticsearch/Logstash/Kibana) 或 Loki,便于检索与故障复盘。
    • 发布与回滚:建立 CI/CD(如 Jenkins/GitLab CI)流水线,结合 滚动更新/蓝绿发布 降低变更风险。

0