火山引擎ByteHouse:分析型数据库如何设计列式存储

原创
01/30 12:06
阅读数 49

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群

列式存储通过支持按列存储数据,提供高性能的数据分析和查询。作为云原生数据仓库的 ByteHouse,也采用列式存储设计,保证读写性能、支持事务一致性,又适用大规模的数据计算,为用户提供极速分析体验和海量数据处理能力,提升企业数字化转型能力。

列式存储介绍

分析型数据库中的列式存储,是一种数据库的物理存储结构,它是根据数据的列而不是行来存储数据的。列式存储的主要优势在于它能够提高数据分析和查询的性能,尤其是在处理大规模数据集时。

以下是列式存储的一些主要特点:

  1. 数据压缩: 由于同一列中的数据往往具有相似或相同的数据模式(例如日期、时间、地址等),因此列式存储可以更有效地进行数据压缩,从而节省存储空间。
  2. 数据筛选性能: 列式存储使得只读取查询所需的列变得非常高效。在执行大量涉及多列的复杂查询时,可以显著减少磁盘 I/O 操作,从而提高查询性能。
  3. 计算局部性: 由于数据按列存储,在进行某些计算(如数学运算或统计函数)时,数据可以直接在内存中进行局部操作,而不需要频繁地访问磁盘,从而提高了计算效率。
  4. 数据独立性: 列式存储允许独立地更新表中的列,这使得增量更新和数据维护变得更加简单和高效。
  5. 数据分片和分布式处理: 由于列式存储的特性,它非常适合于分布式计算环境。数据可以按列进行分片,并分布到不同的计算节点上进行并行处理,从而实现大规模数据的分布式处理和分析。
  6. 灵活的数据模型: 列式存储通常支持多种数据模型,如行存储、列存储和键-值存储,这使得它能够适应不同的数据处理需求。

ByteHouse 的列式存储设计

ByteHouse 是一款云原生数据仓库,为用户提供极速分析体验,能够支撑实时数据分析和海量数据离线分析,便捷的弹性扩缩容能力,极致分析性能和丰富的企业级特性,助力客户数字化转型。

通常事务型数据库采用行存便于支持事务和高并发读写,分析型数据库采用列存减少 IO 和便于压缩。ByteHouse 采用列存的方式,保证读写性能、支持事务一致性,又适用大规模的数据计算。

Data layout

表数据物理上按 Partition Key 切分为多个 Parts 存储在统一的云存储的逻辑存储路径下,每个 Part 的大小有数据量和行数限制,计算组根据服务节点分配的策略(预先分配和实时分配)获得其对应的部分 parts。

Part Delta

Part 数据最初构建之后是一个行列混合存储的 Part 数据文件,随着 DML/数据字典/Bitmap index 等构建工作的进行 Part 存在增量数据,这部分数据可以有以下两种存储方式:

  1. 每次构建都会 Rewrite Part 数据
  2. 生成增量数据,后台异步合并成一个大的 Part 文件

方案一对整个集群的可用性可能会有一定的影响:

1.每次 DML/数据字典等构建都可能涉及到整个表 Parts 的全量 IO 操作,这个代价比较大。

  1. 构建时间比较长 DML 等操作会比较长的时间才能做完,对用户不友好,我们采用方案二。

Part 文件内容

part 数据分为两个部分:

一是整个 Part 包括 rows/schema/column data 在数据文件中的 Offset 等元信息,这部分信息持久化存储并被计算节点缓存

二是实际的数据信息,这部分信息包含实际的 column bin 数据/column mrk 数据/Map key bin/Map key index/数据字典数据/bitmap index 数据等,数据按元信息中的 Offset 信息在 Part 的数据文件依次存储。

Compaction

ByteHouse 支持将一个 part 文件拆分为多个小文件,通过配置 Part 的最大 Size 和最大行数,Compact 之后的 Part 需要满足这个限制。

ByteHouse 中的 Compaction 是在全局做的,与前面提高的全局的 block ID 保持一致。

不仅仅是列式存储能力,ByteHouse 还在元数据管理、自研表引擎等技术点深度优化,为用户提供更极致的分析体验。

点击跳转ByteHouse了解更多

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部