上一篇(ch.5)

下一篇(ch.7)

第六章 数据分区

此处的分区指sharding,不是将单数据库内数据分区存储;

分片的主要目的是提供高可扩展性,提升查询的吞吐量,但复杂跨分区的查询需要额外注意;

  不同的分片可放在一个无共享集群的不同节点;

一般分片和复制组合使用,前者高扩展性,后者高可用性,在多节点内,一般存一个主和其他分片的从;

数据分区的负载均衡

  主要目标:最理想的状态是各同质化节点负载完全均衡,或者异质化节点按照处理能力分配负载;

基于关键字分区

  即按照数据的字段进行划分,注意,分区段不一定要均匀分布,可以根据实际数据分布情况,划分多个区域,且需要注意访问热点的问题,需要添加或者修改被作为划分依据的字段,主要目的是将查询负载均匀分布到多节点上,等于是并行查询;

基于关键字哈希值分区

  基于哈希,均匀分布数据;

这里的均匀分布指的是数据哈希结果尽可能均匀,不代表负载均衡;

  但失去了区间查询的能力,相似数据可能被分布在不同分片上;

  典型如一致性哈希;

分区和二级索引

  每个分区都维护自己的二级索引,故查询时通常需要向所有分区发送查询命令,最后合并返回结果,也被称为分散/聚集,注意读延迟会被放大;

  设计时要考虑如何高效地合并结果并优化延迟,例如通过并行化查询;

分区再平衡

  即业务持续服务时,会遇到查询压力变大,数据规模增加,节点故障等;

  为保证服务可用性和响应速度,需要重新分配负载,目标为在合适的时候进行负载均衡,平衡时不能停止服务的提供,完成后读写请求,数据存储等负载应该更均匀分布在集群内;

动态再平衡策略

固定数量的分区

  使用类似一致性哈希的虚拟节点的方法,固定分区总数,使其远大于实际节点的数量,每个节点都均匀分担多个分区,当新增或者减少节点时,注意此时由于分区的总数量不变,所以关键字到分区的映射关系保持不变,只需要调整分区和节点的映射关系即可

动态分区

  即根据分区的数据存储负载,分割或者合并分区;

请求路由

策略:

  客户端轮询节点(或者由节点自己转发),直到请求被处理并响应;

  客户端请求路由层,由该层的调度器转发请求到节点,作为分区感知的负载均衡器;

  客户端维护分区和节点的关系,通过监控,响应的元信息获取节点的负载;

key:

  作出路由决策的组件(如注册中心),需要确定分区与节点的关系,及变化情况;

MPP

  MPP 大规模并行处理(Massively Parallel Processing)主要用于数仓,不再是简单的get或者set,而是联合,过滤,分组,聚合等,MPP 查询优化器会将这部分复杂查询拆分为多个执行阶段和分区;

并行处理

  核心在于能够将任务并行分配给多个处理单元(节点),每个单元可以独立处理自己的数据。这种并行性显著提高了处理速度;

数据分布

  数据被划分成多个分区(分片),分散存储在各个节点上,这种分布策略可以是基于某个字段的哈希分区、范围分区等,使得相关数据在同一节点上,提高查询效率;

查询优化器

  MPP 查询优化器能够分析复杂的SQL查询并将其拆分为多个执行阶段,优化器会考虑数据的分布情况和执行节点的负载,选择最佳的执行路径,减少数据传输和计算开销;

执行阶段

  MPP系统的执行过程通常包括多个阶段,如:

  • 联合(Join):将来自不同表的数据进行匹配;
  • 过滤(Filter):根据条件筛选出符合要求的数据;
  • 分组(Group By):对数据进行分组,计算汇总信息;
  • 聚合(Aggregate):执行统计计算,如求和、平均值等;

容错性

  如果某个节点发生故障,其他节点可以继续工作,系统能够在一定程度上保证处理的完整性和一致性;

可扩展性

  能够通过增加更多的节点来扩展计算能力和存储能力,支持更大规模的数据处理需求;