分区与分片:把数据打散的艺术

05-事务与数据系统 核心 约 25 分钟 #分区#分片#一致性哈希#路由 更新 2026-10-02
当前状态:未学
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。

一句话定义

分区(sharding)把大数据集按 key 拆到多节点以突破单机容量与吞吐上限;核心决策是按范围还是按哈希切、路由表放哪里、以及如何保证再平衡时数据不大搬家——一致性哈希与固定分片数是两大主流答案。

为什么重要

分区是横向扩展的第一手段(kp-002 消除全局瓶颈),也是所有主流分布式存储的地基(Kafka partition、Redis slot、TiDB Region、Dynamo ring)。分区的 key 选错会造成热点与跨片查询风暴——这类设计失误在上线后极难回滚,必须在建表期想清楚。

前置知识

kp-002(可扩展性)、哈希函数基本性质。

核心概念

  • 范围分区(range):按 key 区间切分(如时间、ID 段);范围查询友好,但容易热点(最新数据集中一片)。
  • 哈希分区(hash):hash(key) 决定归属;负载均匀,但丧失区间扫描能力。
  • 一致性哈希:把节点与 key 都映射到环上,key 归顺时针首个节点;节点增减只影响相邻区间,配合虚拟节点(vnode)平滑负载——Dynamo/Cassandra 路线。
  • 固定分片 + 元数据路由:逻辑分片数固定(如 Redis 16384 slots、Kafka partition 数),物理节点映射分片集合;再平衡只搬分片不重算 hash——多数现代系统的选择。
  • 路由层:客户端直连(感知集群拓扑,Redis Cluster MOVED 重定向)、代理层(Twemproxy/Vitess)、或协调服务存储路由表(kp-020 的 etcd/ZK)。

原理与机制

分区键的选择标准:① 写入/读取负载均匀(避免名人热点:明星账号、爆款商品——kp-026);② 高频查询能落到单分区(避免广播);③ 与事务边界对齐(跨分区事务贵,见 kp-023/024)。三者经常冲突,典型折衷是复合键(tenant_id + entity_id 打散租户内热点)与二级索引的局部化(本地索引 vs 全局索引的取舍:本地索引查询需扇出,全局索引写入需跨片)。

一致性哈希为什么能平滑扩缩容:朴素 hash(key) mod n 在 n 变化时几乎全部 key 重映射;一致性哈希把"取模对象"从节点数改为环位置,节点变化只迁移环上相邻弧段(平均 1/n)。虚拟节点进一步把每节点拆成上百个 vnode,消除异构机器负载不均与单点弧段过大问题。

请求路由与元数据一致性:拓扑变更期间旧路由缓存会指向错误节点,协议必须有自愈动作(MOVED/ASK 重定向、客户端拓扑刷新、经协调服务的租约路由表)。路由元数据本身是共识数据(kp-019/020)。

图示

一致性哈希环:
     n1(0~99)   n2(100~199)   n3(200~255)
key=h(x) 顺时针找首个节点; n3 下线只搬 n3 的区间给 n1
固定分片: 16384 slots → 按组分配给节点; 扩容=迁移 slot 归属(不重算key)

直观类比

图书馆排书:按书名字母分段上架(范围分区,找区间方便但新书面集中在某一架);按封面颜色哈希上色上架(哈希分区,找单本快但"从A到C全看一遍"要跑遍全场)。新增书架时,一致性哈希相当于只把相邻架子的书匀一半过去,而不是全馆重排。

实例或案例

  • Kafka:partition 即分区单元,key 路由保序(kp-008);分区数决定并行度上限。
  • Redis Cluster:16384 slots + MOVED 重定向 + gossip 维护拓扑(kp-010)。
  • TiDB:Region(默认 96MB)自动分裂合并 + PD 调度(路由元数据中心),Multi-Raft 承载(kp-032)。
  • DynamoDB:hash+range 复合主键;分区随容量自动分裂,配额按分区计。

常见误区

  • 误区一:"分片数等于机器数"。现代设计用远多于节点数的逻辑分片(vnode/slot/region),扩缩容只是迁移分片归属,避免大规模重哈希。
  • 误区二:"用自增 ID 哈希就够了"。自增 ID 顺序写入在范围分区下全打到最后一片;时间序列数据同理——需要加盐/打散或改哈希分区。
  • 误区三:"跨分区查询加个广播就行"。扇出查询的延迟由最慢分区决定(kp-002 尾延迟放大),高频路径必须设计成单分区可达。

与其他知识点的关系

  • kp-026:再平衡与热点的工程处理。
  • kp-010:无中心集群的拓扑靠 gossip 维护。
  • kp-019/032:每分片一个共识组的 Multi-Raft 架构。
  • kp-023/024:跨分区事务是分布式事务的直接成因。

自测题

  1. 范围分区与哈希分区各自的典型适用场景?

答:范围分区适合区间扫描与时序数据(注意尾部热点);哈希分区适合点查与均匀负载(丧失区间能力)。

  1. 一致性哈希相比 hash mod n 的核心改进?

答:节点增减只影响环上相邻区段(约 1/n 的 key 重映射),配合 vnode 消除负载倾斜,避免全量重哈希。

  1. 选分区键要同时满足哪三点?

答:负载均匀(防热点)、查询单分区可达(防扇出)、与事务边界对齐(防跨片事务);冲突时用复合键折衷。

延伸阅读

  • Martin Kleppmann《DDIA》第 6 章。
  • Karger 等, "Consistent Hashing and Random Trees"(STOC 1997)。
  • Redis Cluster / TiDB PD 设计文档。