Doris中,Leader節點與非Leader節點和Observer節點之間的元數據高可用和一致性,是通過bdbje(全稱:Oracle Berkeley DB Java Edition)的一致性和高可用實現的。 元數據與同步流程 元數據主要存儲四類數據: 用戶數據信息. 包括資料庫, 表的sche ...
Doris中,Leader節點與非Leader節點和Observer節點之間的元數據高可用和一致性,是通過bdbje(全稱:Oracle Berkeley DB Java Edition)的一致性和高可用實現的。
元數據與同步流程
元數據主要存儲四類數據:
- 用戶數據信息. 包括資料庫, 表的schema, 分片信息等
- 各類作業信息. 如導入作業, clone作業, schemaChange作業等。
- 用戶及許可權信息.
- 集群及節點信息.
元數據同步圖:
元數據流轉如下:
-
leader寫入元數據
寫操作在修改leader的記憶體後,序列化為log,按照key-value格式寫入到bdbje. 其中 key 為連續的整型數字,全局唯一、遞增,作為 log id;value 即為序列化後的操作日誌,由2部分組成。OperationType為操作類型,如建庫操作、建表操作等。Writable Entity為序列化後的操作具體內容,通過反序列化該值,可以從鏡像上回放元數據操作。
-
集群節點同步元數據
日誌寫入bdbje後,bdbje會根據策略(寫多數/全寫), 將日誌複製到FE其他的follower節點。FE節點通過對bdbje中元數據日誌的reply, 修改自身的元數據記憶體鏡像,完成與leader節點的元數據同步。
-
元數據checkpoint持久化
leader 節點的日誌條數達到閾值(預設 10w 條)並且滿足checkpoint線程執行周期(預設六十秒)。checkpoint 會讀取已有的 image 文件,和其之後的日誌,重新在記憶體中回放出一份新的元數據鏡像副本。然後將該副本寫入到磁碟,形成一個新的 image。之所以是重新生成一份鏡像副本,而不是將已有鏡像寫成 image,主要是考慮寫 image 加讀鎖期間,會阻塞寫操作。所以每次 checkpoint 會占用雙倍記憶體空間。
-
image 文件生成後,leader 節點會通知其他 non-leader 節點新的 image 已生成。non-leader 主動通過 http 拉取最新的 image 文件,來更換本地的舊文件.
-
bdbje 中的日誌,在 image 做完後,會定期刪除舊的日誌
-
刪除舊的磁碟元數據鏡像
總結
Leader節點修改記憶體元數據後,元數據日誌首先寫入bdbje,達到閾值後,bdbje形成一個新的DB,然後將新的DB內的日誌,在舊的image上回放,生成一個新的image,然後刪除bdbje中已經被集群節點全部同步的舊的元數據日誌。這樣周而複始。保證bdbje中的數據不會無限制得增長,也保證了image中始終保存著較新的元數據。同時,其他非leader節點,也訪問bdbje,將bdbje中的新寫入的元數據日誌,在自己記憶體中的元數據上回放。
元數據層面,Doris採用Paxos協議以及Memory + Checkpoint + Journal的機制來確保元數據的高性能及高可靠。Doris的元數據存儲是 memory -> bdbje -> checkpoint(image)。
為什麼同時需要 bdbje 和 image 鏡像呢?
-
高性能和實時查詢: bdbje 作為嵌入式資料庫提供了高性能的元數據訪問,適用於實時的查詢和操作。它通常保存在記憶體中,可以快速地提供元數據信息。
-
數據恢復和持久性: image 鏡像則用於實現元數據的持久化,以便在系統重啟或發生故障時,能夠使用鏡像還原元數據。這有助於確保系統的可靠性。
參考: