水平分区与垂直分区如何拆数据?
- 数据分区: 按规则把数据分成较小部分,便于管理、查询和扩展,不一定每个分区都在独立机器;
- 水平分区: 按行拆分,同类分区保持相似结构,每个分区存部分记录;
- 分片: 通常指把水平分区分布到多个节点,各节点承担不同数据的存储与请求;
- 垂直分区: 按列拆分,例如把频繁访问的核心属性与很大的扩展内容分开;
- 采用时机: 已确认单机容量、连接数、地理部署或吞吐限制,而复制与查询优化不能解决主要瓶颈;
怎样选择分区键与分区规则?
| 方法 | 路由规则 | 优点 | 代价 |
|---|
| 哈希 | 对分区键做哈希映射 | 容易打散普通键 | 简单取模扩容迁移多,范围查询易跨片 |
| 列表 | 指定值属于指定分区 | 业务位置直观 | 热门值可能压垮一片 |
| 范围 | 落入连续区间 | 范围扫描方便 | 新增或热门区间可能集中写入 |
| 复合 | 先按一种规则再细分 | 兼顾多种访问约束 | 路由与运维更复杂 |
- 边界约定: 范围必须明确包含关系,例如
[a,b),既不重叠也不遗漏边界值;
- 查询局部性: 选择能让常用操作落在同一分片的键,避免每次查询都广播全库;
- 基数与热点: 键很多并不代表负载均匀,某个热门用户仍可能独占大量请求;
分片带来的收益有哪些边界?
- 扩展: 不同分片可并行工作,减小单节点数据量与索引规模;
- 管理: 可以按分片迁移、维护和安排地理位置,也可以配合权限隔离敏感数据;
- 查询: 只有能定位目标分片时才明显缩小扫描,无法裁剪分片的查询未必更快;
- 可用性: 分片隔离部分故障,但只有一份数据的分片失效仍会使相应数据不可用,需另加复制;
- 安全: 分开保存有助于管理,不会自动替代身份验证、授权和加密;
跨片操作为什么更昂贵?
- 联接: 需要跨网络取数和合并,可能传输大量中间结果;
- 事务: 跨片约束和更新需要协调或补偿,见 分布式事务;
- 聚合: 全局统计和排序需要多片参与,不能用单片性能直接推断整体性能;
分片扩容时如何重新平衡数据?
- 再平衡: 当分布不均或容量变化时迁移数据,并更新客户端使用的路由信息;
- 迁移一致性: 迁移过程中需定义旧位置、新位置与并发写的处理方式,避免遗漏或重复;
- 一致性哈希: 可以减少节点变化时受影响的键,具体机制见 一致性哈希;
- 限制: 哈希分布均匀不能解决单个超级热点键,也不保证业务地理分布自动均匀;