Apache Doris : 一个开源 MPP 数据库的架构与实践

图片



分享提纲:
前端

  • Doris 背景介绍算法

  • 适用场景 & 案例介绍数据库

  • Doris 总体架构缓存

  • Doris 关键技术服务器

Doris 背景介绍网络

介绍 Doris 的总体架构,以及 Doris 的一些特性。数据结构

1、Doris架构

Doris 是分布式、面向交互式查询的分布式数据库,主要部分是 SQL,内部用到 MPP 技术。并发

什么是 MPP?app

MPP ( Massively Parallel Processing ),即大规模并行处理,在数据库非共享集群中,每一个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特色划分到各个节点上,每台数据节点经过专用网络或者商业通用网络互相链接,彼此协同计算,做为总体提供数据库服务。非共享数据库集群有彻底的可伸缩性、高可用、高性能、优秀的性价比、资源共享等优点。简单来讲,MPP 是将任务并行的分散到多个服务器和节点上,在每一个节点上计算完成后,将各自部分的结果汇总在一块儿获得最终的结果 ( 与 Hadoop 类似 )。

Doris 主要解决 PB 级别的数据量(若是高于 PB 级别,不推荐使用 Doris 解决,能够考虑用 Hive 等工具),解决结构化数据,查询时间通常在秒级或毫秒级。

Doris 由百度大数据部研发 ( 以前叫百度 Palo,2018年贡献到 Apache 社区后,改名为 Doris ),在百度内部,有超过200个产品线在使用,部署机器超过1000台,单一业务最大可达到上百 TB。

百度将 Doris 贡献给 Apache 社区以后,许多外部用户也成为了 Doris 的使用者,例如新浪微博,美团,小米等著名企业。

2、Doris 定位

在数据分析处理框架中,Doris 主要作的是 Online 层面的数据服务,主要处理的是数据分析方面的服务。

图片

Doris 的目标是:实现低成本(主要针对商业产品),可线性扩展,支持云化部署,高可用,高查询性能,高加载性能。

图片

简要介绍两个百度内部业务中 Doris 的应用案例:

A. 百度统计在线报表

图片

B. 百度另外一内部业务的多维分析

图片

能够手动拖拽维度、指标等,进行查询。

适用场景 & 案例介绍

1、适用场景

一、对数据分析、统计

数据分析大致上能够分为两大类场景:一种偏向于报表类的,另外一种偏向于多维分析的。

二、报表

报表类数据分析,数据分析以及查询的模式相对比较固定,并且后台 SQL 的模式每每都是肯定的。针对此类应用场景,选择使用 MySQL 存结果数据,用户可从界面选择执行批处理以及发送邮件。在 Doris 平台中,报表类查询时延通常在秒级如下。

三、多维分析

这里提到的多维分析,一样要求数据是结构化的,适用于查询相对灵活的场景,例如数据分析条件以及聚合维度等方面不是很肯定,通常将此类数据分析定义为多维分析。相对于报表类分析,多维分析的查询时延会稍慢,大约在会在 10s 的级别。

2、具体案例

案例分析 1:百度统计

百度统计,为网站站长提供流量分析,网站分析,受众分析等多种分析服务。服务网站数量超过 450W,天天查询量达到 1500W,QPS ( Queries Per Second,每秒查询率 ) 峰值超过1400,每日新增数据量超过 2TB;数据导入频次为5分钟,平均查询时延 30ms。

案例分析 2:百度云系统

一、百度云交易系统

百度云交易系统,主要提供订单、帐单、扣费、交易流水等 TB 级别量数据的存储和实时查询服务,数据量约 12TB,每5分钟导入。

二、百度云数据中心

百度云数据中心,主要提供百度云经营分析,产品分析,用户分析等多种分析服务;提供多维度(100+)分析,具有高性能 ( 秒级 ) BI 能力;百度云数据中心的日处理数据量约 1T ( 略少于百度统计,所以查询效率略高于百度统计 ),分钟级导入。如下是百度云数据中心页面的一个截图:

图片

Doris 总体架构

1、Doris 总体架构

图片

Doris 的总体架构和 TiDB 相似,借助 MySQL 协议,用户使用任意 MySQL 的 ODBC/JDBC以及MySQL 的客户端,均可以直接访问 Doris。Doris 中的模块包括 FE 和 BE 两类:FE 主要负责元数据的管理、存储,以及查询的解析等;一个用户请求通过 FE 解析、规划后,具体的执行计划会发送给 BE,BE 则会完成查询的具体执行。BE 节点主要负责数据的存储、以及查询计划的执行。目前平台的 FE 部分主要使用 Java,BE 部分主要使用 C++。

2、Doris 数据分布

若是从表的角度来看数据结构,用户的一张 Table 会拆成多个 Tablet,Tablet 会存成多副本,存储在不一样的 BE 中,从而保证数据的高可用和高可靠。

图片

3、Doris 的使用方式

Doris 的使用方式和 MySQL 相似,建立 database,建立 table,导入数据、执行查询等。具体详见下图:

图片

Doris 关键技术

1、数据可靠性

一、元数据使用 Memory+Checkpoint+Journal ( 分别是什么?),使用 BTBJE ( 相似于 Raft ) 协议实现高可用性和高可靠性。

二、Doris 内部自行管理数据的多副本和自动修复。保证数据的高可用、高可靠。在服务器宕机的状况下,服务依然可用,数据也不会丢失。

图片

2、易运维

无外部依赖:

  • Doris 部署无外部依赖,只须要部署 BE 和 IBE 便可搭建起一个集群。

  • 支持 Online Schema Change

  • 支持在线更改表模式 ( 加减列,建立 Rollup ),不会影响当前服务,不会阻塞读、写等操做;这种执行是异步的 ( 用户不须要一直盯在那里 )

数据库同步操做和异步操做:

同步,是全部的操做都作完,才返回给用户结果;即写完数据库以后,再响应用户,用户体验很差;

异步,不用等全部操做等作完,就相应用户请求;即先相应用户请求,而后慢慢去写数据库,用户体验较好。缓存机制(也就是消息队列),就是异步操做的一个典型应用。

一、副本自动均衡

传统数据库的扩(缩)容比较麻烦,有时甚至须要重作数据;而 Doris 数据库只须要一条 SQL ( 无须额外操做 ) 便可实现扩(缩)容。

二、内置监控

使用 Prometheus、Grafana 将监控项指标列出。

下图为 Doris 默认配置面板:

图片

3、MySQL 兼容性

MySQL 的兼容性从两方面体现:

一、兼容 MySQL 的网络协议 ( MySQL Network Protocol )

二、兼容 MySQL 语法,使用 MySQL 语法可对 Doris 数据库进行查询

  • 关于 MySQL 语法的兼容性,前文已经描述过,这里再也不赘述;

  • 关于 MySQL 的网络协议的兼容性,举个简单的例子:MySQL 的调度服务器 Proxy,能够直接用做 Doris 的 Proxy。

图片

  • Doris 的前端展现,可使用 MySQL 专属展现器 Tableu。下图就是使用 Tableu 将 Doris 数据可视化的一个范例。

图片

  • Doris 与 R 语言能够实现无缝对接,用 R 语言可直接操做 Doris 数据库,进行数据分析、数据挖掘等工做。

4、支持 MPP

MPP 即 Massively Parallel Processing,大规模并行处理,即海量数据并发查询。如下图为例:

执行

SELECT k1,SUM(v1) FROM A,B WHERE A.k2=B.k2 GROUP BY k1 ORDER BY SUM(v1)

语句,该语句包含了合并、聚合计算、排序等多种操做;在执行计划的时候,MPP 将其拆分红多份,分布到每台机器执行,最后再将结果汇总。假若有10台机器,在大数据量下,这种查询执行方式可使得查询性能达到10倍的提高。

图片

Doris 数据模型

1、Doris 数据模型特色

一、键值对存储形式:

相似于字典搜索查询的键值对格式,Doris 中全部数据分红两列:Key 列和 Value 列。以下图所示,Time、Id、Country 列共同组成 Key 列,Clicks、Cost 列为 Value 列。Key 列有序可进行快速查找,Value 列能够按照具体聚合类型内部完成数据聚合。

图片

二、Key 列全局有序排列,查询时方便快速定位查找。

Doris 数据模型的一个显著特色是 Key 列全局惟一,所以存在相同 Key 值的不一样 Value,则后面的数据与前面的数据自动作 ( SUM,MIN,MAX,REPLACE ) 等聚合处理。例如,下图中绿色方框中的两行,相同的 Key 值对应不一样的 Value;所以,新的 Value 到达后,与前数据做 SUM 处理,获得最新的数据,不只提高效率,还可提升数据处理的准确性。

图片

2、聚合计算说明:

本部分具体描述相同 Key 值下 Value 值的聚合。

数据的导入是分版本的(例以下图右侧91,92版本),每个版本之间 Key 相同的数据汇总到中间表中,经过聚合处理最终输出为左侧的 base。

图片

3、按列存储

一、Doris 的数据是按列存储的,每一列单独存放。

二、查询时,只访问查询涉及的列,大量下降 I/O。

三、数据类型一致,方便压缩。

四、数据包建索引,数据即索引。

五、利用原始过滤条件以及 min、max 和 sum 等智能索引技术,将数据集查询范围尽量地缩小,大大减小 I/O,提高查询效率。

4、物化视图

物化视图是提取某些维度的组合创建对用户透明的却有真实数据的视图表格。Doris 的物化视图能够保证用户在更新时,直接更新原始表,Doris 会保证原表、物化视图原子生效。在查询的时候用户也只需指定原始表,Doris 会根据查询的具体条件,选择适合的物化视图完成查询。

一般用户能够经过物化视图功能完成如下两种功能。

一、更换索引列进行重排列

二、针对指定列作聚合查询

图片

5、两层分区与分级存储

两层分区:

一、方便新旧数据分离,使用不一样的存储介质(例如新数据使用 SSD,历史数据 SATA)

二、分区减小了大量历史数据没必要要的重复 BE/CE,节省了大量的 IO 和 CPU 开销

三、两层分区的方法简化了表的扩容,便于 shard 调整(例如,前期没必要创建过多 shard,后期随着业务增加客随时调整 shard 数)

分级存储

用户能够指定数据放到 SSD 上或者 SATA 盘上,也支持根据 TTL 将冷数据从 SSD 迁移到 SATA 上,高效利用 SSD 提升查询性能。

图片

6、Doris 在 Elasticsearch 的应用

简介:

一、ES 的优势是索引,可支持多列索引,甚至可支持全文语义索引(如 term,match,fuzzy 等);然而其缺点是没有分布式计算引擎,不支持 join 等操做

二、与 ES 相反,Palo 具有丰富的 SQL 计算能力,以及分布式查询能力;然而其索引性能较低,不支持全文索引。

三、Doris 在 ES 开发的过程当中,分别借鉴 ES 和 Palo 的长处,支持了 Elasticsearch 多表 Join 操做,同时引入 Elasticsearch 的语义搜索功能,扩充了 Doris 的查询能力。

使用方式:

第一步:创建一张 ES 的外部表。

图片

第二步:在 ES 外部表中导入一些数据:

图片

第三步:使用和 ES 同样的搜索语句,进行全文检索查询:

图片

相似于上图这样的搜索语句,在 SQL 中比较难以表达,可是在 ES 中较容易实现。

7、Kafka 消息队列加载

一、Doris 内部支持订阅 Kafka 数据流,实现直接对接 Kafka:

图片

二、用户数据源经 Kafka 消息队列收集后,能够依次进入到 Doris 中,经过 Doris 作报表展现和决策分析等工做。

图片

三、优势

  • 无需额外组件,用户可直接经过命令实现 Kafka 消息订阅。

  • 精确传输,秒级延迟。

  • Doris 可自动感知 Kafka 中 partition 变化,合理调度并发导入。

  • 在数据导入这一过程当中,支持对 Kafka 原始数据作二次处理(如转换,过滤等)。

8、Doris 其余特性

  • 原子性——即一批数据要么都生效,要么都不生效。

  • 支持单机多盘

  • 向量化执行

  • UDF ( User Defined Function 用户自定义函数 )

  • 内置 HLL 类型,快速计算 UV

嘉宾介绍

赵纯,百度资深研发工程师。Doris 项目最初创始人之一。工做7年以来一直从事 OLAP/OLTP 等数据库相关领域。



关于 DataFun:

DataFun 定位于最实用的数据智能平台,主要形式为线下的深度沙龙、线上的内容整理。但愿将工业界专家在各自场景下的实践经验,经过 DataFun 的平台传播和扩散,对即将或已经开始相关尝试的同窗有启发和借鉴。

DataFun 的愿景是:为大数据、人工智能从业者和爱好者打造一个分享、交流、学习、成长的平台,让数据科学领域的知识和经验更好的传播和落地产生价值。

DataFun 成立至今,已经成功在全国范围内举办数十场线下技术沙龙,有超过三百位的业内专家参与分享,汇集了数万大数据、算法相关领域从业者。

图片

相关文章
相关标签/搜索