1.概述
Apache Doris 是一個(gè)基于MPP架構(gòu)的高性能實(shí)時(shí)分析 OLAP 引擎,以其極快的速度和易用性而聞名。
它只需要亞秒的響應(yīng)時(shí)間即可在海量數(shù)據(jù)下返回查詢結(jié)果,并且不僅可以支持高并發(fā)點(diǎn)查詢場景,還可以支持高吞吐量復(fù)雜分析場景。

Apache Doris是一個(gè)現(xiàn)代化的MPP分析型數(shù)據(jù)庫產(chǎn)品。僅需亞秒級(jí)響應(yīng)時(shí)間即可獲得查詢結(jié)果,有效地支持實(shí)時(shí)數(shù)據(jù)分析。Apache Doris的分布式架構(gòu)非常簡潔,易于運(yùn)維,并且可以支持10PB以上的超大數(shù)據(jù)集。
Apache Doris可以滿足多種數(shù)據(jù)分析需求,例如固定歷史報(bào)表,實(shí)時(shí)數(shù)據(jù)分析,交互式數(shù)據(jù)分析和探索式數(shù)據(jù)分析等。令您的數(shù)據(jù)分析工作更加簡單高效!
MPP ( Massively Parallel Processing ),即大規(guī)模并行處理,在數(shù)據(jù)庫非共享集群中,每個(gè)節(jié)點(diǎn)都有獨(dú)立的磁盤存儲(chǔ)系統(tǒng)和內(nèi)存系統(tǒng),業(yè)務(wù)數(shù)據(jù)根據(jù)數(shù)據(jù)庫模型和應(yīng)用特點(diǎn)劃分到各個(gè)節(jié)點(diǎn)上,每臺(tái)數(shù)據(jù)節(jié)點(diǎn)通過專用網(wǎng)絡(luò)或者商業(yè)通用網(wǎng)絡(luò)互相連接,彼此協(xié)同計(jì)算,作為整體提供數(shù)據(jù)庫服務(wù)。非共享數(shù)據(jù)庫集群有完全的可伸縮性、高可用、高性能、優(yōu)秀的性價(jià)比、資源共享等優(yōu)勢。簡單來說,MPP 是將任務(wù)并行的分散到多個(gè)服務(wù)器和節(jié)點(diǎn)上,在每個(gè)節(jié)點(diǎn)上計(jì)算完成后,將各自部分的結(jié)果匯總在一起得到最終的結(jié)果 ( 與 Hadoop 相似 )。
Doris 主要解決 PB 級(jí)別的數(shù)據(jù)量(如果高于 PB 級(jí)別,不推薦使用 Doris 解決,可以考慮用 Hive 等工具),解決結(jié)構(gòu)化數(shù)據(jù),查詢時(shí)間一般在秒級(jí)或毫秒級(jí)。
Doris 由百度大數(shù)據(jù)部研發(fā) ( 之前叫百度 Palo,2018年貢獻(xiàn)到 Apache 社區(qū)后,更名為 Doris ),在百度內(nèi)部,有超過200個(gè)產(chǎn)品線在使用,部署機(jī)器超過1000臺(tái),單一業(yè)務(wù)最大可達(dá)到上百 TB。
百度將 Doris 貢獻(xiàn)給 Apache 社區(qū)之后,許多外部用戶也成為了 Doris 的使用者,例如新浪微博,美團(tuán),小米等著名企業(yè)。
Apache Doris 核心特性:

發(fā)展歷程

2012 年之前,Doris 的定位就是一個(gè) NoSQL 數(shù)據(jù)庫。
2012~2020 年期間,Doris 的定位是 NewSQL,也就是說除了要兼顧存儲(chǔ)海量數(shù)據(jù),也要具備 RDBMS 的 ACID 特性以及對(duì)于 SQL 的支持能力。
2020 年以后,Doris 的定位是 Lakehouse。
關(guān)于 Lakehouse 請(qǐng)參考博客——湖倉一體(Lakehouse)是什么?
2.doris 架構(gòu)
Doris主要整合了Google Mesa(數(shù)據(jù)模型),Apache Impala(MPP Query Engine) 和 Apache ORCFile (存儲(chǔ)格式,編碼和壓縮) 的技術(shù)。

Google Mesa(數(shù)據(jù)模型)
- Mesa是一種高度可擴(kuò)展的分析數(shù)據(jù)存儲(chǔ)系統(tǒng),用于存儲(chǔ)與Google的互聯(lián)網(wǎng)廣告業(yè)務(wù)有關(guān)的關(guān)鍵測量數(shù)據(jù)。
- Mesa滿足一系列復(fù)雜且具有挑戰(zhàn)性的用戶和系統(tǒng)需求,包括接近實(shí)時(shí)的數(shù)據(jù)提取和查詢能力,以及針對(duì)大數(shù)據(jù)和查詢量的高可用性,可靠性,容錯(cuò)性和可伸縮性。但是Mesa本身不提供SQL查詢引擎所以借鑒了下面。
Apache Impala(MPP Query Engine)
- Impala是一個(gè)非常好的MPP SQL查詢引擎,做更多的查詢優(yōu)化,在速度上做到了很好。但是缺少比較完美的分布式存儲(chǔ)引擎,所以需要集成下面。
Apache ORCFile (存儲(chǔ)格式,編碼和壓縮)
- 只訪問查詢涉及的列,能大量降低系統(tǒng)I/O;列數(shù)據(jù)相對(duì)來說比較類似,壓縮比更高;每一列由一個(gè)線索來處理,更有利于查詢的并發(fā)處理。
因此選擇了這三種技術(shù)的組合。
Doris的系統(tǒng)架構(gòu)如下圖: 架構(gòu)很簡潔,只設(shè)FE(Frontend)、BE(Backend)兩種角色、兩個(gè)進(jìn)程,不依賴于外部組件,方便部署和運(yùn)維。


Doris 的整體架構(gòu)和 TiDB 類似,借助 MySQL 協(xié)議,用戶使用任意 MySQL 的 ODBC/JDBC以及MySQL 的客戶端,都可以直接訪問 Doris。
Doris 中的模塊包括 FE 和 BE 兩類:FE 主要負(fù)責(zé)元數(shù)據(jù)的管理、存儲(chǔ),以及查詢的解析等;一個(gè)用戶請(qǐng)求經(jīng)過 FE 解析、規(guī)劃后,具體的執(zhí)行計(jì)劃會(huì)發(fā)送給 BE,BE 則會(huì)完成查詢的具體執(zhí)行。BE 節(jié)點(diǎn)主要負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)、以及查詢計(jì)劃的執(zhí)行。
2.1 核心組件介紹
Doris 的架構(gòu)很簡潔,只設(shè) FE(Frontend)、BE(Backend)兩種角色、兩個(gè)進(jìn)程,不依賴于外部組件,方便部署和運(yùn)維。
- 以數(shù)據(jù)存儲(chǔ)的角度觀之,F(xiàn)E 存儲(chǔ)、維護(hù)集群元數(shù)據(jù);BE 存儲(chǔ)物理數(shù)據(jù)。
- 以查詢處理的角度觀之, FE 節(jié)點(diǎn)接收、解析查詢請(qǐng)求,規(guī)劃查詢計(jì)劃,調(diào)度查詢執(zhí)行,* 返回查詢結(jié)果;BE 節(jié)點(diǎn)依據(jù) FE 生成的物理計(jì)劃,分布式地執(zhí)行查詢。
名詞解釋
| 名詞 | 說明 |
|---|---|
| FE | Frontend,即 Doris 的前端節(jié)點(diǎn)。以 Java 語言為主,主要負(fù)責(zé)接收和返回客戶端請(qǐng)求、元數(shù)據(jù)以及集群管理、查詢計(jì)劃生成等工作。 |
| BE | Backend,即 Doris 的后端節(jié)點(diǎn)。以 C++ 語言為主,主要負(fù)責(zé)數(shù)據(jù)存儲(chǔ)與管理、查詢計(jì)劃執(zhí)行等工作。 |
| Tablet | Tablet是一張表實(shí)際的物理存儲(chǔ)單元,一張表按照分區(qū)和分桶后在BE構(gòu)成分布式存儲(chǔ)層中以Tablet為單位進(jìn)行存儲(chǔ),每個(gè)Tablet包括元信息及若干個(gè)連續(xù)的RowSet。 |
| Rowset | Rowset是Tablet中一次數(shù)據(jù)變更的數(shù)據(jù)集合,數(shù)據(jù)變更包括了數(shù)據(jù)導(dǎo)入、刪除、更新等。Rowset按版本信息進(jìn)行記錄。每次變更會(huì)生成一個(gè)版本。 |
| Version | 由Start、End兩個(gè)屬性構(gòu)成,維護(hù)數(shù)據(jù)變更的記錄信息。通常用來表示Rowset的版本范圍,在一次新導(dǎo)入后生成一個(gè)Start,End相等的Rowset,在Compaction后生成一個(gè)帶范圍的Rowset版本。 |
| Segment | 表示Rowset中的數(shù)據(jù)分段。多個(gè)Segment構(gòu)成一個(gè)Rowset。 |
| Compaction | 連續(xù)版本的Rowset合并的過程成稱為Compaction,合并過程中會(huì)對(duì)數(shù)據(jù)進(jìn)行壓縮操作。 |
FE(Frontend)
主要負(fù)責(zé)查詢的編譯,分發(fā)和元數(shù)據(jù)管理。
- 1、管理元數(shù)據(jù)(庫、表、分區(qū)、tablet副本等信息),執(zhí)行SQL語句命令。
- 2、FE高可用部署,使用復(fù)制協(xié)議選主和主從同步元數(shù)據(jù),所有的元數(shù)據(jù)修改操作,由FE Leader節(jié)點(diǎn)完成,F(xiàn)E Follower節(jié)點(diǎn)可執(zhí)行讀操作。 元數(shù)據(jù)的讀寫滿足順序一致性。 FE的節(jié)點(diǎn)數(shù)目采用2n+1,可容忍n個(gè)節(jié)點(diǎn)故障。當(dāng)FE Leader故障時(shí),從現(xiàn)有的Follower節(jié)點(diǎn)重新選主,完成故障切換。
- Observer節(jié)點(diǎn)僅從 Leader節(jié)點(diǎn)進(jìn)行元數(shù)據(jù)同步,不參與選舉。能夠橫向擴(kuò)展以提供元數(shù)據(jù)的讀服務(wù)的擴(kuò)展性。
- 3、FE的SQL layer對(duì)用戶提交的SQL進(jìn)行解析、分析、語義分析和關(guān)系代數(shù)優(yōu)化,生產(chǎn)邏輯執(zhí)行計(jì)劃。
- 4、FE的Planner負(fù)責(zé)把邏輯計(jì)劃轉(zhuǎn)化為可分布式執(zhí)行的物理計(jì)劃,分發(fā)給一組BE。
- 5、FE監(jiān)督,管理BE的上下線,根據(jù)BE的健康狀態(tài)和存活數(shù),維持tablet副本的數(shù)量。
- 6、FE協(xié)調(diào)數(shù)據(jù)導(dǎo)入, 保證數(shù)據(jù)導(dǎo)入的一致性。
BE([Backend]
主要負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)、以及查詢計(jì)劃的執(zhí)行
- 1、BE管理tablet副本,tablet是table經(jīng)過分區(qū)分桶形成的子表,采用列式存儲(chǔ)。
- 2、BE受驅(qū)動(dòng)FE,創(chuàng)建或刪除子表。
- 3、BE接收FE分發(fā)的物理執(zhí)行計(jì)劃并指定BE coordinator節(jié)點(diǎn),在BE coordinator的調(diào)度下,與其他BE worker共同協(xié)作完成執(zhí)行。
- 4、BE讀取本地的列存儲(chǔ)引擎獲取數(shù)據(jù),并通過索引和謂詞下沉快速過濾數(shù)據(jù)。
- 5、BE后臺(tái)執(zhí)行compact任務(wù),減少查詢時(shí)的讀放大。
- 6、數(shù)據(jù)導(dǎo)入時(shí), 由FE指定BE coordinator,將數(shù)據(jù)以fanout的形式寫入到tablet多副本所在的BE上。
MySQL Client
Doris借助MySQL協(xié)議,用戶使用任意MySQL的ODBC/JDBC以及MySQL的客戶
端,都可以直接訪問Doris
Broker
Broker為一個(gè)獨(dú)立的無狀態(tài)進(jìn)程。封裝了文件系統(tǒng)接口,提供Doris讀取遠(yuǎn)端存儲(chǔ)系統(tǒng)中文件的能力,包括HDFS、S3、BOS等
元數(shù)據(jù)
- Doris 采用 Paxos 協(xié)議以及 Memory + Checkpoint + Journal 的機(jī)制來確保元數(shù)據(jù)的高性能及高可靠。
- 元數(shù)據(jù)的每次更新,都首先寫入到磁盤的日志文件中,然后再寫到內(nèi)存中,最后定期 checkpoint 到本地磁盤上。相當(dāng)于是一個(gè)純內(nèi)存的一個(gè)結(jié)構(gòu),也就是說所有的元數(shù)據(jù)都會(huì)緩存在內(nèi)存之中,從而保證 FE 在宕機(jī)后能夠快速恢復(fù)元數(shù)據(jù),而且不丟失元數(shù)據(jù)。* Leader、follower 和 observer 它們?nèi)齻€(gè)構(gòu)成一個(gè)可靠的服務(wù),這樣如果發(fā)生節(jié)點(diǎn)宕機(jī)的情況,在百度內(nèi)部的話,一般是部署一個(gè) leader 兩個(gè) follower,外部公司目前來說基本上也是這么部署的。就是說三個(gè)節(jié)點(diǎn)去達(dá)到一個(gè)高可用服務(wù)。
- 單機(jī)的節(jié)點(diǎn)故障的時(shí)候其實(shí)基本上三個(gè)就夠了,因?yàn)?FE 節(jié)點(diǎn)畢竟它只存了一份元數(shù)據(jù),它的壓力不大,所以如果 FE 太多的時(shí)候它會(huì)去消耗機(jī)器資源,所以多數(shù)情況下三個(gè)就足夠了,可以達(dá)到一個(gè)很高可用的元數(shù)據(jù)服務(wù)
Doris FE高可用方案:
- 如果你是離線業(yè)務(wù),對(duì)高可用要求不是那么高可以使用 1 FE(Follower leader) + 1 FE(Observer)
- 如果你是實(shí)時(shí)在線業(yè)務(wù),對(duì)高可用要求很高,建議使用 3 FE(Follower),會(huì)自動(dòng)選舉出一個(gè) leader
數(shù)據(jù)分布及可靠性
Doris 數(shù)據(jù)主要都是存儲(chǔ)在 BE 里面,BE 節(jié)點(diǎn)上物理數(shù)據(jù)的可靠性通過多副本來實(shí)現(xiàn),默認(rèn)是 3 副本,副本數(shù)可配置且可隨時(shí)動(dòng)態(tài)調(diào)整,滿足不同可用性級(jí)別的業(yè)務(wù)需求。FE 調(diào)度 BE 上副本的分布與補(bǔ)齊。
如果說用戶對(duì)可用性要求不高,而對(duì)資源的消耗比較敏感的話,我們可以在建表的時(shí)候選擇建兩副本或者一副本。比如在百度云上我們給用戶建表的時(shí)候,有些用戶對(duì)它的整個(gè)資源消耗比較敏感,因?yàn)樗顿M(fèi),所以他可能會(huì)建兩副本。但是我們一般不太建議用戶建一副本,因?yàn)橐桓北镜那闆r下可能一旦機(jī)器出問題了,數(shù)據(jù)直接就丟了,很難再恢復(fù)。我們在公司內(nèi)部的話,一般是默認(rèn)建三副本,這樣基本可以保證一臺(tái)機(jī)器單機(jī)節(jié)點(diǎn)宕機(jī)的情況下不會(huì)影響整個(gè)服務(wù)的正常運(yùn)作。
3.doris內(nèi)部組件及周邊生態(tài)組件介紹

3.1 Frontend(FE)
Java語言開發(fā),Doris 系統(tǒng)的元數(shù)據(jù)管理和節(jié)點(diǎn)調(diào)度。在導(dǎo)入流程中主要負(fù)責(zé)導(dǎo)入 plan 生成和導(dǎo)入任務(wù)的調(diào)度工作,請(qǐng)求接入等
3.2 Backend(BE)
C++語言開發(fā),Doris 系統(tǒng)的計(jì)算和存儲(chǔ)節(jié)點(diǎn),執(zhí)行SQL計(jì)劃等。在導(dǎo)入流程中主要負(fù)責(zé)數(shù)據(jù)的 ETL 和存儲(chǔ)。
3.3 Broker
Broker 為一個(gè)獨(dú)立的無狀態(tài)進(jìn)程。封裝了文件系統(tǒng)接口,提供 Doris 讀取遠(yuǎn)端存儲(chǔ)系統(tǒng)中文件的能力,包括HDFS,S3,BOS等
3.4 Mysql Client
Doris 借助 MySQL 協(xié)議,用戶使用任意 MySQL 的 ODBC/JDBC以及MySQL 的客戶端,都可以直接訪問 Doris
3.5 Doris on ES
Doris-On-ES將Doris的分布式查詢規(guī)劃能力和ES(Elasticsearch)的全文檢索能力相結(jié)合,提供更完善的OLAP分析場景解決方案:
- ES中的多index分布式Join查詢
- Doris和ES中的表聯(lián)合查詢,更復(fù)雜的全文檢索過濾
3.6 ODBC External Table Of Doris
ODBC External Table Of Doris 提供了Doris通過數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)接口(ODBC)來訪問外部表,外部表省去了繁瑣的數(shù)據(jù)導(dǎo)入工作,讓Doris可以具有了訪問各式數(shù)據(jù)庫的能力,并借助Doris本身的OLAP的能力來解決外部表的數(shù)據(jù)分析問題:
- 支持各種數(shù)據(jù)源接入Doris
- 支持Doris與各種數(shù)據(jù)源中的表聯(lián)合查詢,進(jìn)行更加復(fù)雜的分析操作
- 通過insert into將Doris執(zhí)行的查詢結(jié)果寫入外部的數(shù)據(jù)源
3.7 Spark Doris Connector
Spark Doris Connector 可以支持通過 Spark 讀取 Doris 中存儲(chǔ)的數(shù)據(jù)。
- 當(dāng)前版本只支持從Doris中讀取數(shù)據(jù)。
- 可以將Doris表映射為DataFrame或者RDD,推薦使用DataFrame。
- 支持在Doris端完成數(shù)據(jù)過濾,減少數(shù)據(jù)傳輸量。
3.8 Flink Doris Connector
Flink Doris Connector 可以支持通過 Flink 讀取 Doris 中存儲(chǔ)的數(shù)據(jù)。
- 可以將Doris表映射為DataStream或者Table
- 支持通過Flink table的方式使用doris數(shù)據(jù)
- 可以通過Flink table 方式方便的將數(shù)據(jù)通過insert into select方式將數(shù)據(jù)插入到doris表中
3.9 DataX doriswriter
DataX doriswriter 插件,用于通過 DataX 同步其他數(shù)據(jù)源的數(shù)據(jù)到 Doris 中。
這個(gè)插件是利用Doris的Stream Load 功能進(jìn)行數(shù)據(jù)導(dǎo)入的。需要配合 DataX 服務(wù)一起使用。
這個(gè)擴(kuò)展可以很方便的將業(yè)務(wù)數(shù)據(jù)庫中的數(shù)據(jù)快速的抽取導(dǎo)入到doris數(shù)倉中
3.10 Doris output plugin
該插件用于logstash輸出數(shù)據(jù)到Doris,使用 HTTP 協(xié)議與 Doris FE Http接口交互,并通過 Doris 的 stream load 的方式進(jìn)行數(shù)據(jù)導(dǎo)入.
3.11 審計(jì)日志擴(kuò)展
Doris 的審計(jì)日志插件是在 FE 的插件框架基礎(chǔ)上開發(fā)的。是一個(gè)可選插件。用戶可以在運(yùn)行時(shí)安裝或卸載這個(gè)插件。
該插件可以將 FE 的審計(jì)日志定期的導(dǎo)入到指定 Doris 集群中,以方便用戶通過 SQL 對(duì)審計(jì)日志進(jìn)行查看和分析。
4、使用場景

報(bào)表分析可視化
- 實(shí)時(shí)儀表板
- 內(nèi)部分析師和經(jīng)理的報(bào)告
- 高度并發(fā)的面向用戶或面向客戶的報(bào)表分析
ad-hoc
- 以分析師為導(dǎo)向的自助服務(wù)分析,具有不規(guī)則的查詢模式和高吞吐量要求。
統(tǒng)一數(shù)據(jù)倉庫建設(shè)
- 一個(gè)滿足統(tǒng)一數(shù)據(jù)倉庫建設(shè)需求和簡化復(fù)雜數(shù)據(jù)軟件堆棧的平臺(tái)。
- 流批一體
- 實(shí)時(shí)數(shù)倉
數(shù)據(jù)湖查詢
- 通過使用外部表聯(lián)合位于 Apache Hive、Apache Iceberg 和Apache Hudi 中的數(shù)據(jù),查詢性能大大提高,同時(shí)避免了數(shù)據(jù)復(fù)制。
參考:
https://doris.apache.org/zh-CN/docs/dev/summary/basic-summary
https://zhuanlan.zhihu.com/p/400642016
https://blog.csdn.net/Shockang/article/details/127062897
https://blog.csdn.net/qq_43141726/article/details/120607561
https://blog.csdn.net/yy8623977/article/details/126072971
https://blog.csdn.net/Hello_Java2018/article/details/124806183