聊聊分佈式 SQL 數據庫Doris(二)

Doris中,Leader節點與非Leader節點和Observer節點之間的元數據高可用和一致性,是通過bdbje(全稱:Oracle Berkeley DB Java Edition)的一致性和高可用實現的。

元數據與同步流程

元數據主要存儲四類數據:

  1. 用戶數據信息. 包括數據庫, 表的schema, 分片信息等
  2. 各類作業信息. 如導入作業, clone作業, schemaChange作業等。
  3. 用戶及權限信息.
  4. 集羣及節點信息.

元數據同步圖:

1.png

元數據流轉如下:

  1. leader寫入元數據

    寫操作在修改leader的內存後,序列化爲log,按照key-value格式寫入到bdbje. 其中 key 爲連續的整型數字,全局唯一、遞增,作爲 log id;value 即爲序列化後的操作日誌,由2部分組成。OperationType爲操作類型,如建庫操作、建表操作等。Writable Entity爲序列化後的操作具體內容,通過反序列化該值,可以從鏡像上回放元數據操作。

    2.png

  2. 集羣節點同步元數據

    日誌寫入bdbje後,bdbje會根據策略(寫多數/全寫), 將日誌複製到FE其他的follower節點。FE節點通過對bdbje中元數據日誌的reply, 修改自身的元數據內存鏡像,完成與leader節點的元數據同步。

  3. 元數據checkpoint持久化

    leader 節點的日誌條數達到閾值(默認 10w 條)並且滿足checkpoint線程執行週期(默認六十秒)。checkpoint 會讀取已有的 image 文件,和其之後的日誌,重新在內存中回放出一份新的元數據鏡像副本。然後將該副本寫入到磁盤,形成一個新的 image。之所以是重新生成一份鏡像副本,而不是將已有鏡像寫成 image,主要是考慮寫 image 加讀鎖期間,會阻塞寫操作。所以每次 checkpoint 會佔用雙倍內存空間。

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

  5. bdbje 中的日誌,在 image 做完後,會定期刪除舊的日誌

  6. 刪除舊的磁盤元數據鏡像

總結

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 鏡像則用於實現元數據的持久化,以便在系統重啓或發生故障時,能夠使用鏡像還原元數據。這有助於確保系統的可靠性。

參考:

Apache Doris元數據管理

元數據設計文檔

元數據運維

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章