知识卡片
纵向与横向伸缩及弹性系统与手动伸缩的取舍
内容
应对负载增长有两个正交的维度需要分别决策。第一个维度是纵向伸缩(垂直伸缩,换更强大 的单机)还是横向伸缩(水平伸缩,把负载分布到多台小机器上,也称”无共享”架构):单机 系统通常更简单,但高端机器价格昂贵,非常密集的负载最终往往绕不开横向伸缩;现实中的 优秀架构通常是两者务实结合——用几台足够强大的机器,有时比用大量小型虚拟机更简单也 更便宜,不必教条地只选一边。第二个维度是弹性(系统在检测到负载增加时自动增加计算 资源)还是手动伸缩(人工分析容量、决定何时加机器):弹性系统适合负载极难预测的场景, 能省去人工判断的滞后;但手动伸缩系统更简单,且不容易因为自动化逻辑的误判而产生 意外操作(比如误判负载峰值触发不必要的扩容)。这两个维度还牵涉一个额外的复杂度 分野:跨多台机器部署无状态服务很简单(随便加实例即可),但把带状态的数据系统从单 节点变成分布式配置会引入大量额外复杂度,因此常见的经验法则是:先把数据库放在单个 节点上纵向伸缩,直到伸缩成本或可用性需求真正倒逼它变成分布式,而不是一开始就默认 往分布式方向设计。
参考来源
- 位置:《数据密集型应用系统设计》第一章《可靠性、可伸缩性、可维护性》"应对负载的
方法"(源文件:_epub-src/ch1_split_005.html)
- 结论依据:原文分别对比纵向伸缩与横向伸缩(无共享架构)的优劣、弹性系统与手动
伸缩系统的适用场景,并说明带状态数据系统分布式化的额外复杂度是常识上倾向先纵向
伸缩的原因,直接支撑本卡片的两维度结构梳理。
- 原始内容:人们经常讨论纵向伸缩(垂直伸缩,转向更强大的机器)和横向伸缩(水平
伸缩,将负载分布到多台小机器上)之间的对立……有些系统是弹性的……而其他系统则是
手动伸缩……跨多台机器部署无状态服务非常简单,但将带状态的数据系统从单节点变为
分布式配置则可能引入许多额外复杂度……常识告诉我们应该将数据库放在单个节点上
(纵向伸缩),直到伸缩成本或可用性需求迫使其改为分布式。