当前位置:首页>>新闻资讯

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

  • 2024-02-26 14:56:28
  • 超级管理员

列式存储通过支持按列存储数据,提供高性能的数据分析和查询。作为云原生数据仓库的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操作,这个代价比较大。

2. 构建时间比较长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还在元数据管理、自研表引擎等技术点深度优化,为用户提供更极致的分析体验。


  • 关注微信

猜你喜欢

微信公众号