
昨天讲了集群、分布式和微服务 之前的关系与区别,今天想给大家再补充一点。
数据库扩容时,一个常见误区是「加机器就能解决一切」。曾有一个订单库,峰值写入把单机 IO 打满,加了两台机器做主从复制后,写入依然卡顿——因为瓶颈不在机器数量,而在「所有写都压在同一张主库上」,从库再多也只能摊薄读。
这件事引出一个关键判断:集群与分布式这两个词,多数人背得下结论,但没搞清楚它们之间的边界。本文用一次真实的扩容过程,把三个边界讲透。
网上流传最广的一句话是:「集群是一堆人干同一件事,分布式是一堆人干不同的事。」
这句话好记,但不准确,而且会误导架构决策——它把「集群」和「分布式」描述成两个并列、二选一的东西。真实系统里,这两者经常是叠加的:一个分库分表的数据库集群,既是分布式(数据拆了),又是集群(多节点对外一体)。
更准确的表述是:
集群是「部署形态」——多台机器怎么摆;分布式是「协作方式」——任务和数据怎么拆。两者不在一个维度上比较。
一个集群里,跑的可以是单体应用。不少生产系统就是「一主一备的数据库 + 一个单体应用」:它是集群(多机器),但不是分布式(没拆活、没拆数据)。
反过来,一个分布式系统也可以先在单机上跑起来——本地搭的分库分表 demo,几个逻辑分片落在同一台机器上,设计上依然是分布式。
判断一个系统是不是分布式,不看它有几台机器,看它有没有「拆」。
这是架构选型的根:
回到开头那个订单库:瓶颈是「单库写入上限」,这是数据层面的墙,加机器做主从(集群思路)越不过这堵墙。最后是分了库、分了表,把写入拆到多张表、多个节点上(分布式思路),才真正解决。
分布式不是升级,是换一套代价:
能用集群解决的,别上分布式;非拆不可的,才值得付这三重税。
那次订单库扩容的完整演进路径如下:

阶段一:单机扛不住,先做主从(集群)
一主两从,读写分离,读压力下来了。但写还是打在单张主库上,峰值一上来照样卡。这一步解决的是「读多写少」的摊薄,没解决「写」的瓶颈。
阶段二:写入还是爆,上分库分表(分布式)
把订单表按「用户 ID」哈希拆成 16 张表、落到 4 个库。写入压力被拆开了,单库终于不再 100%。但新问题立刻冒出来:跨分片查询不能直接 JOIN,得改查询逻辑或上中间件;订单和用户分属不同库,原来一个事务能搞定的操作,现在要上分布式事务——2PC 太重,最后按业务场景用了 TCC,为关键的扣库存、生成订单两个动作做了 Try/Confirm/Cancel。
阶段三:分片之后还要高可用(分布式 + 集群叠加)
每个分片库都配了主备,防止「拆完更脆」——一个分片挂了,至少还有备机接。这时候这套系统,就同时是「分布式」(数据拆了)又是「集群」(每片都多节点高可用)。
国产数据库在集群这块的落地已经比较成熟——例如金仓数据库 KingbaseES 的共享存储集群、读写分离集群,自动故障转移、防脑裂、数据强一致都是默认能力,政务和金融项目用得比较多,不需要再像这套系统当年那样逐块拼接。
把边界落到判断标准上,一般这样问:
先上集群,如果:
必须上分布式,如果:
先别上分布式,如果:
判断的核心变量始终是两个:数据装不装得下、活拆不拆得开。
「集群转分布式」过程中的高频踩坑点:
现象/信号 | 大概原因 | 先查什么 |
|---|---|---|
加机器后写还卡 | 单库/单表写入上限 | 写 QPS、单库 IO、热点表 |
分片后查询变慢 | 跨分片 JOIN | 查询是否跨分片键、中间件路由 |
读写分离读到旧数据 | 主从延迟 | 延迟监控、敏感场景强制走主 |
切换时出现双主 | 脑裂 | Quorum、fencing、心跳网络 |
分片后事务失败 | 跨节点事务 | 分布式事务方案(TCC/SAGA/2PC) |
集群解决「机器够不够」,分布式解决「数据和活拆不拆」,而架构设计的功夫,在于知道什么时候该停在集群、什么时候必须往前走一步。
那次订单库最终活下来的方案,不是「一步到位的分布式」,而是「主从 → 分库分表 → 每片高可用」这样一步步被业务逼出来的。这大概也是集群和分布式最诚实的打开方式——它不是一个概念选择题,是一张随着业务一起长大的路线图。
本文基于生产环境实战总结,欢迎交流。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。