第六章 数据分区
此处的分区指sharding,不是将单数据库内数据分区存储;
分片的主要目的是提供高可扩展性,提升查询的吞吐量,但复杂跨分区的查询需要额外注意;
不同的分片可放在一个无共享集群的不同节点;
一般分片和复制组合使用,前者高扩展性,后者高可用性,在多节点内,一般存一个主和其他分片的从;
数据分区的负载均衡
主要目标:最理想的状态是各同质化节点负载完全均衡,或者异质化节点按照处理能力分配负载;
基于关键字分区
即按照数据的字段进行划分,注意,分区段不一定要均匀分布,可以根据实际数据分布情况,划分多个区域,且需要注意访问热点的问题,需要添加或者修改被作为划分依据的字段,主要目的是将查询负载均匀分布到多节点上,等于是并行查询;
基于关键字哈希值分区
基于哈希,均匀分布数据;
这里的均匀分布指的是数据哈希结果尽可能均匀,不代表负载均衡;
但失去了区间查询的能力,相似数据可能被分布在不同分片上;
典型如一致性哈希;
分区和二级索引
每个分区都维护自己的二级索引,故查询时通常需要向所有分区发送查询命令,最后合并返回结果,也被称为分散/聚集,注意读延迟会被放大;
设计时要考虑如何高效地合并结果并优化延迟,例如通过并行化查询;
分区再平衡
即业务持续服务时,会遇到查询压力变大,数据规模增加,节点故障等;
为保证服务可用性和响应速度,需要重新分配负载,目标为在合适的时候进行负载均衡,平衡时不能停止服务的提供,完成后读写请求,数据存储等负载应该更均匀分布在集群内;
动态再平衡策略
固定数量的分区
使用类似一致性哈希的虚拟节点的方法,固定分区总数,使其远大于实际节点的数量,每个节点都均匀分担多个分区,当新增或者减少节点时,注意此时由于分区的总数量不变,所以关键字到分区的映射关系保持不变,只需要调整分区和节点的映射关系即可;
动态分区
即根据分区的数据存储负载,分割或者合并分区;
请求路由
策略:
客户端轮询节点(或者由节点自己转发),直到请求被处理并响应;
客户端请求路由层,由该层的调度器转发请求到节点,作为分区感知的负载均衡器;
客户端维护分区和节点的关系,通过监控,响应的元信息获取节点的负载;
key:
作出路由决策的组件(如注册中心),需要确定分区与节点的关系,及变化情况;
MPP
MPP 大规模并行处理(Massively Parallel Processing)主要用于数仓,不再是简单的get或者set,而是联合,过滤,分组,聚合等,MPP 查询优化器会将这部分复杂查询拆分为多个执行阶段和分区;
并行处理:
核心在于能够将任务并行分配给多个处理单元(节点),每个单元可以独立处理自己的数据。这种并行性显著提高了处理速度;
数据分布:
数据被划分成多个分区(分片),分散存储在各个节点上,这种分布策略可以是基于某个字段的哈希分区、范围分区等,使得相关数据在同一节点上,提高查询效率;
查询优化器:
MPP 查询优化器能够分析复杂的SQL查询并将其拆分为多个执行阶段,优化器会考虑数据的分布情况和执行节点的负载,选择最佳的执行路径,减少数据传输和计算开销;
执行阶段:
MPP系统的执行过程通常包括多个阶段,如:
- 联合(Join):将来自不同表的数据进行匹配;
- 过滤(Filter):根据条件筛选出符合要求的数据;
- 分组(Group By):对数据进行分组,计算汇总信息;
- 聚合(Aggregate):执行统计计算,如求和、平均值等;
容错性:
如果某个节点发生故障,其他节点可以继续工作,系统能够在一定程度上保证处理的完整性和一致性;
可扩展性:
能够通过增加更多的节点来扩展计算能力和存储能力,支持更大规模的数据处理需求;