Apache Doris : 一個開源 MPP 資料庫的架構與實踐
- 2019 年 11 月 21 日
- 筆記
文章作者:趙純 百度資深研發工程師
編輯整理:王吉東
內容來源:Druid 6th Meetup
出品社區:DataFun
註:歡迎轉載,轉載請註明出處
分享提綱:
- Doris 背景介紹
- 適用場景 & 案例介紹
- Doris 整體架構
- Doris 關鍵技術
▌Doris 背景介紹
介紹 Doris 的整體架構,以及 Doris 的一些特性。
一、Doris
Doris 是分散式、面向互動式查詢的分散式資料庫,主要部分是 SQL,內部用到 MPP 技術。
什麼是 MPP?
MPP ( Massively Parallel Processing ),即大規模並行處理,在資料庫非共享集群中,每個節點都有獨立的磁碟存儲系統和記憶體系統,業務數據根據資料庫模型和應用特點劃分到各個節點上,每台數據節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供資料庫服務。非共享資料庫集群有完全的可伸縮性、高可用、高性能、優秀的性價比、資源共享等優勢。簡單來說,MPP 是將任務並行的分散到多個伺服器和節點上,在每個節點上計算完成後,將各自部分的結果匯總在一起得到最終的結果 ( 與 Hadoop 相似 )。
Doris 主要解決 PB 級別的數據量(如果高於 PB 級別,不推薦使用 Doris 解決,可以考慮用 Hive 等工具),解決結構化數據,查詢時間一般在秒級或毫秒級。
Doris 由百度大數據部研發 ( 之前叫百度 Palo,2018年貢獻到 Apache 社區後,更名為 Doris ),在百度內部,有超過200個產品線在使用,部署機器超過1000台,單一業務最大可達到上百 TB。
百度將 Doris 貢獻給 Apache 社區之後,許多外部用戶也成為了 Doris 的使用者,例如新浪微博,美團,小米等著名企業。
二、Doris 定位
在數據分析處理框架中,Doris 主要做的是 Online 層面的數據服務,主要處理的是數據分析方面的服務。

Doris 的目標是:實現低成本(主要針對商業產品),可線性擴展,支援雲化部署,高可用,高查詢性能,高載入性能。

簡要介紹兩個百度內部業務中 Doris 的應用案例:
A. 百度統計在線報表

B. 百度另一內部業務的多維分析

可以手動拖拽維度、指標等,進行查詢。
▌適用場景 & 案例介紹
一、適用場景
1、對數據分析、統計
數據分析大體上可以分為兩大類場景:一種偏向於報表類的,另一種偏向於多維分析的。
2、報表
報表類數據分析,數據分析以及查詢的模式相對比較固定,而且後台 SQL 的模式往往都是確定的。針對此類應用場景,選擇使用 MySQL 存結果數據,用戶可從介面選擇執行批處理以及發送郵件。在 Doris 平台中,報表類查詢時延一般在秒級以下。
3、多維分析
這裡提到的多維分析,同樣要求數據是結構化的,適用於查詢相對靈活的場景,例如數據分析條件以及聚合維度等方面不是很確定,一般將此類數據分析定義為多維分析。相對於報表類分析,多維分析的查詢時延會稍慢,大約在會在 10s 的級別。
二、具體案例
案例分析 1:百度統計
百度統計,為網站站長提供流量分析,網站分析,受眾分析等多種分析服務。服務網站數量超過 450W,每天查詢量達到 1500W,QPS ( Queries Per Second,每秒查詢率 ) 峰值超過1400,每日新增數據量超過 2TB;數據導入頻次為5分鐘,平均查詢時延 30ms。
案例分析 2:百度雲系統
1、百度雲交易系統
百度雲交易系統,主要提供訂單、賬單、扣費、交易流水等 TB 級別量數據的存儲和實時查詢服務,數據量約 12TB,每5分鐘導入。
2、百度雲數據中心
百度雲數據中心,主要提供百度雲經營分析,產品分析,用戶分析等多種分析服務;提供多維度(100+)分析,具備高性能 ( 秒級 ) BI 能力;百度雲數據中心的日處理數據量約 1T ( 略少於百度統計,因此查詢效率略高於百度統計 ),分鐘級導入。以下是百度雲數據中心頁面的一個截圖:

▌Doris 整體架構
一、Doris 整體架構

Doris 的整體架構和 TiDB 類似,藉助 MySQL 協議,用戶使用任意 MySQL 的 ODBC/JDBC以及MySQL 的客戶端,都可以直接訪問 Doris。Doris 中的模組包括 FE 和 BE 兩類:FE 主要負責元數據的管理、存儲,以及查詢的解析等;一個用戶請求經過 FE 解析、規劃後,具體的執行計劃會發送給 BE,BE 則會完成查詢的具體執行。BE 節點主要負責數據的存儲、以及查詢計劃的執行。目前平台的 FE 部分主要使用 Java,BE 部分主要使用 C++。
二、Doris 數據分布
如果從表的角度來看數據結構,用戶的一張 Table 會拆成多個 Tablet,Tablet 會存成多副本,存儲在不同的 BE 中,從而保證數據的高可用和高可靠。

三、Doris 的使用方式
Doris 的使用方式和 MySQL 類似,創建 database,創建 table,導入數據、執行查詢等。具體詳見下圖:

▌Doris 關鍵技術
一、數據可靠性
1、元數據使用 Memory+Checkpoint+Journal ( 分別是什麼?),使用 BTBJE ( 類似於 Raft ) 協議實現高可用性和高可靠性。
2、Doris 內部自行管理數據的多副本和自動修復。保證數據的高可用、高可靠。在伺服器宕機的情況下,服務依然可用,數據也不會丟失。

二、易運維
無外部依賴:
- Doris 部署無外部依賴,只需要部署 BE 和 IBE 即可搭建起一個集群。
- 支援 Online Schema Change
- 支援在線更改表模式 ( 加減列,創建 Rollup ),不會影響當前服務,不會阻塞讀、寫等操作;這種執行是非同步的 ( 用戶不需要一直盯在那裡 )
資料庫同步操作和非同步操作:
同步,是所有的操作都做完,才返回給用戶結果;即寫完資料庫之後,再響應用戶,用戶體驗不好;
非同步,不用等所有操作等做完,就相應用戶請求;即先相應用戶請求,然後慢慢去寫資料庫,用戶體驗較好。快取機制(也就是消息隊列),就是非同步操作的一個典型應用。
1、副本自動均衡
傳統資料庫的擴(縮)容比較麻煩,有時甚至需要重做數據;而 Doris 資料庫只需要一條 SQL ( 無須額外操作 ) 即可實現擴(縮)容。
2、內置監控
使用 Prometheus、Grafana 將監控項指標列出。
下圖為 Doris 默認配置面板:

三、MySQL 兼容性
MySQL 的兼容性從兩方面體現:
1、兼容 MySQL 的網路協議 ( MySQL Network Protocol )
2、兼容 MySQL 語法,使用 MySQL 語法可對 Doris 資料庫進行查詢
- 關於 MySQL 語法的兼容性,前文已經描述過,這裡不再贅述;
- 關於 MySQL 的網路協議的兼容性,舉個簡單的例子:MySQL 的調度伺服器 Proxy,可以直接用作 Doris 的 Proxy。

- Doris 的前端展示,可以使用 MySQL 專屬展示器 Tableu。下圖就是使用 Tableu 將 Doris 數據可視化的一個範例。

- Doris 與 R 語言可以實現無縫對接,用 R 語言可直接操作 Doris 資料庫,進行數據分析、數據挖掘等工作。
四、支援 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 數據模型
一、Doris 數據模型特點
1、鍵值對存儲形式:
類似於字典搜索查詢的鍵值對格式,Doris 中所有數據分成兩列:Key 列和 Value 列。如下圖所示,Time、Id、Country 列共同組成 Key 列,Clicks、Cost 列為 Value 列。Key 列有序可進行快速查找,Value 列可以按照具體聚合類型內部完成數據聚合。

2、Key 列全局有序排列,查詢時方便快速定位查找。
Doris 數據模型的一個顯著特點是 Key 列全局唯一,因此存在相同 Key 值的不同 Value,則後面的數據與前面的數據自動做 ( SUM,MIN,MAX,REPLACE ) 等聚合處理。例如,下圖中綠色方框中的兩行,相同的 Key 值對應不同的 Value;因此,新的 Value 到達後,與前數據作 SUM 處理,得到最新的數據,不僅提升效率,還可提高數據處理的準確性。

二、聚合計算說明:
本部分具體描述相同 Key 值下 Value 值的聚合。
數據的導入是分版本的(例如下圖右側91,92版本),每一個版本之間 Key 相同的數據匯總到中間表中,通過聚合處理最終輸出為左側的 base。

三、按列存儲
1、Doris 的數據是按列存儲的,每一列單獨存放。
2、查詢時,只訪問查詢涉及的列,大量降低 I/O。
3、數據類型一致,方便壓縮。
4、數據包建索引,數據即索引。
5、利用原始過濾條件以及 min、max 和 sum 等智慧索引技術,將數據集查詢範圍儘可能地縮小,大大減少 I/O,提升查詢效率。
四、物化視圖
物化視圖是提取某些維度的組合建立對用戶透明的卻有真實數據的視圖表格。Doris 的物化視圖可以保證用戶在更新時,直接更新原始表,Doris 會保證原表、物化視圖原子生效。在查詢的時候用戶也只需指定原始表,Doris 會根據查詢的具體條件,選擇適合的物化視圖完成查詢。
通常用戶可以通過物化視圖功能完成以下兩種功能。
1、更換索引列進行重排列
2、針對指定列做聚合查詢

五、兩層分區與分級存儲
兩層分區:
1、方便新舊數據分離,使用不同的存儲介質(例如新數據使用 SSD,歷史數據 SATA)
2、分區減少了大量歷史數據不必要的重複 BE/CE,節省了大量的 IO 和 CPU 開銷
3、兩層分區的方法簡化了表的擴容,便於 shard 調整(例如,前期不必建立過多 shard,後期隨著業務增長客隨時調整 shard 數)
分級存儲
用戶可以指定數據放到 SSD 上或者 SATA 盤上,也支援根據 TTL 將冷數據從 SSD 遷移到 SATA 上,高效利用 SSD 提高查詢性能。

六、Doris 在 Elasticsearch 的應用
簡介:
1、ES 的優點是索引,可支援多列索引,甚至可支援全文語義索引(如 term,match,fuzzy 等);然而其缺點是沒有分散式計算引擎,不支援 join 等操作
2、與 ES 相反,Palo 具備豐富的 SQL 計算能力,以及分散式查詢能力;然而其索引性能較低,不支援全文索引。
3、Doris 在 ES 開發的過程中,分別借鑒 ES 和 Palo 的長處,支援了 Elasticsearch 多表 Join 操作,同時引入 Elasticsearch 的語義搜索功能,擴充了 Doris 的查詢能力。
使用方式:
第一步:建立一張 ES 的外部表。

第二步:在 ES 外部表中導入一些數據:

第三步:使用和 ES 一樣的搜索語句,進行全文檢索查詢:

類似於上圖這樣的搜索語句,在 SQL 中比較難以表達,但是在 ES 中較容易實現。
七、Kafka 消息隊列載入
1、Doris 內部支援訂閱 Kafka 數據流,實現直接對接 Kafka:

2、用戶數據源經 Kafka 消息隊列收集後,可以依次進入到 Doris 中,通過 Doris 做報表展示和決策分析等工作。

3、優點
- 無需額外組件,用戶可直接通過命令實現 Kafka 消息訂閱。
- 精確傳輸,秒級延遲。
- Doris 可自動感知 Kafka 中 partition 變化,合理調度並發導入。
- 在數據導入這一過程中,支援對 Kafka 原始數據做二次處理(如轉換,過濾等)。
八、Doris 其他特性
- 原子性——即一批數據要麼都生效,要麼都不生效。
- 支援單機多盤
- 向量化執行
- UDF ( User Defined Function 用戶自定義函數 )
- 內置 HLL 類型,快速計算 UV
嘉賓介紹
趙純,百度資深研發工程師。Doris 項目最初創始人之一。工作7年以來一直從事 OLAP/OLTP 等資料庫相關領域。