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 大小是固定的嗎?
【答】大小,或者 時間。
參考資料