一、Doris 前世今生
Doris 最初是百度内部的一个 OLAP(Online Analytical Processing)项目,旨在解决海量数据分析场景下的性能与易用性问题。经过多年的打磨和优化,逐渐开源并在社区中得到了广泛的关注和应用。它在大数据领域迅速崭露头角,为企业提供了高效、灵活的数据洞察能力。
二、Doris 采用的技术
- MPP(Massively Parallel Processing)架构:Doris 基于 MPP 架构构建,能够将数据和计算任务分布到多个节点上并行处理。这使得它可以充分利用集群的计算资源,大大提升查询处理的效率,应对大规模数据集的复杂分析需求。
- 向量化执行引擎:采用向量化执行技术,以批量数据处理代替传统的行式处理方式。通过减少函数调用开销、提高 CPU 缓存命中率等方式,显著提升了数据处理的速度,尤其在处理复杂查询时优势明显。
- 列存储:数据以列的形式存储,这对于 OLAP 场景非常友好。因为在分析查询中,通常只需要读取部分列的数据。列存储减少了 I/O 开销,同时有利于数据的压缩,进一步提高存储效率和查询性能。
三、Doris 的架构原理
Doris 的架构主要由 FE(Frontend)和 BE(Backend)两部分组成。
- FE(Frontend)
- 核心功能:FE 是整个系统的管理节点和查询入口。它负责接收用户的 SQL 请求,进行语法解析、语义分析、查询优化,并生成执行计划。同时,FE 还管理着整个集群的元数据,包括表结构、分区信息、用户权限等。
- 高可用性:FE 节点可以部署多个,通过选举机制产生一个主节点(Leader)和多个从节点(Follower)。主节点负责处理写操作和元数据的变更,从节点负责同步主节点的元数据,并处理读请求。当主节点出现故障时,从节点会自动选举出新的主节点,确保系统的高可用性。
- BE(Backend)
- 数据存储与计算:BE 节点负责实际的数据存储和计算任务。每个 BE 节点都存储了一部分数据,当接收到 FE 分发的执行计划后,BE 节点会并行执行计算任务,并将结果返回给 FE。BE 节点之间通过高速网络进行数据传输和协作,共同完成复杂的查询操作。
- 弹性扩展:可以根据业务需求动态添加或删除 BE 节点。当添加新的 BE 节点时,Doris 会自动进行数据的均衡分布,确保各个节点的负载均衡。同样,当删除 BE 节点时,数据也会自动迁移到其他节点,保证数据的完整性和可用性。
四、FE 元数据管理
- 元数据存储:FE 将元数据存储在一个基于 Raft 协议的分布式存储系统中。Raft 协议保证了元数据的一致性和高可用性。所有的元数据变更操作都需要经过 Raft 协议的一致性算法,确保在多个 FE 节点之间数据的一致性。
- 元数据更新流程:当用户执行创建表、修改表结构、授权等操作时,这些请求会首先发送到 FE 主节点。主节点将元数据变更操作记录到 Raft 日志中,并将日志同步给从节点。当大多数从节点确认接收到日志后,主节点会应用这些变更到本地的元数据存储中,并通知从节点也进行相应的更新。这样就保证了所有 FE 节点上的元数据始终保持一致。
五、Doris 数据组织
- 表结构:Doris 支持多种表结构,包括明细表、聚合表和更新表。明细表按照原始数据的格式存储,适合需要保留完整数据细节的场景;聚合表则是对原始数据进行预聚合处理,存储聚合后的结果,能够大大提高查询性能,适用于查询模式较为固定的场景;更新表则针对数据频繁更新的场景进行了优化,支持高效的行级更新操作。
- 分区与分桶:为了进一步提高数据管理和查询效率,Doris 支持数据分区和分桶。分区可以按照时间、地域等维度将数据划分为不同的逻辑单元,查询时可以只扫描相关的分区,减少数据扫描范围。分桶则是将数据按照某个字段的哈希值分配到不同的桶中,有利于数据的并行处理和 JOIN 操作的优化。
六、Doris 的核心特性
- 高性能:通过 MPP 架构、向量化执行引擎、列存储等技术的结合,Doris 在处理海量数据的复杂查询时能够提供极高的性能。在电商行业的一家大型企业中,其拥有数亿条订单记录,每天需要对这些数据进行多维度的分析,如按地区、时间、商品类别统计销售额等。以往使用传统数据库进行此类分析,查询一次往往需要数小时甚至更长时间。引入 Doris 后,借助其强大的并行处理能力和高效的存储方式,同样的查询可以在几分钟内完成,查询性能提升了数十倍,大大提高了数据分析的效率,为企业决策提供了更及时的支持 。
- 易用性:Doris 提供了标准的 SQL 接口,对于熟悉 SQL 的用户来说,几乎可以零学习成本上手。同时,它的部署和管理相对简单,通过一些简单的配置即可搭建起一个高效的数据分析集群。例如,某初创企业的数据分析团队规模较小,技术能力有限。在搭建数据分析平台时,选择了 Doris。团队成员凭借已有的 SQL 知识,能够快速编写查询语句进行数据探索。并且,通过简单的服务器配置和 Doris 的安装部署,短时间内就搭建起了满足日常分析需求的集群,快速实现了对业务数据的分析洞察,为企业的业务发展提供了有力的数据支撑。
- 实时性:支持实时数据摄入和查询。用户可以通过多种方式将实时产生的数据快速导入到 Doris 中,并立即进行查询分析,满足对实时性要求较高的业务场景,如实时报表、实时监控等。以一家在线游戏公司为例,游戏运营过程中会实时产生大量的玩家行为数据,如登录、游戏时长、付费等信息。通过将这些数据实时导入 Doris,运营团队可以实时查看玩家活跃度、付费转化率等关键指标,一旦发现数据异常,能够及时采取措施进行调整优化,有效提升了游戏的运营效果和用户体验。
- 高扩展性:无论是 FE 节点还是 BE 节点,都可以轻松地进行水平扩展。这使得 Doris 可以根据业务数据量的增长和查询负载的增加,灵活地扩展集群规模,保证系统的性能和可用性。一家社交媒体公司,随着用户数量的快速增长,其数据量呈爆发式增长,每日产生的数据量从 TB 级迅速增长到 PB 级。原有的 Doris 集群在处理查询时开始出现性能瓶颈。通过简单地添加 BE 节点,Doris 自动进行数据的均衡分布,集群性能得到了显著提升,轻松应对了数据量的增长,确保了数据分析和报表生成的高效性,满足了业务不断发展的需求。
七、Doris 的架构分析
- 优点
- 强大的并行处理能力:MPP 架构使得 Doris 能够充分利用集群资源,实现大规模数据的并行处理,有效提升查询性能。
- 良好的扩展性:水平扩展的能力使得 Doris 可以轻松应对数据量和查询负载的增长,无需复杂的架构调整。
- 数据一致性保障:通过 Raft 协议保证了 FE 节点之间元数据的一致性,确保了系统的稳定性和可靠性。
- 缺点
- 资源消耗较大:由于采用了大量的并行处理和复杂的优化技术,Doris 在运行过程中对硬件资源(如 CPU、内存、磁盘 I/O 等)的消耗相对较大。在一些资源受限的环境中,可能会影响系统的性能表现。
- 复杂查询优化的局限性:虽然 Doris 的查询优化器能够处理大部分常见的查询场景,但对于一些非常复杂的查询,优化效果可能不尽如人意。尤其是涉及到多个表的复杂 JOIN 操作和嵌套子查询时,可能需要用户手动进行一些优化调整。
- 生态集成度有待提高:相比一些成熟的大数据平台,Doris 在与其他生态系统组件(如 Hive、Spark 等)的集成方面还存在一定的局限性。在一些需要多平台协同工作的场景中,可能需要额外的开发和配置工作。