- 首页 >
- 问答 >
-
编程语言 >
- Node.js应用在Linux上如何实现高可用
Node.js应用在Linux上如何实现高可用
小樊
42
2025-11-16 19:09:16
Node.js应用在Linux上的高可用实践
一 架构总览
- 进程层高可用:在单机上用 Node.js 内置 Cluster 或 PM2 集群模式启动多个工作进程,充分利用多核并在进程崩溃时自动重启,提升稳定性与吞吐。
- 服务层高可用:在主机前部署 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 nginx 或 sudo 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_conn 或 ip_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)流水线,结合 滚动更新/蓝绿发布 降低变更风险。