《数据密集型应用系统设计》整理05

第六章 数据分区

Clearly, we must break away from the sequential and not limit the computers. We must state definitions and provide for priorities and descriptions of data. We must state relation‐ ships, not procedures.
—Grace Murray Hopper, Management and the Computer of the Future (1962)

数据分区:组合使用复制和分区,分区的主要目的是提高并发性。
WechatIMG41

键-值数据的分区

分区要解决的主要问题是数据倾斜——如果分区不均匀,会出现某些分区节点比其他分区承担更多的数据量或查询负载的问题。

为了避免热点,可以把记录随机分配到所有节点上,但是这样在读取特定数据的时候就需要并行查询所有节点。

如果是键值对的数据,那么我们可以根据键来访问记录,衍生出以下两种分区方式:

  • 基于关键字区间分区,分区内可以按照关键字排序保存。这种方法的缺点是容易导致热点,解决的方法是在关键字上带上与热点无关的关键字(比如关键字是时间戳,那么一天写入都在一个分区,那么可以带上传感器的关键字,以打散到所有分区)
  • 基于关键字哈希值分区,这种方式分区均匀,但是失去了良好的区间查询特性。组合索引是一种解决方式,复合主键只有第一部分用于哈希分区,其余列组用作组合索引对数据进行排序。

分区与二级索引

基于文档分区的二级索引

每个分区维护自己的二级索引,只负责自己分区内的文档。写操作只需要处理包含目标文档ID的那一个分区,读操作需要将查询发送到所有分区。
WechatIMG42

基于词条的二级索引分区

对所有数据建全局索引,全局索引本身也进行分区。读操作只需要向包含词条的那一个分区发出读请求,但是写操作需要涉及多个二级索引。
WechatIMG43

分区再平衡

数据增加,节点故障等情况都需要执行分区再平衡,使得数据和请求可以从一个节点转移到另一个节点。

平衡策略

  • 取模是一个反面教材,会导致大量数据移动;
  • 创建远大于实际节点的固定数量的分区,每个节点承担固定数量的分区数,再平衡的时候,新节点可以从现有节点匀走几个分区。迁移后整个分区在节点之间迁移,不会改变关键字到分区的映射关系,只会改变分区与节点的对应关系。缺点是如果数据集总规模高度不确定,那么就很难选择合适的分区数,分区太大则再平衡时代价很大,分区太小则会产生太多开销
  • 动态分区,分区数据量超过阈值时分裂,分区数量缩小到阈值下时则合并,类似于B树的分裂操作。
  • 按节点比例分区,每个节点具有固定数量的分区,节点数不变时,分区的大小与数据集大小保持正比的增长关系。

请求路由

我们已经将数据集分布到多个节点上,现在要解决发送请求时需要连接哪个节点的问题。
WechatIMG44
如上图,共有三种策略:

  • 客户端链接任务节点,如果某节点没有则将请求转发到下一个合适的节点,接收答复并返回给客户端;
  • 请求都发送到路由层,厚泽负责转发到对应分区;
  • 客户端感知分区和节点分配关系。
comments powered by Disqus