垂直与水平扩展

垂直扩展提升单机规格,简单但存在上限与停机改造;水平扩展增加实例,需要处理无状态化、数据分布与会话共享,是弹性与容灾的基础。

两种扩展方向

垂直扩展(scale up)提升单机规格:CPU、内存、磁盘更快更大,改造量小、短期见效快,但受单机规格上限约束,且往往需要停机或重启,也不解决单点问题。水平扩展(scale out)增加实例数量:具备弹性与容灾能力,但前提是把服务改造成无状态或处理好状态共享,同时要面对数据分布、会话共享与跨节点协调带来的复杂度。现实中常见的路径是先用垂直扩展争取时间,同时推进无状态化,再切换到水平扩展。

基本信息

垂直改造量小;受单机上限约束;仍是单点;成本随规格上升
水平需要无状态化改造;弹性与容灾好;受分片与协调成本约束
判断依据业务增长曲线、停机窗口、状态依赖程度与团队运维能力
组合方式先垂直争取时间,同时推进无状态化,再切换水平扩展

典型使用场景

  • 数据库扩容:优先垂直提升规格,再考虑读写分离与分片
  • 无状态 Web 服务:直接水平扩容最直接,配合负载均衡
  • 有状态服务拆分:把会话与状态外置后才能安全水平扩展
  • 突发峰值:用水平扩展临时加实例,峰后收回控制成本
  • 单点风险消除:为只有单实例的关键服务补齐多实例部署

维度

维度垂直水平
改造量小需要无状态化改造
上限单机规格上限受分片与协调成本约束
容灾仍为单点天然多副本
成本曲线随规格上升规模效应更优

水平扩展前的检查项

水平扩展前的检查项
1. 会话是否外置(缓存或数据库),还是存放在本机内存
2. 本地文件与临时目录是否被依赖(上传、导出、缓存文件)
3. 定时任务是否会随着实例增加而重复触发
4. 本地缓存一致性:多实例下是否需要失效通知或版本号
5. 下游连接数与配额随实例数放大,是否已设上限
# 任一项未处理,水平扩展都会带来数据不一致或重复执行

使用要点

  • 长期依赖垂直扩容会撞上单机规格上限,且每次升级都需要停机窗口
  • 水平扩展未解决会话共享,用户状态丢失,表现为随机被登出
  • 本地文件、定时任务与本地缓存是水平扩展的常见隐性依赖
  • 扩容前按实际瓶颈类型判断:CPU 型、内存型还是 IO 型,规格选择差别很大
  • 两种方式可以叠加:先垂直提升数据库,同时水平扩展应用层
常见路径是先垂直争取时间,同时推进无状态化,再切换水平扩展;把无状态化排进迭代计划,而不是等到必须扩容时才开始。
垂直扩容会改变单机规格,压测结论与调优参数(连接池大小、线程数、堆大小)需要同步复核,直接沿用旧参数常导致新规格下表现不如预期。

易错点

  • 长期依赖垂直扩容,遇到单机规格上限,同时承受每次升级的停机成本
  • 水平扩展未解决会话共享,用户状态丢失,出现随机登出
  • 定时任务随实例增加重复触发,同一批数据处理多次
  • 本地文件依赖未改造,多实例下上传与导出随机失败
  • 下游连接数与配额未按实例数核算,应用扩容把数据库或第三方打满

数据来源与参考

  • 《System Design Interview》卷 1(Alex Xu)
  • AWS Well-Architected Framework:Performance Efficiency
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌