Apache Bookkeeper簡(jiǎn)介
Apache bookkeeper是一個(gè)分布式,可擴(kuò)展,容錯(cuò)(多副本),低延遲的存儲(chǔ)系統(tǒng),其提供了高性能,高吞吐的存儲(chǔ)能力。Bookkeeper實(shí)現(xiàn)了Append方式的寫操作。
Bookkeeper有一個(gè)非常成功的應(yīng)用案例:apache pulsar,是近年雅虎開源的一個(gè)MQ,pulsar相對(duì)于kafka來說,在存儲(chǔ)上有優(yōu)勢(shì),kafka的單個(gè)partition的存儲(chǔ)容量受到了部署kafka的broker的硬盤容量限制,當(dāng)有大量的數(shù)據(jù)需要MQ支持時(shí),partition可能會(huì)遇到瓶頸而無法擴(kuò)展。當(dāng)然可以預(yù)先增加partition的數(shù)量和broker的數(shù)量來滿足MQ的存儲(chǔ)需求,但是當(dāng)消息需要存儲(chǔ)的時(shí)候相對(duì)較長(zhǎng)或者數(shù)據(jù)量非常多之后,比如存儲(chǔ)一個(gè)月,需要按月做數(shù)據(jù)的回拉跑計(jì)算任務(wù),這種場(chǎng)景對(duì)kafka的集群來說是有非常大的浪費(fèi)的,因?yàn)槲覀冃枰氖歉嗟拇鎯?chǔ),不是更多了broker的能力,bookkeeper為pulsar提供了存儲(chǔ)計(jì)算分離的架構(gòu)支持,存儲(chǔ)和pulsar的broker能分別擴(kuò)展,這是kafka不具備的
基本概念
· Entry:Entry是存儲(chǔ)到bookkeeper中的一條記錄
· Ledger:可以認(rèn)為ledger是用來存儲(chǔ)Entry的,多個(gè)Entry序列組成一個(gè)ledger
· Bookie:一個(gè)Bookie就是bookkeeper的一臺(tái)存儲(chǔ)服務(wù)器,用于存儲(chǔ)ledger,一般來說存儲(chǔ)的是ledger的一段,因?yàn)榇鎯?chǔ)是分布式的,每個(gè)ledger會(huì)存儲(chǔ)在多個(gè)bookie上
· MetaData Storage:元數(shù)據(jù)存儲(chǔ),是用于存儲(chǔ)bookie相關(guān)的元數(shù)據(jù),比如bookie上有哪些ledger,bookkeeper目前使用的是zk存儲(chǔ),所在在部署bookkeeper前,要先有zk集群
· 數(shù)據(jù)存儲(chǔ)文件與緩存:
· Journal:其實(shí)就是bookkeeper的WAL(write ahead log),用于存bookkeeper的事務(wù)日志,journal文件有一個(gè)最大大小,達(dá)到這個(gè)大小后會(huì)新起一個(gè)journal文件
· Entry log:存儲(chǔ)entry的文件,我理解ledger是一個(gè)邏輯上的概念,不同ledger中的entry會(huì)先按ledger聚合,然后寫入entry log文件中。同樣,entry log會(huì)有一個(gè)最大大小,達(dá)到最大大小后會(huì)新起一個(gè)新的entry log文件
· Index file:ledger的索引文件,ledger中的entry被寫入到了entry log文件中,索引文件用于鄧穎超entry log文件中每一個(gè)ledger做索引,記錄每個(gè)ledger在entry log中的存儲(chǔ)位置以及數(shù)據(jù)在entry log文件中的長(zhǎng)度
· Ledger cache:用于緩存索引文件的,加快查找效率
· 數(shù)據(jù)落盤:內(nèi)存中會(huì)存儲(chǔ)一個(gè)LastLogMark,其中包含txnLogId(journal文件的id)和txnLogPos(journal文件中的位置),entry log文件和index文件都會(huì)先在內(nèi)存中被緩存,當(dāng)內(nèi)存達(dá)到一定值或者離上一次刷盤過期了一段時(shí)間(定時(shí)線程)后,會(huì)觸發(fā)entry log文件和index文件的刷盤,之后再將LastLogMark持久化,當(dāng)lastLogMark被持久化后,表示在lastLogMark之前的entry和索引都已經(jīng)寫到了磁盤上,這個(gè)時(shí)候可以將lastLogMark之前的journal文件清掉,如果LastLogMark在持久化前出現(xiàn)了宕機(jī),可以通過journal文件做恢復(fù),保證了數(shù)據(jù)不丟
· Data Compaction:數(shù)據(jù)的合并,有點(diǎn)類似于hbase的compact過程。在bookie上,雖然entry log在刷盤前會(huì)按ledger做聚合,但是因數(shù)數(shù)據(jù)會(huì)不斷的新增,每個(gè)leadger的數(shù)據(jù)會(huì)交差存儲(chǔ)在entry log文件中,而bookie上有一個(gè)用于做垃圾回收的線程,該線程會(huì)將沒有關(guān)聯(lián)任何ledger的entry文件進(jìn)行刪除,以便回收磁盤空間,而compaction的目的則是為了避免entry log中只有少數(shù)的記錄是有關(guān)聯(lián)的ledger的情況,不能讓這樣的entry log文件一直占用磁盤空間,所以垃圾收集線程會(huì)將這樣的entry log中有關(guān)聯(lián)ledger的entry復(fù)制到一個(gè)新的entry log文件中(同時(shí)修改索引),然后將老的entry log文件刪除。與hbase類似,bookkeeper的compaction也分為兩種:
· Minor compaction:當(dāng)entry log中有效的entry只占20#以下時(shí)做compaction
· Major compaction:當(dāng)entry log中有效的占到80%以下時(shí)就可開始做compaction
提供的API
Bookkeeper提供了兩個(gè)層次的api:
· Ledger API:用于直接操作ledger,相對(duì)比較復(fù)雜,是bookkeeper提供的底層api
· Distributed Log:分布式log,是基于ledger api的高層次api,相對(duì)更簡(jiǎn)單易用
分布式Log架構(gòu):

分布式log api寫入的log,會(huì)以寫入相同的順序存儲(chǔ)在bookkeeper上:

Bookkeeper的適用場(chǎng)景
· WAL:bookkeeper可作為wal方案
· 流存儲(chǔ):比如pulsar通過bookkeeper存儲(chǔ)消息
· 對(duì)象/Blob存儲(chǔ)