一、官方定位
“Doris is a MPP-based interactive SQL data warehousing for reporting and analysis.” Doris 是一個用於報告和分析的基於 MPP 的交互式 SQL 數據倉庫。
Doris 主要集成了 Google Mesa 和 Apache Impala 的技術。
二、主要用途
提供 OLAP 數據分析。(同時支持聚合和明細查詢分析)
三、實現原理
架構
Doris 的整體架構分爲兩層。多個 FE 組成第一層,提供 FE 的橫向擴展和高可用。多個 BE 組成第二層,負責數據存儲於管理。
FE 節點分爲 follower 和 observer 兩類。follower 節點通過選舉,其中一個 follower 成爲 leader 節點,負責元數據的寫入操作。當 leader 節點宕機後,其他 follower 節點會重新選舉出一個 leader,保證服務的高可用。observer 節點僅從 leader 節點進行元數據同步,不參與選舉。可以橫向擴展以提供元數據的讀服務的擴展性。
後端守護進程負責數據存儲和執行 SQL 查詢。可以部署多個後端守護進程以提供可伸縮性和容錯性
前端(FE)
元數據
Doris 的元數據是全內存的。每個 FE 內存中,都維護一個完整的元數據鏡像。
Doris 的元數據主要存儲4類數據:
-
用戶數據信息。包括數據庫、表的 Schema、分片信息等。
-
各類作業信息。如導入作業,Clone 作業、SchemaChange 作業等。
-
用戶及權限信息。
-
集羣及節點信息。
元數據的數據流具體過程如下:
-
只有 leader FE 可以對元數據進行寫操作。寫操作在修改 leader 的內存後,會序列化爲一條log,按照 key-value 的形式寫入 bdbje。其中 key 爲連續的整型,作爲 log id,value 即爲序列化後的操作日誌。
-
日誌寫入 bdbje 後,bdbje 會根據策略(寫多數/全寫),將日誌複製到其他 non-leader 的 FE 節點。non-leader FE 節點通過對日誌回放,修改自身的元數據內存鏡像,完成與 leader 節點的元數據同步。
-
leader 節點的日誌條數達到閾值後(默認 10w 條),會啓動 checkpoint 線程。checkpoint 會讀取已有的 image 文件,和其之後的日誌,重新在內存中回放出一份新的元數據鏡像副本。然後將該副本寫入到磁盤,形成一個新的 image。之所以是重新生成一份鏡像副本,而不是將已有鏡像寫成 image,主要是考慮寫 image 加讀鎖期間,會阻塞寫操作。所以每次 checkpoint 會佔用雙倍內存空間。
-
image 文件生成後,leader 節點會通知其他 non-leader 節點新的 image 已生成。non-leader 主動通過 http 拉取最新的 image 文件,來更換本地的舊文件。
-
bddje 中的日誌,在 image 做完後,會定期刪除舊的日誌。
元數據流圖
後端(BE)
後端守護進程負責數據存儲和執行 SQL 查詢。
四、對比分析
kylin | doris | |
底層存儲 | hbase | google Mesa +ORCFile/Parquet |
數據導入 | 離線hive和實時kafka導入 | 離線hive和實時kafka導入 |
聚合計算配置方式 | 頁面配置(聚合組和維度組合方式) | 手工創建(多張rollup博安排) |
聚合計算配置靈活性 | 控制聚合的維度 | 控制聚合的維度和指標 |
數據構建 | 構建時間較長,一般爲20min~50min | 構建時間一般在10min內 |
數據查詢接口 | 自帶web查詢,提供jdbc和odbc接口 | 使用mysql查詢引擎 |
計算效率 | 毫秒~秒級返回結果 | 毫秒~秒級返回結果(性能高於kylin) |
支持的計算方式 | sum/min/max/count/count distinct | sum/min/max/count(不支持精確去重) |
學習成本 |
維度、指標 強制維度、層級維度、關聯維度 rowkey和全局字典等諸多概念 |
維度、指標 數據模型 rollup表 |