1.
概述与前提
- 前提:在新加坡区域(如AWS ap-southeast-1 / GCP asia-southeast1 / Azure Southeast Asia)已拥有账号、计费可用、并能创建VPC与实例。
- 目标:构建可自动扩缩的Web架构(负载均衡器 + 多台Web节点 + 自动扩容策略 + 健康检查 + DNS与HTTPS)。
2.
网络与子网设计(VPC/Subnet/Security Group)
- 步骤1:创建VPC,建议CIDR 10.0.0.0/16;在多个可用区(az)分别创建公共子网(如10.0.1.0/24,10.0.2.0/24)。
- 步骤2:创建Internet Gateway并绑定VPC,配置路由表指向IGW。
- 步骤3:创建Security Group:允许80/443入站,允许负载均衡器的健康检查端口,允许SSH仅限公司IP。
3.
准备可启动的镜像与启动脚本(AMI/Startup Script)
- 编写user-data脚本(cloud-init)示例(Ubuntu),自动安装Nginx、部署应用并注册健康检查路径:
#!/bin/bash
apt update -y && apt install -y nginx git curl
git clone https://your-repo.git /var/www/html || true
echo "OK" >/var/www/html/health.html
systemctl enable --now nginx
- 测试后创建AMI(或自定义镜像),用于Auto Scaling启动模板。
4.
创建负载均衡器(以AWS ALB为例)
- 控制台/CLI创建应用负载均衡器(ALB):选择前面公共子网、启用跨AZ。
- 创建Target Group:协议HTTP、端口80,健康检查路径/health.html,健康阈值与间隔建议:interval=30s, healthy=3, unhealthy=2。
- 在ALB上创建Listener:80转发到Target Group;如需HTTPS,申请ACM证书并在443 listener绑定证书。
5.
配置Launch Template与Auto Scaling Group(ASG)
- 创建Launch Template:选择AMI、Instance Type、Security Group、user-data脚本。
- 创建Auto Scaling Group:指定多个可用区、最小实例数min=2(建议),期望值desired=2,最大max根据预算设定。将ASG目标绑定到上面创建的Target Group。
6.
设置自动扩容策略(按CPU/请求/自定义指标)
- 推荐策略1(目标跟踪Target Tracking):按平均CPU利用率,例如目标50%,AWS会自动调整实例数。
- 推荐策略2(基于请求数/实例):使用ALB的RequestCountPerTarget指标,目标跟踪设置:每实例目标RPS值。
- 自定义策略:通过CloudWatch自定义指标(如队列长度、响应时间);设置报警触发ScalingPolicy。
7.
健康检查与冷却时间调整
- 健康检查:ALB层健康检查必须准确指向应用的轻量接口(/health.html),避免长running检查。
- 冷却时间(Cooldown):设置适当cooldown(如300s)避免抖动;设置伸缩保护策略以在部署期间锁定节点。
8.
会话保持与状态管理
- 无状态首选:将会话存在Redis/Memcached(托管如AWS Elasticache或Cloud Memorystore)。
- 如果必须使用Sticky Session:ALB支持基于Cookie的粘性,会话持续时间在Target Group设置,但不推荐作为长期解决方案。
9.
SSL/HTTPS与域名解析
- 申请证书:在新加坡区域使用ACM申请证书(或Let's Encrypt),绑定到ALB 443 Listener。
- DNS:将域名A记录或Alias指向ALB(AWS Route53可直接Alias到ALB);测试HTTPS与重定向(HTTP->HTTPS)。
10.
监控、日志与告警(生产级)
- 启用ALB访问日志保存到S3,启用实例的系统日志到CloudWatch Logs。
- 常用监控项:ALB 5xx、Target Healthy Count、平均响应时间、CPU、内存(需要agent上报)。
- 配置报警:当平均响应时间、错误率或CPU超过阈值时触发扩容或告警邮件/Slack。
11.
压测与验证(实战验证步骤)
- 准备压测机器(可在新加坡区域独立实例),安装siege/ab/jmeter。
- 示例命令:ab -n 10000 -c 200 http://your-domain/;观察ASG是否按策略扩容,并检查ALB目标是否健康且流量分布。
- 验证缩容:在压测停止后观察ASG是否在cooldown后缩容到设定min值。
12.
成本与优化建议
- 预留实例/Savings Plans:常驻基础负载可使用预留或Savings方案降低EC2成本。
- 右-sizing:监控后调整实例类型与最大/最小值,避免过度扩容。使用Spot实例作为非关键扩展节点以节省成本(注意回收策略)。
13.
故障恢复与蓝绿部署
- 灰度/蓝绿:使用ASG的版本切换或先创建新的Target Group并切换ALB Listener的转发规则,完成流量切换前先健康检查。
- 备份:AMI定期打包,数据库使用跨区域备份或托管服务的备份功能。
14.
常见问题与调优要点(小结)
- 关键点:健康检查路径必须轻量、ASG与Target Group必须关联、监控报警与冷却时间设置避免抖动、无状态化让扩容更平滑。
- 建议:先在测试环境做全流量压测并记录指标,再推到生产环境。
15.
问:在新加坡区域部署,用AWS和GCP哪个更合适?
- 答:AWS在新加坡(region ap-southeast-1)生态成熟、服务丰富(ALB/ASG/ACM/CloudWatch),若企业已有AWS生态优先;GCP(asia-southeast1)在负载均衡和自动扩缩上也很强,选择取决于成本、已有服务与技术栈。
16.
问:如何保证扩容后的实例能快速对外提供服务(冷启动问题)?
- 答:减少AMI启动脚本时间:把依赖打包进AMI、在user-data只做最小动作;预热策略可设置保持一定的最小实例数并使用预启动脚本预热缓存或JIT编译。
17.
问:如果需要跨国访问(新加坡为主),如何做DNS与就近路由?
- 答:使用全球DNS服务(Route53/Cloud DNS等)结合GeoDNS或LatencyRouting,将近用户流量指向最近区域或使用CDN(如CloudFront/Cloudflare)缓存静态资源,减轻Origin负载并降低延迟。
来源:企业实战新加坡云服务器做网站的负载均衡与自动扩容方案