本系列包含:
Apache Doris 是由 百度 研发并开源的数据库项目。 Doris 2008 年开始在百度内部立项,经历了五个大版本的迭代后于 2017 年开源,2018 年进入 Apache 基金会孵化项目。2022 年 4 月 18 日正式发布 Doris 1.0
,2022 年 6 月 16 日正式毕业,成为 Apache 软件基金会的顶级项目。
Doris 数据库软件主要有 BE 和 FE 两个组件构建。BE 是后台数据存取组件,是由 C++ 语言编写;FE 是前端查询入口和查询解析组件,由 Java 语言编写。
Doris 最大的特点是提供了三大数据模型:
Duplicate Key
模型也叫 可重复模型、明细模型,和普通的数据库表用法一样,保留每一条插入的数据,并且支持索引。
Aggregate Key
模型也叫 聚合模型、汇总模型,将表的所有字段分为维度列和指标列,按照维度汇总指标数据,大大缩小数据量。
Unique Key
模型也叫 去重模型、唯一模型,是按照主键保留最新记录,用于实现数据的删除和修改。
此外,Doris 还支持各种外部表,包括 ODBC 外部表、Hive 外部表、ES 外部表和 Iceberg 外部表,分别用于直接使用 Doris 查询引擎查询关系型数据库、Hive 数仓、ES 文本检索和 Iceberg 数据湖的数据,极大的拓宽了 Doris 数据库的应用边界。
虽然 Doris 对外部表支持很丰富,但是外部表由于网络的瓶颈和无法支持索引,因此大数据的查询性能低于内部表,这里我们就要用到 Doris 的数据导入能力。Doris 的数据导入具有原子性,也就是说一批数据要么全部导入成功,要么全部失败;也支持容错参数,低于一定比例异常的数据都视为成功。
Doris 数据导入和数据搬迁工具包括 Insert Into
、Stream Load
、Broker Load
、Routine Load
、Binlog Load
、Spark Load
和 DataX 导入。
库内数据处理优先 Insert Into
,离线数据导入优选 Stream Load
和 DataX 导入,流式数据接入可以选择 Routine Load
和 Binlog Load
,Hive 数据导入选择 Broker Load
和 Spark Load
。可以看出,Doris 支持的数据来源非常丰富,并且对各种大数据生态产品支持都非常友好。
当然,我们还可以通过外部表直接 Insert Into
来搬迁数据量较小的外部数据。
然后就是 Doris 的多表关联功能。Doris 支持 Shuffle Join
、Bucket Shuffle Join
、Broadcast Join
和 Colocate Join
四种分布式 join
策略,可以最大程度减少 MPP 架构下的数据重分布,提高数据查询效率。
四种数据分布策略各有不同的应用场景,我们需要根据不同的数据关联需要进行优化,减少重分布的数据量,可以可以降低网络消耗,提高查询速度。
Doris 的核心设计参考了 Google Mesa、Apache Impala、OrcFile 存储格式。
这里我想重点介绍一下 Doris 的数据存储。Doris 的存储设计结合传统 MPP 数据库的优点和 Hadoop 分布式数据的优点,引入了一个叫 bucket
的概念。我们都知道 Hadoop 是把一个表的数据按照文件大小切分成多个块,每个块三个副本随机分布到集群的三台服务器上的。而传统的 MPP 数据(例如 Greenplum、Clickhouse),数据要么按照节点平均分布,要么每个节点一份副本的全节点分布,前者对大表友好,后者对小表友好,但是都有缺点,前者并发查询上不去,后者浪费存储,节点数据同步消耗时间多。而 Doris 则是结合二者的优点又舍弃了其缺点,既支持小表多节点分布数据,又支持大表按照指定节点数分布式,并且 Doris 的数据副本可以参与计算,分散并发查询压力。
另外,Doris 的数据文件存储格式,也是结合了行存的优点和列存的优点,选择的是基于行列混合的模式,在读写性能上也有非常大的提升。传统的 OLTP 数据库选择行存储是为了便于数据更新和删除,OLAP 数据库选择列存储是为了减少数据查询读取的列数,行列混合存储则结合了二者的优点,又提高了数据存储的灵活性。Doris 2.0
还提供了对 S3 对象存储的支持,可以将冷数据自动备份到对象存储中,并且支持在线查询,只是查询速度会降低。
最后是 Doris 的查询优化功能。Doris 在查询方面做了非常多的优化。主要包括以下几个方面:
MinMax
索引、Bloom Filter
索引、Bitmap
索引,还支持通过 rollup
设置多种不同字段组合的索引,功能简直逆天。rollup
和物化视图提前预聚合数据,减少查询的数据量,提高响应速度。然后我们回顾一下实时数仓的三大难点:多表关联、维度数据变更、数据失效。
所以我说 Doris 数据库可以解决实时数仓的三大痛点。