🧩 一、什么是分片(Sharding / Partition)
把一张大表按某种规则切成多份,每份叫一个分片(shard / partition),分布到不同节点。每个节点只负责一部分数据,整体突破单机容量与性能上限。
垂直拆分 vs 水平拆分:垂直拆分是按"列/业务"分库(用户库、订单库);水平拆分(即分片)是按"行"把同一张表的数据分散到多机。面试里说的"分库分表"通常指水平分片。
分片的核心目标:① 突破单机存储上限;② 突破单机算力上限(查询/写入并行);③ 故障隔离(一个分片挂不影响全局)。
🗺️ 二、四种分片策略
| 策略 | 规则 | 优点 | 缺点 | 适用 |
|---|---|---|---|---|
| 范围分片 | 按 key 区间切(如 user_id 0–1kw) | 范围查询快、易扩展 | 易热点(最新区间最忙) | 时序/日志、按时间 |
| 哈希分片 | hash(key) % N | 分布均匀、无热点 | 范围查询需扫多分片 | 通用 KV、用户数据 |
| 列表/枚举 | 按枚举值定向(地区/租户) | 业务语义清晰 | 易不均、需人工规划 | 多租户、地域隔离 |
| 地理分片 | 按地理位置就近 | 降低延迟 | 跨区查询复杂 | 全球化部署 |
与一致性哈希的关系:哈希分片的"节点增减"痛点,正是一致性哈希要解决的。生产上常用"固定槽位(如 Redis 16384 slot)"替代裸取模。
🔥 四、热点与数据倾斜
即使选了哈希,也可能因"某 key 被疯狂访问"(如爆款商品、大 V 用户)造成单分片热点。
常见解法:① 热点 key 加随机后缀(写时分散、读时聚合);② 本地缓存 + 限流;③ 对超热 key 单独复制多副本做读负载均衡;④ 提前做数据预判与预分片。
⚖️ 五、再平衡(Rebalancing)
集群扩缩容、节点上下线时,要把分片重新分布到新拓扑上,这个过程叫再平衡。目标是:迁移量最小、不停服、不丢数据。
再平衡三原则
① 尽量均匀:各节点承载相近分片数;② 最小化迁移:借助一致性哈希/槽位,只动必要分片;③ 自动化且可回滚:多数系统(Kafka/Cassandra)由控制器自动调度,迁移按"先复制再切换"保证安全。
🎯 六、面试高频追问
分库分表后,跨分片查询/事务怎么办?
聚合查询靠中间件(如 ShardingSphere)并行查各分片再汇总;跨分片事务用分布式事务(TCC/Saga/消息最终一致)兜底,尽量避免。
分片数和节点数一定要相等吗?
不一定。常见做法是"分片数 > 节点数",一个节点承载多个分片,扩节点时只需把部分分片搬过去,调度更灵活(Kafka 的 partition 即如此)。
分片键和唯一 ID 的关系?
全局唯一且最好带分片信息的 ID 能简化路由。例如把分片号编入 ID 高位,或通过 ID 反查分片,避免额外查路由表。