TDDMS分布式存储管理系列文章--分片/分区/分桶详解

友情链接:


前情提要

通过上个系列的文章我们了解到了各节点数据副本间通过一致性算法确保每次写入在响应客户端请求之前至少被多数节点(N/2+1)持久化,这样即使机器出现故障也不会丢失数据,并且即使一个节点出现故障,其他服务器依然能够提供数据读写、写入等数据服务。同时也了解到了协议如何确保各节点执行相同的命令操作序列,最终达到一致的状态。TDDMS通过应用一致性算法满足了两地三中心、多模态数据的统一处理等场景的容错、统一处理等需求。

详情查看:分布式一致性技术的实现

那么TDDMS是如何确保系统可以快速的找到元数据和数据,提供数据读写能力的呢?本章节将为您介绍TDDMS是如何进行数据存储以确保后续的操作可以更加快速高效。

元数据(Metadata)是描述其他数据的数据,它为数据提供上下文、结构、定义和结构等信息,可以使数据管理更为高效,有助于优化查询性能和存储效率。


TDDMS数据分布结构

TDDMS中数据分布的基本单位为tablet,tablet则由tablet server进行管理。而master server则保存着元数据,其实际存的数据量很少,主要目的是为了辅助client更快速的定位到数据所在的tablet。更多细节查看:TDDMS是什么

image.png

名词介绍

TDDMS中的数据分布主要涉及分片(Tablet)、分区(Section)、分桶(Bucket)三个维度。

分片 - Tablet

Tablet是TDDMS中数据分布的基本单位,TDDMS将表拆分为多个Tablet,由TabletServer管理,根据分区&分桶字段对数据进行分布。分片赋予了系统水平扩展的可能性,可以帮助平衡查询工作的负载,降低节点压力。

分区 - Section

分区以Section(表结构的基本单位)的形式存于Tablet中,每张表都会有一个默认的Section。分区表则会在默认Section之外,根据所设定的分区条件,创建对应的Section。Tablet与Section为多对多的关系。一个Section的数据会存于多个Tablet中,一个Tablet也会存储多个Section的数据。

分桶 - Bucket

分桶其实并不是TDDMS本身的概念,是由不同的存储引擎自身定义的。

分区指的是在一张表内对数据进行切分,分桶则指的是在一个分区内对数据进行分组。在大多数场景中设置分桶的概念是为了保证数据的离散度,使数据均匀分布,这样在后续的计算中通过并行处理,尽可能的提高资源利用率。设置分桶也可以加速数据的过滤。


分片详解

什么是分片

数据存储系统中数据量会随着时间的推移不断增加,如果继续使用传统解决方案,将所有数据存储在一个表中,当有多个用户试图同时访问并针对数据库进行操作时,整体的处理效率会不断降低,也会产生并发瓶颈。

数据分片将大型数据集拆分为更小、更易处理和操作的块,并存储在多台数据库服务器上来协同工作,解决单一服务器存储容量和计算资源上限的问题。举个比较通俗易懂的例子,就像是将物品存在不同的抽屉中,我们在找想要的物品时,只需要拉开对应标签的抽屉即可快速找到

TDDMS中的Master服务负责数据副本的放置策略以及元信息管理(表的元数据),比如当需要进行检索等操作时,只需从Master处获取信息即可找到数据存储对应的节点信息、分片信息、状态如何等等,大大提高了数据存储、管理的效率,实现了稳定的存储增长、高性能和易维护。

分片的重要性

  • 缩短响应时间:单个大型数据库的数据检索需要遍历多行,返回结果集耗费时间久。通过将数据划分为多个分片,每个分片都可以独立访问,大大缩短了检索等操作的响应时间;
  • 高效扩展:通过将数据划分为多个分片,将存储负载分散到多个节点上,避免了单表的无限增长而导致性能下降,为系统的可扩展性提供了良好基础。当系统需要扩展存储容量的时候,只需增加节点添加分片就好,无需对整个系统进行重建;
  • 避免服务完全中断:即使某个节点发生故障,系统仍然可以通过其他节点恢复数据(回顾上个章节的一致性算法),保证数据的完整性和可靠性;

分片策略

分片策略是指按照一定的规则将数据集以行划分成若干个分片以平衡负载,减少通信开销,提升效率。常见的分片策略有以下几种:

  • 随机分片:将数据随机地划分到不同的节点上,可以保证数据均匀分布,提高系统的负载均衡能力;
  • 范围分片:将数据行根据某个属性的数值范围进行划分,每个范围直接映射到不同的分片;理想情况下,分片键应该是固定不变的。如果分片键发生变化,则必须重新计算分片并将记录复制到新分片。否则,映射会被破坏并且可能会丢失位置。范围分片也称为动态分片。

image.png

  • 哈希分片:哈希分片指的是把数据的关键属性通过哈希函数计算得到哈希值,再根据哈希值的范围将数据分片存储。哈希分片简单高效,提供了更均匀的数据分布;

image.png

Tablet的分布决定了,表的数据实际存放在多少块磁盘上,直接影响了表的读写性能,因而在星环产品的数据存储中,提供了多种方式简化Tablet数量和分布的设置,比如依靠哈希分片策略的随机性以及不同的分布公式(是否有分桶是否有分区)进行合理分布。降低了存储与计算的倾斜几率,计算速度快,而且哈希分片策略随机性的特点也为存储带来了好的均衡性


分区

分区指的是将数据集划分为更小、更易于单独管理和访问的子集存于tablet中,通过将数据分布在多个tablet上减少争用,利用并行处理提高计算资源的利用率,优化性能。因此,分区在整个存储架构中也是至关重要的因素之一。

分区为什么重要

  • 提升性能:通过将数据分成多个分区,可以并发访问数据集,跨多个节点并行执行数据读取、写入和分析等多种操作,缩短处理时间并减少延迟提高整体性能。并且,查询只需要访问特定分区的数据,避免扫描全表,减少磁盘I/O,从而加速查询操作,降低响应时间;
  • 提升运维便利:分区使得数据维护操作更加精确,例如我们按年分区,要删除指定年份的数据,无需使用性能开销极大的 DELETE FROM … WHERE year=2001,而是直接使用 `DROP TABLE table_partition_2001`来快速删除分区数据(几乎无开销)。每个分区都可以独立处理,也简化了数据迁移、归档等操作;
  • 提升可用性和扩展性:表分区允许根据业务需求进行定制,例如按时间、业务部门等进行分区,单个分区出现故障,其他分区数据仍可用,且修复成本更低;同时,将每个分区托管在单独的服务器上,可以避免单表的无限增长而导致性能下降,为系统的可扩展性提供了更好的基础;
  • 更高效的资源利用:可以通过分区更好地利用计算资源,可以将每个分区分配给特定的节点或系统,从而有效利用内存、磁盘空间和处理能力。它还有助于均匀分配数据和工作负载,防止任何单个节点过载。
  • 数据隔离和安全:通过将数据隔离到多个分区,可以在分区级别应用访问控制和安全措施。因此,敏感数据可以存储在单独的分区中,并使用额外的安全控制来更好地保护它们;

如果分区设置不当,后续在并行处理海量数据时,可能会导致性能瓶颈等风险,比如分区中数据分布不均匀、或某些分区的数据量存在数据量级上的差异则很容易引起数据倾斜(详情查看:数据倾斜现象诱因、原理、影响,以及星环对此的应对策略)。因此,数据的合理分布对于系统的可用性、运行性能都起着至关重要的核心作用

分区策略的设计

设计适当的表分区策略是确保分区表性能最大化的关键一步,有效的分区策略可以提高系统的查询性能、扩展性等等。用户在建表时用户需要指定分区策略,可以基于以下维度进行设计:

a. 分析查询需求:分析查询需求,重点关注经常被查询的数据的过滤条件,以选择适当的分区键,使得满足这些过滤条件的数据能够集中在同一分区中,从而优化查询性能;

b. 确认数据类型:推荐使用 STRING 或时间类型的列作为分区键,通常可以帮助在数据均衡和分区数量上取得较好的平衡;

c. 权衡分区规模:常规情况下,单个分区的数据量控制在 500GB 内,如果集群的 CPU 核数较多,可适当提升,此外,我们还需要关注数据的增长趋势,例如数据按时间增长,时间则是一个优秀的分区键,查询按时间范围过滤时会更高效;

d. 选择合适的分区策略:

星环存储支持多种分区策略,比如范围分区、单值分区,在新版本中还新增了归档分区策略,用户可以根据自身业务需求进行选择。

  • 范围分区:根据分区键的值范围来划分分区,执行分区时可基于列值分布均衡度和查询需求来自由划分范围,可以避免分区间的数据规模差距过大,提升查询效率;
  • 单值分区:将拥有相同分区键的记录划分在同一分区中,适用于列基数较少(例如城市名)且分布较为均衡的场景;
  • 归档分区:本质是用范围分区去表示单值分区,可以进行分区合并, 适用于历史分区比较多且很少被访问到的场景,比如对访问量极低的旧数据进行管理和归档,方便用户针对数据进行日常维护,提升检索效率;

image.png

分区键的选择

其次,分区键也是至关重要的一个因素。分区键是用于将数据集划分为分区或子集的属性或标准,决定了数据在分区系统中的分布和组织方式。当数据被分区时,key用于将每个记录或数据项分配给特定的分区。例如,分区键可以是客户 ID、地理区域或时间戳等等。选择分区键时需要考虑多个关键维度,比如需要具备高基数的特性以确保跨分区的数据均匀分布,有助于防止数据倾斜并确保工作负载均衡;再比如需要选择查询或过滤器中经常使用的键,通过减少跨分区扫描的数据量来提高查询性能等等。

性能优化--表分区实践最佳案例

详情请查阅: 分区实践


分桶

什么是分桶?

我们前面介绍了如何通过对表进行分片、分区来提高查询效率,但对于某些特定的查询模式,特别是需要频繁地进行数据联接查或取样的场景,仍然可能面临性能瓶颈。此外,随着数据的不断积累,可能会出现某些分区数据量过大,导致查询和处理效率受到影响。

为了更细粒度地管理和优化数据存储与访问,数据分桶(Bucketing)技术逐渐受到了关注,即对指定列的哈希值将其分配到固定数量的子集中(桶),保障数据的均匀分布,从而为复杂查询提供了更高效的处理方式。

image.png

分桶的重要性

TDDMS中的数据分桶是通过对特定列的值进行哈希处理来更好地均匀分布数据、优化特定模式下的查询,优势如下:

  • 优化特定查询模式:对于涉及桶列的JOIN和过滤操作,分桶可以大大加速查询,因为它能确保只有相关的桶被访问和处理。例如,基于桶键的 JOIN 操作可以在 map 阶段执行,避免了 shuffle 和 reduce阶段的开销;
  • 此外,当查询的谓词包含分桶键时,可快速定位到具体的分桶,极大减少数据扫描范围,提升查询效率;
  • 增加数据访问的预测性: 由于数据是基于哈希值进行分桶的,所以系统可以准确地知道哪些数据位于哪个桶中。这为数据访问提供了更高的预测性,从而进一步提高了查询性能;

TDDMS支持多分桶列、单分桶列以满足用户的需求

  • 多分桶列:适用于处理高任务并行度的查询,假设数据的一个主要特征或多个特征经常被一起查询或用于 JOIN 操作,即使查询条件没有涵盖所有分桶列的等值条件,该查询也可通过扫描关联的分桶,提高任务执行的并行度;
  • 单分桶列:适用于高并发的点查询,使其只需扫描与该键匹配的特定桶,减少不同查询之间的 I/O 干扰,并提高系统的响应时间;

当然,分桶不一定会百分百带来系统性能的提升,在决定对表进行分桶时还需要结合多种因素进行考量以最大限度地提高查询性能:

  • 是否存在高频的连接操作?当两个大表需要经常进行连接操作,并且连接基于某个特定的列,经常因为数据移动而产生大量的 Shuffle 读写,拖慢了查询效率;
  • 是否存在频繁的聚合操作?对于需要频繁执行的聚合操作,如果按照聚合的键进行数据分桶,可以大大提高查询性能,因为每个节点可以独立地完成其桶内的聚合操作;

分桶键的选择

对表分桶时会将表中记录按分桶键的哈希值分散进多个桶中。选择合适的分桶键也是分桶优化成功的关键因素之一。选择分桶键时需要考虑多个关键维度,比如需要分析数据在列上的分布情况,一个理想的分桶键应该有较大的基数和较少的重复值,避免桶中的数据不均衡。在具体实践中,您也可以使用小规模数据量的表来尝试使用不同的分桶键,比较分桶获得到的查询收益,找出为您提供最佳性能的选择。

性能优化--表分桶实践最佳案例

详情请查阅: 分桶实践


TDDMS的存储场景及优势

综上,针对不同层级的数据分布,TDDMS设置了多种策略来满足用户在存储管理方面的需求。此外还有一些其他方面的技术优势:

  • 支持多种存储场景,助力企业生产需求,比如冷热数据分离

在部分行业,很多业务对数据的访问并不是均匀的,而是呈现相对的数据访问倾斜,根据数据的时效性以及访问的频繁度,数据通常会被分为冷温热三级数据。不同数据存储地方不同,耗费的资源、成本也不同。比如对于热数据,即访问频次较高的数据,存储在热数据盘(SSD介质),满足高性能、低延迟访问的需求;对于冷数据,即访问频次较低的数据,可以选择存储在较廉价的冷数据盘中(HDD介质),满足高性价比的存储需求,优化存储成本。

星环科技提供多种存储方案,可以有效平衡存储成本和查询性能需求。比如,支持冷热数据分层存储,同时也支持手动、自动转换,支持设置自动转换策略。TDDMS底层提供数据移动等功能,当冷热数据出现变化时,可以快速的进行动态调整,第一时间避免资源的消耗,提升系统整体存储性能的同时更加高效的适配企业业务。

  • 插件化设计,灵活适配多种存储需求

TDDMS不仅屏蔽掉了底层存储引擎的差异化,为用户提供统一的编程与运维接口。同时,还将存储引擎解耦,并定义成一组插件化的接口,这种插件化的设计允许用户针对不同的需求组织存储引擎,使得TDDMS能够灵活适配不同的业务场景和存储需求。

  • TDDMS提供数据读写接口而非文件接口,可以支持管理多种存储格式,为不同的数据模型提供格式化的数据读写接口,比如二维数组、全文检索数据、键值数据等等(回顾上节: TDDMS介绍 );
  • 支持多种索引,不同类型的索引都有其独特的特性和使用场景,比如星环自研的Holo表可以支持多种索引类型,提高查询效率,减少查询开销;
  • TDDMS为每个数据块创建了多个副本并分散得存储在不同的节点上,其副本分配策略保证了节点间的负载均衡,节点内数据在磁盘间均衡,避免出现部分节点负载过高而导致性能下降的情况;
  • TDDMS的存储以tablet为粒度,均衡度更高,支持data locality(数据局部性,指的是说将计算移动到数据所在节点的过程,最大限度地减少网络拥塞并提高计算吞吐量);
  • 在频繁的进行小数据量写入操作的时候,会产生大量的小文件,并且内容很少(KB级别)。小文件过多可能导致查询过程中的IO开销大,影响性能或者内存占用高。星环产品推出了小文件合并功能之外还提供了多种小文件合并参数及机制;
  • TDDMS采用一致性协议,提供了多数派有效判断机制,防止系统故障,满足高可用(回顾上节: 分布式一致性技术实现 );
  • 内置事务模型,更适用于商用数据库场景(参考下个系列,分布式事务管理);
  • 基于MVCC的Base、Detle数据删改支持,支持更高并发数据变更;(参考下个系列,分布式事务管理)


...未完待续

评论
登录后可评论
发布者
星小环分享号
文章
184
问答
210
关注者
27
banner
关注星环科技
获取最新活动资讯

加入TDH社区版技术交流群

获取更多技术支持 ->

扫描二维码,立即加入