阿里云 ECS 集群 + SLB 负载均衡 + CDN 加速 + RDS 数据库,支持万级 QPS,弹性扩容
按流量规模选择合适配置,先小后大,按需扩容
| 规模 | 预估 QPS | ECS 规格 | 数量 | 数据库 | 月费估算 |
|---|---|---|---|---|---|
| 起步级 | 100–500 | 4核8G | 2台 | RDS 2核4G | ¥500–800 |
| 成长级 | 500–5000 | 8核16G | 4台 | RDS 4核8G 主从 | ¥2000–4000 |
| 企业级 | 5000–50000 | 16核32G | 8台+ | RDS 集群 + 只读 | ¥8000–20000 |
| 大规模 | 50000+ | 弹性伸缩组 | 动态 | PolarDB / DRDS | ¥20000+ |
# VPC CIDR: 10.0.0.0/8 # 公网子网(SLB、Nginx) 公网子网: 10.1.0.0/24 # 可访问互联网 # 应用子网(Web/App 服务器) 应用子网: 10.2.0.0/24 # 通过 NAT 访问互联网 # 数据子网(数据库、Redis) 数据子网: 10.3.0.0/24 # 完全隔离,不能访问互联网 # 原则:数据库只允许应用子网访问,绝不暴露公网
将流量均匀分发到多台 ECS,实现高可用
# 添加 HTTPS 监听(443端口) 监听端口: 443 后端协议: HTTP(SSL 在 SLB 卸载) 后端端口: 80 SSL 证书: 上传 SSL 证书 会话保持: 开启(30分钟) 健康检查: HTTP 检查 /health 路径 # 添加 HTTP 监听(80端口)→ 重定向到 HTTPS 监听端口: 80 重定向到 HTTPS: 开启 # 后端服务器组 虚拟服务器组: 添加所有 ECS 实例 权重: 均等 100(或按配置调整)
// SLB 会定期请求此接口,返回 200 表示节点健康 app.get('/health', async (req, res) => { try { // 检查数据库连接 await db.query('SELECT 1'); // 检查 Redis 连接 await redis.ping(); res.status(200).json({ status: 'healthy', timestamp: new Date().toISOString(), uptime: process.uptime() }); } catch (err) { res.status(503).json({ status: 'unhealthy', error: err.message }); } });
调整工作进程、连接数、缓存、Gzip,最大化性能
user www-data; # worker_processes 设为 CPU 核心数 worker_processes auto; worker_rlimit_nofile 65535; events { worker_connections 10000; # 每个 worker 最大连接数 use epoll; # Linux 高性能 I/O 模型 multi_accept on; } http { # 基础优化 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 10000; # Gzip 压缩 gzip on; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml; # 限流(防刷) limit_req_zone $binary_remote_addr zone=api:10m rate=100r/s; limit_conn_zone $binary_remote_addr zone=conn:10m; # 静态文件缓存(提升性能关键) location ~* \.(css|js|png|jpg|gif|ico|woff2)$ { expires 30d; add_header Cache-Control "public, immutable"; } # API 限流 location /api/ { limit_req zone=api burst=200 nodelay; limit_conn conn 20; proxy_pass http://backend; } }
缓存热点数据,将数据库压力降低 90%
const redis = require('ioredis'); const client = new redis({ host: '你的Redis内网IP', port: 6379, password: '你的密码' }); // Cache-Aside 模式:先查缓存,没有再查数据库 async function getUserById(userId) { const cacheKey = `user:${userId}`; // 1. 查 Redis const cached = await client.get(cacheKey); if (cached) { return JSON.parse(cached); } // 2. 查数据库 const user = await db.query('SELECT * FROM users WHERE id = ?', [userId]); // 3. 写入 Redis,设置过期时间 1小时 await client.setex(cacheKey, 3600, JSON.stringify(user)); return user; } // 更新数据时同步删除缓存 async function updateUser(userId, data) { await db.query('UPDATE users SET ? WHERE id = ?', [data, userId]); await client.del(`user:${userId}`); // 清除缓存 }
主从架构,读写分离,自动备份,故障自动切换
const mysql = require('mysql2/promise'); // 主库:只用于写入 const writePool = mysql.createPool({ host: '主库内网地址', user: 'app_user', password: '密码', database: 'myapp', connectionLimit: 20 }); // 从库:只用于读取(可配置多个从库) const readPool = mysql.createPool({ host: '只读实例内网地址', user: 'app_user', password: '密码', database: 'myapp', connectionLimit: 50 // 从库承担更多连接 }); // 封装:insert/update/delete 走主库,select 走从库 const db = { write: (sql, params) => writePool.execute(sql, params), read: (sql, params) => readPool.execute(sql, params), };
流量高峰自动增加服务器,低谷自动缩减,节省成本
| 触发条件 | 动作 | 冷却时间 |
|---|---|---|
| CPU 平均使用率 > 70%(持续 5分钟) | 增加 2 台 ECS | 300秒 |
| CPU 平均使用率 < 30%(持续 15分钟) | 减少 1 台 ECS | 600秒 |
| 内存使用率 > 85% | 增加 2 台 ECS | 300秒 |
| SLB 活跃连接数 > 10000 | 增加 3 台 ECS | 180秒 |
# 1. 在一台基础 ECS 上完成所有环境安装和代码部署 # 2. 创建启动脚本(新机器启动时自动拉取最新代码) cat > /etc/rc.local << 'EOF' #!/bin/bash cd /var/www/myapp git pull origin main # 拉取最新代码 npm install --production # 安装依赖 pm2 start ecosystem.config.js # 启动服务 EOF chmod +x /etc/rc.local # 3. 控制台:ECS → 实例 → 创建自定义镜像 # 4. 弹性伸缩配置中使用此自定义镜像 # 5. 新机器启动约 2-3分钟即可自动加入服务
静态资源边缘节点分发,源站带宽降低 80%
<!-- 不要直接引用源站 --> <img src="/images/logo.png"> <!-- ❌ 走源站 --> <!-- 使用 CDN 域名,走边缘节点缓存 --> <img src="https://static.yourdomain.com/images/logo.png"> <!-- ✅ 走CDN --> <link rel="stylesheet" href="https://static.yourdomain.com/css/app.css"> <script src="https://static.yourdomain.com/js/app.js"></script>
问题发生前预警,秒级发现异常
| 监控指标 | 警告阈值 | 严重阈值 | 通知方式 |
|---|---|---|---|
| CPU 使用率 | 70% | 90% | 短信 + 钉钉 |
| 内存使用率 | 75% | 90% | 短信 + 钉钉 |
| 磁盘使用率 | 70% | 85% | 钉钉 |
| 接口错误率 | 1% | 5% | 短信 + 电话 |
| 接口响应时间 | >500ms | >2000ms | 短信 |
| 数据库连接数 | 80%上限 | 95%上限 | 短信 + 电话 |