随着使用增长和功能堆积,应用开始生成更多数据,通常按小时计。这对业务是健康信号。但在架构上,它亮起红旗:数据库开始显示压力。
数据库位于几乎每个系统的核心。读取、写入和更新通过它漏斗。然而,与无状态服务不同,数据库以难以水平扩展著称。CPU 和内存可以升级,但在某个点,单个实例,无论多强大,成为瓶颈。响应时间退化,查询可能超时。副本落后。突然,在 10,000 用户工作的在 1000 万用户崩溃。
这就是分片进入画面的地方。
分片将大数据库分割成更小的、独立的块,称为分片。每个分片处理数据的子集,允许流量和存储在多台机器上扩展而不是堆积在一台上。
但分片是主要转变,有真实后果。应用逻辑通常需要适应。查询模式改变,连接变得更难。事务跨越物理边界。管理路由、重新平衡和故障转移有开销。
本文查看数据库分片的基础。我们涵盖细节如为什么重要、如何工作,以及携带什么权衡。我们将遍历常见分片策略和实际工程考虑。
为什么需要分片
- 单机瓶颈:单个实例无法处理海量数据
- 性能退化:查询变慢,超时增加
- 扩展困难:数据库难以水平扩展
- 副本落后:读写差距拉大
分片如何工作
分片将数据分割成独立块,每个分片:
- 处理数据子集
- 独立运行
- 可独立扩展
常见分片策略
1. 基于范围分片
- 按键值范围分配数据
- 适合范围查询
- 可能导致热点
2. 哈希分片
- 使用哈希函数分配数据
- 数据分布均匀
- 范围查询困难
3. 目录分片
- 使用查找表映射键到分片
- 灵活性高
- 单点故障风险
工程考虑
路由
- 如何确定数据在哪个分片
- 需要路由层或客户端逻辑
重新平衡
- 数据迁移复杂
- 需要最小化停机时间
故障转移
- 单分片故障不影响整体
- 需要复制和监控
跨分片操作
- 连接困难
- 事务复杂
- 尽量避免跨分片查询
权衡
优势
- 水平扩展能力
- 性能提升
- 存储容量增加
挑战
- 应用逻辑复杂化
- 运维开销增加
- 跨分片查询困难
- 重新平衡复杂
本文为学习目的的个人翻译,译文仅供参考。
原文链接:A Guide to Database Sharding: Key Strategies。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。