何时不应分片
只读副本、分区和更强大的服务器可以解决大多数扩展问题——了解什么时候分片并不是正确答案
何时不应分片 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
分片是最后手段
分片会使运维复杂度成倍增加。大多数应用永远不需要它。请先用尽更简单的方案。
第 1 步:垂直扩展
升级服务器。现代云实例可以轻松处理:
- 128 个核心
- 1 TB RAM
- 50,000 IOPS NVMe
单个 PostgreSQL 节点就能达到 100k-500k QPS。大多数应用都可以轻松应对。
第 2 步:读副本
如果读取请求占主导地位,请添加副本。一个 primary 加上 3 个副本,可以承载多达 10 倍的读取请求。
第 3 步:缓存
在热点查询前面加入 Redis/memcached。通常这是成本最低且效果最好的优化。
第 4 步:分区
原生 PG 声明式分区可以在单台服务器内解决“表太大”的问题。通常比分片容易 100 倍。
第 5 步:拆分服务
将不同的业务领域迁移到不同的数据库中——订单数据库、用户数据库、分析数据库。每个数据库都可以独立扩展。
第 6 步:迁移分析负载
OLTP 查询 → PostgreSQL。分析查询 → ClickHouse / BigQuery / Snowflake。许多“我们需要分片”的案例,实际上是“分析负载正在吞噬我们的 OLTP”。
然后,也许再考虑分片
如果在仅包含 OLTP 数据的规模达到 50TB 后仍然耗尽资源,并且工作负载要求的写入能力已超出单台服务器的承受范围——就可以开始规划分片。
分片的运维成本
- 需要监控和修补更多服务器
- 必须协调跨分片备份
- 跨分片查询会触及应用程序代码
- 重新分片很困难
- 热点分片需要主动重新平衡
“延后分片”策略
采用具备分片意识的模式进行构建(始终包含 tenant_id,绝不使用全局递增计数器),这样您之后 CAN 进行分片。但除非不得不分片,否则不要分片。
适合分片的架构
即使您继续使用单节点,也要按照未来可能分片的方式进行设计:
- 每一行都包含 Tenant_id
- 使用 UUID 或分布式 ID(而不是自动递增)
- 不使用全局唯一序列
- 外键限制在租户范围内
承认这种权衡
分片以功能为代价换取容量。连接、事务和查询都会变得更加困难。请确认获得的收益值得付出这些代价。
总结
分片解决的是一个真实问题,但代价很高。
- 先进行垂直扩展
- 使用读副本和缓存
- 先分区,再分片
- 将分析负载迁移出 OLTP
- 为可分片性进行设计,推迟实际分片
快速检查
您正在考虑分片,因为 OLTP 查询速度很慢。在进行分片之前,最有可能有帮助的步骤是什么?
常见问题解答
「何时不应分片」课时是免费的吗?
是的 — 「何时不应分片」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「何时不应分片」这节课中我会学到什么?
只读副本、分区和更强大的服务器可以解决大多数扩展问题——了解什么时候分片并不是正确答案 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「何时不应分片」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。