集群服务器和分布式服务器这两个说法,在很多技术交流的时候经常被混着当成同一个概念。但只要亲身搭建过系统,或是参与过生产环境扩容方案的讨论,就能感受到二者之间的差别远比想象中具体,而且这些差异大多是系统出现故障的时候,才会直观地暴露出来。
先从一个容易被忽略的角度来看,两种架构要解决的核心问题本身就不一样。集群服务器的目标,是让多台机器对外表现成一台整体,对外只提供统一入口,服务输出也保持一致。用户发起请求打到集群,具体由哪一台设备处理响应,用户这边是感知不到的。集群最核心追求的就是服务可用度以及读取性能,一台机器宕机,其余节点可以接替工作;请求量上涨,流量可以分摊到多台机器共同处理。分布式服务器面对的却是另一种场景:当数据总量或是计算任务规模超出单台机器硬件承载上限之后,如何拆分任务,分发到不同节点并行完成。简单来说,分布式用来解决存储上限和写入瓶颈,集群则侧重保障可靠性与读取瓶颈,这个区分在做方案选型的时候十分关键。

两者底层最根本的分歧体现在数据组织方式上。集群比较典型的做法,是所有节点共用一套数据,或是依靠主从复制,让从节点同步保存主节点的数据副本。写入操作集中在主节点或是共享存储设备,读取请求则可以分发到多个节点执行。这么做的好处是事务处理逻辑简单,所有操作读取到的数据视图保持统一,节点之间不需要反复协商数据一致性。但短板同样明显,主节点或者共享存储的IO性能,就是整套系统的性能天花板,就算继续新增节点,写入性能也不会随之提升。分布式体系会按照预设规则拆分数据分片,每个节点只负责保管其中一部分数据。计算任务会直接下发到数据所在节点执行,省去把数据传输到计算节点产生的网络开销。理论上分布式系统的存储和计算能力,可以跟着节点数量增加实现线性扩容,但代价就是跨节点操作都需要网络通信,同等硬件条件下,跨分片事务带来的延迟,会比集中式集群高出数倍。
当规模持续扩大之后,两种架构的运行差异会变得更加突出。集群横向扩容存在隐性上限,增加计算节点能够分担读取请求,但是写入链路的瓶颈,不会因为新增节点就消失。不少团队在集群扩容的时候,添加两三个节点之后,整体吞吐量反而下降,根源就是节点之间的数据同步、锁竞争消耗掉新增的算力资源。分布式本身设计目标就是实现线性扩展,每新增一台节点,对应的存储容量和计算能力都会同步增加。不过这种线性增长有前提,分片策略设计必须合理,不然容易出现热点数据全部堆积在单个分片,造成某个节点CPU满载,其余节点闲置的情况。分片键的选取需要结合业务实际查询模式,不能随便拿主键就直接使用,指望自动实现负载均衡。
故障处理的手段也完全不一样。集群中单个节点故障,其余节点可以接管它的业务,故障转移大多能在秒级完成,业务中断时间很短。这套机制发展成熟,运维人员监控重点主要放在主备节点的数据同步状态。分布式系统要面对的故障场景复杂得多,网络分区、节点时钟不同步、跨机房通信延迟波动,这些问题在单机或是集群环境基本不会遇到,在分布式环境里却是常态。更棘手的是故障会产生连锁传导效应,分布式环境里单个节点异常,有可能引发一连串问题,造成整套系统雪崩。分布式设计中对CAP定理做取舍,也就是一致性、可用性、分区容忍性三者只能满足两项,本质就是针对这类故障场景做出权衡。选择强一致性,网络分区发生时就有可能拒绝部分请求,保证数据不会出错;优先保障高可用,某些场景下就有可能读到不一致的数据。
运维层面的体验差距同样明显。集群运维逻辑相对直观,主要监控主备节点状态与同步延迟,排查问题的思路和单机差距不大。维护分布式系统,则需要对整个网络拓扑有全局认知,节点数量增多之后,传统逐台登录排查的方式基本失效,需要依靠复杂度更高的监控、自动化工具定位故障。有团队从集群迁移到分布式架构之后发现,运维复杂度上升带来的成本增长,有时并不低于硬件采购开销。这并不是说分布式架构不好,只是它引入了集群架构不存在的协调开销。
那实际选型该怎么判断?判断的起点不是评判哪种架构更先进,而是找准业务当前真正的瓶颈。如果数据量单机还能承载,压力主要来自并发读请求,或是业务对服务可用性要求高,集群会是更合适的选择,运维简单,事务一致性有保障,业务开发几乎不用改动代码。要是数据量已经突破单机硬件上限,或是写入并发压力已经让主节点难以承载,分布式就是绕不开的方案,但要提前做好分片设计、分布式事务协调,同时接受运维难度提升。两者也不是二选一的关系,行业里很常见的做法是先按照业务模块做分布式拆分,每个模块内部再搭建集群保障高可用,这样既拥有横向扩容能力,又不会把所有复杂问题集中在同一层级。