Doris 源碼分析 (二) 代碼結(jié)構(gòu)分析

主交互邏輯

主交互架構(gòu)

內(nèi)部調(diào)用邏輯圖

正如上圖所示,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ù)的數(shù)據(jù)流具體過程如上圖所示,步驟如下:

  1. 只有 leader FE 可以對元數(shù)據(jù)進行寫操作。寫操作在修改 leader 的內(nèi)存后,會序列化為一條log,按照 key-value 的形式寫入 bdbje。其中 key 為連續(xù)的整型,作為 log id,value 即為序列化后的操作日志。

  2. 日志寫入 bdbje 后,bdbje 會根據(jù)策略(寫多數(shù)/全寫),將日志復(fù)制到其他 non-leader 的 FE 節(jié)點。non-leader FE 節(jié)點通過對日志回放,修改自身的元數(shù)據(jù)內(nèi)存鏡像,完成與 leader 節(jié)點的元數(shù)據(jù)同步。

  3. leader 節(jié)點的日志條數(shù)達到閾值后(默認 10w 條),會啟動 checkpoint 線程。checkpoint 會讀取已有的 image 文件,和其之后的日志,重新在內(nèi)存中回放出一份新的元數(shù)據(jù)鏡像副本。然后將該副本寫入到磁盤,形成一個新的 image。之所以是重新生成一份鏡像副本,而不是將已有鏡像寫成 image,主要是考慮寫 image 加讀鎖期間,會阻塞寫操作。所以每次 checkpoint 會占用雙倍內(nèi)存空間。

  4. image 文件生成后,leader 節(jié)點會通知其他 non-leader 節(jié)點新的 image 已生成。non-leader 主動通過 http 拉取最新的 image 文件,來更換本地的舊文件。

  5. 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)代碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容