主交互邏輯
主交互架構(gòu)

注 正如上圖所示,FE 端主要是 PaloFe 開啟的服務(wù)入口, 后端為 doris_main 開啟的服務(wù)入口,前后端交互主要靠 thrift rpc 進行調(diào)用。FE 中主從選舉及元數(shù)據(jù)操作日志同步等均依托 bdbje 主從方案來實現(xiàn)。
元數(shù)據(jù)分發(fā)流程
元數(shù)據(jù)變更日志主要靠 bdbje 的主從復(fù)制來完成如下圖:

注 元數(shù)據(jù)的數(shù)據(jù)流具體過程如上圖所示,步驟如下:
只有 leader FE 可以對元數(shù)據(jù)進行寫操作。寫操作在修改 leader 的內(nèi)存后,會序列化為一條log,按照 key-value 的形式寫入 bdbje。其中 key 為連續(xù)的整型,作為 log id,value 即為序列化后的操作日志。
日志寫入 bdbje 后,bdbje 會根據(jù)策略(寫多數(shù)/全寫),將日志復(fù)制到其他 non-leader 的 FE 節(jié)點。non-leader FE 節(jié)點通過對日志回放,修改自身的元數(shù)據(jù)內(nèi)存鏡像,完成與 leader 節(jié)點的元數(shù)據(jù)同步。
leader 節(jié)點的日志條數(shù)達到閾值后(默認 10w 條),會啟動 checkpoint 線程。checkpoint 會讀取已有的 image 文件,和其之后的日志,重新在內(nèi)存中回放出一份新的元數(shù)據(jù)鏡像副本。然后將該副本寫入到磁盤,形成一個新的 image。之所以是重新生成一份鏡像副本,而不是將已有鏡像寫成 image,主要是考慮寫 image 加讀鎖期間,會阻塞寫操作。所以每次 checkpoint 會占用雙倍內(nèi)存空間。
image 文件生成后,leader 節(jié)點會通知其他 non-leader 節(jié)點新的 image 已生成。non-leader 主動通過 http 拉取最新的 image 文件,來更換本地的舊文件。
bdbje 中的日志,在 image 做完后,會定期刪除舊的日志。
代碼目錄結(jié)構(gòu)
├── be // BE 代碼目錄
├── bin // FE/BE 的啟停腳本
├── build_plugin.sh // FE 插件編譯腳本
├── build.sh // Doris 編譯腳本
├── build-support // 編譯用輔助腳本
├── CODE_OF_CONDUCT.md // 貢獻者代碼行為準則
├── conf // FE/BE 的配置文件
├── contrib // 第三方貢獻代碼,如 udf
├── CONTRIBUTING_CN.md
├── CONTRIBUTING.md
├── DISCLAIMER
├── docker // Doris 開發(fā)鏡像的 Dockerfile
├── docs // 文檔目錄
├── env.sh
├── extension // 擴展功能代碼,如 flink connector 等
├── fe // FE 代碼目錄
├── fe_plugins // FE 插件目錄
├── fs_brokers // Broker 代碼目錄
├── gensrc // thrift/protobuf 等代碼生成目錄
├── LICENSE.txt
├── NOTICE.txt
├── README.md
├── run-be-ut.sh // BE 單元測試運行腳本
├── run-fe-ut.sh // FE 單元測試運行腳本
├── samples // 示例代碼目錄
├── thirdparty // 第三方依賴庫目錄
├── tools // 一些輔助工具
├── tsan_suppressions
├── ui // FE 前端代碼目錄
└── webroot // 一些靜態(tài)網(wǎng)頁相關(guān)代碼
BE 代碼結(jié)構(gòu)
├── agent // FE 下發(fā)的 agent task 相關(guān)處理類
├── common // 通用類
├── env // 文件系統(tǒng)操作類
├── exec // 執(zhí)行算子相關(guān)代碼
├── exprs // 表達式、函數(shù)計算相關(guān)代碼
├── geo // 地理位置函數(shù)相關(guān)代碼
├── glibc-compatibility // GLIBC 兼容代碼
├── gutil // Google gutil 相關(guān)代碼
├── http // BE 端 http server 相關(guān)代碼
├── olap // 存儲層代碼
├── plugin // BE 插件管理相關(guān)代碼
├── runtime // 查詢層運行時相關(guān)代碼
├── service // BE 對外服務(wù)接口相關(guān)代碼, 主入口 doris_main 也在該包下
├── testutil // 單元測試輔助類
├── tools // 輔助工具相關(guān)代碼
├── udf // 用戶自定義函數(shù)相關(guān)代碼
└── util // 一些工具類
FE 代碼結(jié)構(gòu)
├── alter // 表結(jié)構(gòu)變更操作相關(guān)的代碼。包括表結(jié)構(gòu)變更,物化視圖等。
├── analysis // 包含所有SQL語法的java實例類
├── backup // 備份恢復(fù)操作相關(guān)的代碼
├── blockrule // SQL 黑名單相關(guān)代碼
├── catalog // 包含元數(shù)據(jù)操作的主類和各種數(shù)據(jù)庫、表、分區(qū)的元數(shù)據(jù)實例類(基于 MetaReader/MetaWriter 進行元數(shù)據(jù)存儲等)
├── clone // 數(shù)據(jù)副本修復(fù)和均衡相關(guān)的代碼
├── cluster // 已廢棄
├── common // 一些工具類和通用定義
├── consistency // 數(shù)據(jù)一致性校驗相關(guān)的代碼
├── deploy // 部署相關(guān)代碼
├── external // Doris on Elasticsearch相關(guān)的代碼
├── ha // 元數(shù)據(jù)高可用相關(guān)的代碼 (BDB 副本配置主從結(jié)構(gòu)邏輯代碼)
├── http // http v1 代碼(Netty 版本)
├── httpv2 // http v2 代碼(Spring 版本,逐步替換v1)
├── journal // 元數(shù)據(jù)日志相關(guān)的代碼(BDB 元數(shù)據(jù)日志數(shù)據(jù)讀寫操作)
├── ldap // LDAP 認證相關(guān)代碼
├── load // 導(dǎo)入作業(yè)相關(guān)代碼
├── master // FE Master角色相關(guān)的操作代碼,如元數(shù)據(jù)Checkpoint,BE任務(wù)匯報的處理等。
├── metric // FE 監(jiān)控指標相關(guān)的代碼
├── monitor // JVM 監(jiān)控相關(guān)代碼
├── mysql // MySQL協(xié)議層相關(guān)代碼
├── PaloFe.java // Main函數(shù)入口
├── persist // 元數(shù)據(jù)持久化相關(guān)的代碼
├── planner // 查詢優(yōu)化器相關(guān)的代碼
├── plugin // Frontend端插件管理相關(guān)代碼
├── qe // 用于處理各類SQL請求相關(guān)的代碼。如查詢請求的處理類、DDL請求的處理類等
├── resource // 資源標簽相關(guān)的代碼
├── rewrite // 查詢優(yōu)化器重寫規(guī)則相關(guān)的代碼
├── rpc // Frontend和Backend之間RPC協(xié)議相關(guān)的代碼
├── service // Frontend側(cè)各種服務(wù)器端代碼
├── system // 集群節(jié)點的實例類和集群節(jié)點管理相關(guān)的代碼
├── task // Frontend發(fā)往Backend的各類任務(wù)相關(guān)的代碼
└── transaction // 導(dǎo)入事務(wù)相關(guān)代碼