#博学谷IT学习技术支持#
1 Doris 概述
1.1 Doris 简介
Doris由百度大数据部研发,之前叫百度Palo,于2017年开源,2018年贡献到 Apache 社区后,更名为Doris。
Apache Doris是一个现代化的基于MPP(大规模并行处理)技术的分析型数据库产品。简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似) 。仅需亚秒级响应时间即可获得查询结果。
Apache Doris可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等
MPP ( Massively Parallel Processing ),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点上,每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务。非共享数据库集群有完全的可伸缩性、高可用、高性能、优秀的性价比、资源共享等优势。简单来说,MPP 是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果 ( 与 Hadoop 相似 )
1.2 核心特性
- 基于MPP(大规模并行处理)架构的分析型数据库
- 性能卓越,PB级别数据毫秒/秒级响应
- 支持标准SQL语言,兼容MySQL协议
- 向量化执行器
- 高效的聚合表技术
- 新型预聚合技术Rollup
- 高性能、高可用、高可靠
- 极简运维,弹性伸缩
1.3 特点
-
性能卓越
- TPC-H、TPC-DS性能领先,性价比高,高并发查询,100台集群可达10w QPS,流式导入单节点50MB/s,小批量导入毫秒延迟
-
简单易用
- 高度兼容MySql协议;支持在线表结构变更高度集成,不依赖于外部存储系统
-
扩展性强
- 架构优雅,单集群可以水平扩展至200台以上
-
高可用性
- 多副本,元数据高可用
1.5 开源OLAP引擎对比
-
OLTP 与 OLAP
- OLTP是 Online Transaction Processing (在线交易处理)的简称;OLAP 是 OnLine Analytical Processing (在线分析处理)的简称
- OLTP的查询一般只会访问少量的记录,且大多时候都会利用索引。比如最常见的基于主键的 CRUD 操作
- OLAP 的查询一般需要 Scan 大量数据,大多时候只访问部分列,聚合的需求(Sum,Count,Max,Min 等)会多于明细的需求(查询原始的明细数据)
-
HTAP
- HTAP 是 Hybrid Transactional(混合事务)/Analytical Processing(分析处理)的简称。
- 基于创新的计算存储框架,HTAP 数据库能够在一份数据上同时支撑业务系统运行和 OLAP 场景,避免在传统架构中,在线与离线数据库之间大量的数据交互。此外,HTAP 基于分布式架构,支持弹性扩容,可按需扩展吞吐或存储,轻松应对高并发、海量数据场景。
- 目前,实现 HTAP 的数据库不多,主要有 PingCAP 的 TiDB、阿里云的 HybridDB for MySQL、百度的 BaikalDB 等。其中,TiDB 是国内首家开源的 HTAP 分布式数据库。
-
OLAP分类
- MOLAP:通过预计算,提供稳定的切片数据,实现多次查询一次计算,减轻了查询时的计算压力,保证了查询的稳定性,是“空间换时间”的最佳路径。实现了基于Bitmap的去重算法,支持在不同维度下去重指标的实时统计,效率较高。
- ROLAP:基于实时的大规模并行计算,对集群的要求较高。MPP引擎的核心是通过将数据分散,以实现CPU、IO、内存资源的分布,来提升并行计算能力。在当前数据存储以磁盘为主的情况下,数据Scan需要的较大的磁盘IO,以及并行导致的高CPU,仍然是资源的短板。因此,高频的大规模汇总统计,并发能力将面临较大挑战,这取决于集群硬件方面的并行计算能力。传统去重算法需要大量计算资源,实时的大规模去重指标对CPU、内存都是一个巨大挑战。目前Doris最新版本已经支持Bitmap算法,配合预计算可以很好地解决去重应用场景。
-
doris是一个ROLAP引擎, 可以满足以下需求
- 灵活多维分析
- 明细+聚合
- 主键更新
-
对比其他的OLAP系统
-
MOLAP模式的劣势(以Kylin为例)
- 应用层模型复杂,根据业务需要以及Kylin生产需要,还要做较多模型预处理。这样在不同的业务场景中,模型的利用率也比较低。
- 由于MOLAP不支持明细数据的查询,在“汇总+明细”的应用场景中,明细数据需要同步到DBMS引擎来响应交互,增加了生产的运维成本。
- 较多的预处理伴随着较高的生产成本
-
ROLAP模式的优势
- 应用层模型设计简化,将数据固定在一个稳定的数据粒度即可。比如商家粒度的星形模型,同时复用率也比较高。
- App层的业务表达可以通过视图进行封装,减少了数据冗余,同时提高了应用的灵活性,降低了运维成本。
- 同时支持“汇总+明细”。
- 模型轻量标准化,极大的降低了生产成本
总结:
综上所述,在变化维、非预设维、细粒度统计的应用场景下,使用MPP引擎驱动的ROLAP模式,可以简化模型设计,减少预计算的代价,并通过强大的实时计算能力,可以支撑良好的实时交互体验
- 数据压缩率Clickhouse好
- ClickHouse单表查询性能优势巨大
- Join查询两者各有优劣,数据量小情况下Clickhouse好,数据量大Doris好
- Doris对SQL支持情况要好
Clickhouse Doris 二选一?
1.6 使用场景
一般情况下,用户的原始数据,比如日志或者在事务型数据库中的数据,经过流式系统或离线处理后,导入到Doris中以供上层的报表工具或者数据分析师查询使用
也可以去掉数据存储直接用doris
2. Doris原理
2.1 名词解释
2.2 整体架构
Doris主要整合了Google Mesa(数据模型),Apache Impala(MPP Query Engine)和Apache ORCFile (存储格式,编码和压缩) 的技术
什么要将这三种技术整合?
- Mesa可以满足我们许多存储需求的需求,但是Mesa本身不提供SQL查询引擎。
- Impala是一个非常好的MPP SQL查询引擎,但是缺少完美的分布式存储引擎。
- 自研列式存储:存储层对存储数据的管理通过storage_root_path路径进行配置,路径可以是多个。存储目录下一层按照分桶进行组织,分桶目录下存放具体的tablet,按照tablet_id命名子目录。
因此选择了这三种技术的组合。
Doris的系统架构如下,Doris主要分为FE和BE两个组件:
-
Doris的架构很简洁,使用MySQL协议,用户可以使用任何MySQL ODBC/JDBC和MySQL客户端直接访问Doris,只设FE (Frontend)、BE(Backend) 两种角色、两个进程,不依赖于外部组件,方便部署和运维。
- FE:Frontend,即 Doris 的前端节点。主要负责接收和返回客户端请求、元数据以及集群管理、查询计划生成等工作
- BE:Backend,即 Doris 的后端节点。主要负责数据存储与管理、查询计划执行等工作。
- FE,BE都可线性扩展
-
FE主要有两个角色,一个是follower,另一个是observer。多个follower组成选举组,会选出一个master,master是follower的一个特例,Master跟follower,主要是用来达到元数据的高可用,保证单节点宕机的情况下,元数据能够实时地在线恢复,而不影响整个服务。
-
Observer节点仅从 leader 节点进行元数据同步,不参与选举。可以横向扩展以提供元数据的读服务的扩展性。
-
数据的可靠性由BE保证,BE会对整个数据存储多副本或者是三副本。副本数可根据需求动态调整
2.3 元数据结构
Doris采用==Paxos协议以及Memory+ Checkpoint + Journal的机制==来确保元数据的高性能及高可靠。元数据的每次更新,都会遵照以下几步:
- 首先写入到磁盘的日志文件中(预写日志)
- 然后再写到内存中(缓冲区)
- 最后定期checkpoint到本地磁盘上
相当于是一个纯内存的一个结构,也就是说所有的元数据都会缓存在内存之中,从而保证FE在宕机后能够快速恢复元数据,而且不丢失元数据。
Leader、follower和 observer它们三个构成一个可靠的服务,如果发生节点宕机的情况,一般是部署一个leader两个follower,目前来说基本上也是这么部署的。就是说三个节点去达到一个高可用服务。单机的节点故障的时候其实基本上三个就够了,因为FE节点毕竟它只存了一份元数据,它的压力不大,所以如果FE太多的时候它会去消耗机器资源,所以多数情况下三个就足够了,可以达到一个很高可用的元数据服务
2.4 数据分发
- 一张table会拆分成多大tablet , tablet会存成多个副本,存储在不同BE中,从而保证数据的高可用和高可靠
- 数据主要都是存储在BE里面,BE节点上物理数据的可靠性通过多副本来实现,默认是3副本,副本数可配置且可随时动态调整,满足不同可用性级别的业务需求。FE调度BE上副本的分布与补齐。
- 如果说用户对可用性要求不高,而对资源的消耗比较敏感的话,我们可以在建表的时候选择建两副本
或者一副本
3 部署
- doris.apache.org/
- 呼叫运维
FE + BE + Broker
Broker 是用于访问外部数据源(如 hdfs)的进程。通常,在每台机器上部署一个 broker 实例即可。