Bookkeeper學習記錄


Bookkeeper學習記錄

一、簡介

Apache bookkeeper是一個分布式,可擴展,容錯(多副本),低延遲的存儲系統,其提供了高性能,高吞吐的存儲能力。Bookkeeper實現了append方式的寫操作。

 

作為 Pulsar 的 Segment storage。

 

二、概念

ledger:賬本,一個日志文件。

ledger storage:存儲

DB ledger storage:entry 索引存儲在 rockDB中。

Sorted ledger storage:entry 索引存儲在 文件中。

 

bookie:

用來存儲 Entry 數據。

我們可以把 bookie 視為一個「Key/Value database」,是一個針對整個 BookKeeper 邏輯進行設計的專用database。

Key 指上文提到的 ledger ID + entry ID 構成的標識組件。value 是指存到 ledger 里的 entry,追加和讀取操作,都是針對某一個值去運行的。

格式:(LID,EID)->Entry

 

cursor:游標

消費狀態,類似於 kafka 的 offset,但是有所不同。

以log的形式存儲在 BookKeeper 中,每次消費記錄追加到此日志中,可能產生消費空洞(跨序號消費),待 broker 集群恢復后,直接補充消費即可。

 

reder:non-durable cursor

消費狀態只存儲在內存中,不持久化到cursor log。

 

 

三、元數據

Ledger Metadata

 

Entry Metadata

 

四、指標

客戶端在創建 ledger 時,會出現 Ensemble、Write Quorum 和 Ack Quorum 這些數據指標。

  • Ensemble —— 用哪幾台 bookie 去存儲 ledger 對應的 entry
  • Write Quorum ——對於一條 entry,需要存多少副本
  • Ack Quorum —— 在寫 entry 時,要等幾個 response

 

例如:(E,W,A)->(5,3,2),表示總體是需要 5 台 bookie,但是每條 entry 只會占用 3 台 bookie 去存放,並只需等待其中的 2 台 bookie 給出應答即可。

 

五、存儲

【寫】

Journals:ledger 持久化文件,不考慮順序,只負責追加寫入來自不同 ledger 的對應的 Entry 。同步寫(fsync),順序寫(不隨機),低時延。數據刷盤成功之后,對應的Journal文件清除。

Write cache:緩存寫入Journals的日志,並按照 LederID,EntryID 進行排序。

【讀】

Entry logs:消息文件,存儲 Write cache 刷盤的數據。

Index files:索引文件,存儲 EntryID,以及對應Entry 在 Entry log中的位置。

Read cache:讀緩存。

 

 

疑問:

1、LedgerID 和 EntryID 是什么時候產生的?

【答】在客戶端調用 Bookie client 時產生。在Plusar中 即 Broker 調用 Bookie 時產生。

 

2、消息順序

由於同一個Bookie 同一時刻只有一個writer,所以可以保證其生產的EntryID 有序。*客戶端發出去的順序*。

讀取時也是如此,沒有所謂的順序,通過 LedgerID 和 EntryID 通過 key-value 的方式讀取對應 bookie中的信息,bookie沒有主從的概念,彼此對等。

全局邏輯有序,物理存儲無序。

 

3、低延時

因為bookie 是對等的,沒有主從概念,所以可以並行讀取(根據LedgerID 和 EntryID 同時讀取多個 bookie)。

 

4、BookKeeper 的一致性,在客戶端完成?

【答】是。在Plusar中對應的就是 broker,broker 會進行一個 topic-partition的選主動作,由選出來的主broker來新建ledger並寫入內容,

如果broker發生了重新選舉,則新建ledger進行寫入,保證永遠不回寫入老的ledger中。

同時 bookie 通過 fsync機制,確保同一時刻只有一個writer,從而保證了整體的一致性。

LAC 決定的,LAC存儲在 Entry Metadata中。

類似 RAFT 算法。

 

5、負載均衡

broker負載均衡,由 broker leader 中 loadmanager 模塊實現。

bookie負載均衡,由客戶端BookKeeper clientLib 完成,均衡到對應的bookie中。

 

6、日志副本復制

同 RAFT。

 

 

待確認

1、segment 和 fragment 是一回事兒嗎?

【答】

segment 可以看作是抽象, ledger 可以看作是它的一種實現。

segment 其實就是 ledger。

fragment 如 元數據第二張圖,末尾部分。(0開始的存儲在一個fragment,7開始的存儲在另一個fragment)

2、segment 就是 entry log 嗎?

【答】不是,參考問題1。entry log 是其具體表現形式。

3、segment 有固定大小限制嗎?

【答】可配置,按大小,或者按照時間。

4、ledger 寫滿是什么意思?ledger 大小是固定的嗎?

【答】大小,或者 時間。

 

 

 

參考資料

 

官網

github

tgip-cn

認識Apache Bookkeeper

BookKeeper淺析

Apache BookKeeper 很復雜嗎?你細品


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM