DevOpsMar 28, 2026
Deep EVM #26:分片 vs 分区——大表架构方案
OS
Open Soft Team
Engineering Team
分区 vs 分片:核心区别
- 分区 — 单个数据库内的表分割。数据仍在同一台服务器上。
- 分片 — 跨多台数据库服务器分布数据。每个分片是独立的数据库实例。
何时使用分区
- 表太大导致查询慢,但单服务器容量足够
- 需要按时间范围归档旧数据
- 查询模式与分区键对齐
何时使用分片
- 单服务器无法承载写入负载
- 数据量超过单机存储能力
- 需要地理分布以降低延迟
一致性哈希
一致性哈希是分片路由的基础算法,确保在添加或移除分片时最小化数据迁移:
fn get_shard(key: &str, num_shards: u32) -> u32 {
let hash = murmur3_x64_128(key.as_bytes(), 0);
(hash % num_shards as u128) as u32
}
分片路由
应用层需要知道数据在哪个分片上。常见模式:
- 路由表
- 哈希函数
- 范围映射
决策框架
| 因素 | 分区 | 分片 |
|---|---|---|
| 复杂性 | 低 | 高 |
| 写入扩展 | 有限 | 线性 |
| 跨分片查询 | 不适用 | 昂贵 |
| 运维开销 | 低 | 高 |
总结
先分区,后分片。大多数应用程序通过分区即可满足需求。只有在单服务器确实成为瓶颈时才考虑分片。