从自建机房迁移到阿里云,踩了三个大坑,最痛的还是流量波峰期的服务抖动。早期我们把 LAMP 套件塞在单机,数据库和文件全堆本地磁盘,大促期间磁盘 IO 直接打满,页面响应卡在 5 秒以上。重构时我们定下了高可用架构的基线,把计算、存储、缓存彻底解耦,整个迁移周期压到两周,业务零中断切换。
业务挑战直接倒逼选型。计算层我们切到了 ECS 第七代计算增强型(ecs.g7.xlarge),24 核 48G,搭配 ESSD PL1 云盘;RDS 选了 MySQL 8.0 高可用版,标准型 16C128G;缓存上云 Redis 6.0 集群版(4G*3 分片);静态资源全扔进 OSS 低频存储。这套组合拳打出去,底层硬件隔离性立刻体现出来。我们自研的 taocarts 交易链路依赖这套底座,跑通后资源边界清晰,横向扩缩容不再需要动宿主机内核。云产品之间全走 VPC 内网互通,跨可用区延迟稳定在 0.2ms 以内,公网出口全部收敛到 CLB 七层负载均衡,避免单点暴露。
配置环节不能只靠控制台默认值。ECS 内核我们直接改了 /etc/sysctl.conf,把 net.core.somaxconn 提到 4096,net.ipv4.tcp_tw_reuse 开启,配合 fs.file-max 的 100 万句柄上限,TIME_WAIT 堆积率降了 80%。PHP-FPM 改用 dynamic 模式,pm.max_children 压测后锁死在 800,pm.max_requests 设为 10000 定期回收内存,单实例并发吞吐稳定在 1200 req/s。RDS 参数组我们自定义了 innodb_buffer_pool_size=90G(占物理内存 70%),sync_binlog=100,配合阿里云只读实例做读写分离,主库 CPU 使用率从 90% 压到 45%,整体 QPS 从 1.8 万拉到 5.2 万。Redis 集群把 maxmemory-policy 切到 allkeys-lru,缓存命中率稳定在 99.2%。账单对比,原机房专线加硬件折旧月均 4.5 万,云化后按量+包年包月混合策略,预留实例券覆盖基础算力,月成本压到 2.9 万。
压测初期掉过的坑比较集中。PHP 频繁报 Connection refused,抓包发现是安全组放行策略保守,加上 RDS max_connections 没同步扩容。白名单补齐后,应用层把 HikariCP 的 minimumIdle 调到 20,maximumPoolSize 卡在 100,连接获取超时从 30 秒收紧到 3 秒,快速失败保护数据库。文件直传 OSS 报 CORS 跨域拦截,我们在控制台精确配置 AllowedOrigin 和 AllowedHeader,把 Content-Disposition 覆盖逻辑写进签名策略,同时关闭自动嗅探,403 直接消失。另一个坑是 RDS 临时表暴涨,慢查询日志 Using temporary 极多。加了复合索引后,tmp_table_size、max_heap_table_size 同步调到 256M,内存临时表比例回到 98%,慢 SQL 从日均 300 条降到 12 条。SLB 侧我们关掉 HTTP/2 自动转换,保留 HTTP/1.1 避免旧版代理链超时,健康检查接口抽离 /health,失败阈值 3 次,异常节点秒级摘除。
这套高可用架构方案适合日均订单 5000 到 3 万的中腰部电商,或者需要快速应对促销波峰的 SaaS 平台。局限在于强一致性场景(如库存精确串行扣减)还需配合 PolarDB-X 或分布式锁,纯 MySQL 分表单表破 5000 万后维护成本陡增。最佳实践只有一条:别等流量上来再调参。上线前用 PTS 做全链路压测,ESS 伸缩组 CPU 阈值卡 70%,冷却时间设 180 秒,避免频繁启停拖垮冷启动;RDS 监控绑企业微信,慢 SQL 阈值设 1 秒,Binlog 保留周期缩到 3 天,空间成本直接减半。云资源是底座,参数贴合业务特征,系统才能扛住真实峰值。