《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動(dòng)態(tài) > 5 張圖帶你了解 Pulsar 的存儲(chǔ)引擎 BookKeeper

5 張圖帶你了解 Pulsar 的存儲(chǔ)引擎 BookKeeper

2021-07-10
來源:CSDN
關(guān)鍵詞: 存儲(chǔ)引擎 BookKeeper

  Apache BookKeeper是一款企業(yè)級(jí)存儲(chǔ)系統(tǒng),最初由雅虎研究院研發(fā),在2011年作為Apache ZooKeeper的子項(xiàng)目進(jìn)行孵化,在2015年1月成為 Apache頂級(jí)項(xiàng)目。

  起初,BookKeeper是一個(gè)預(yù)寫日志(WAL)系統(tǒng),經(jīng)過幾年的發(fā)展,BookKeeper的功能更加完善,比如為Hadoop分布式文件系統(tǒng)(HDFS)的NameNode提供高可用和多副本,為消息系統(tǒng)比Pulsar提供存儲(chǔ)服務(wù),為多個(gè)數(shù)據(jù)中心提供跨機(jī)器復(fù)制。

  使用場(chǎng)景

  BookKeeper最初的一個(gè)使用場(chǎng)景是為HDFS的NameNode保存edit log,如下圖:

微信圖片_20210710153143.png

  ZKFC是一個(gè)Zookeeper的客戶端,主要用來監(jiān)測(cè)和管理NameNode狀態(tài),每個(gè)NameNode機(jī)器上都會(huì)運(yùn)行一個(gè)ZKFC,它的職責(zé)主要有三個(gè):

  健康檢查

  Zookeeper會(huì)話管理

  選舉,當(dāng)集群中一個(gè)Active NameNode宕機(jī),Zookeeper會(huì)自動(dòng)選擇一個(gè)節(jié)點(diǎn)作為新的Active NameNode。

  BookKeeper記錄NameNode的edit log(edit log存放文件系統(tǒng)的操作日志),NameNode的所有修改都會(huì)記錄到BookKeeper。這樣active NameNode宕機(jī)后,BookKeeper用保存的edit log去standby NameNode做回放,之后切換成active NameNode。

  BookKeeper具有如下特性:

  一致性:因?yàn)閑dit log保存的是HDFS的元數(shù)據(jù),對(duì)一致性要求很高

  低延遲:為了不丟數(shù)據(jù),需要低延遲

  高吞吐:為了支持更多的NameNode節(jié)點(diǎn),需要高吞吐

  節(jié)點(diǎn)對(duì)等

  Bookie中保存的數(shù)據(jù)結(jié)構(gòu)如下圖:

微信圖片_20210710153148.png

  writer寫數(shù)據(jù)時(shí),把entry并發(fā)寫入多個(gè)bookie節(jié)點(diǎn)的Ledger。這類似于文件系統(tǒng)寫數(shù)據(jù)時(shí)首先會(huì)打開一個(gè)文件,如果文件不存在,則會(huì)創(chuàng)建文件元數(shù)據(jù)。

  Ledger也就是Pulsar中的segment。

  writer寫數(shù)據(jù)時(shí),首先會(huì)打開一個(gè)新Ledger,函數(shù)如下:

  openLedger(組內(nèi)節(jié)點(diǎn)數(shù)目、數(shù)據(jù)備份數(shù)目、等待刷盤節(jié)點(diǎn)數(shù)目)

  比如(5,3,2)代表組內(nèi)共有5個(gè)Bookie節(jié)點(diǎn),寫數(shù)據(jù)時(shí)需要寫入3個(gè)節(jié)點(diǎn),有2個(gè)節(jié)點(diǎn)返回成功代表寫入成功。

  這樣寫入的這3個(gè)節(jié)點(diǎn)數(shù)據(jù)完全一樣,關(guān)系是對(duì)等的,不存在主從關(guān)系。

  2.1 數(shù)據(jù)讀寫

  BookKeeper數(shù)據(jù)讀寫如下圖:

微信圖片_20210710153151.png

  writer以roundrobin的方式寫入bookie,比如在上圖中,第一條數(shù)據(jù)寫入Bookie1、Bookie2和Bookie3,第二條數(shù)據(jù)寫入Bookie2、Bookie3、Bookie4,第三條數(shù)據(jù)寫入Bookie3、Bookie4、Bookie5,第四條數(shù)據(jù)寫入Bookie4、Bookie5和Bookie1。

  在打開一個(gè)Ledger時(shí),就傳入了bookie數(shù)量,這樣在寫每個(gè)entry時(shí),就用entry的id跟bookie數(shù)量取模,來確定寫到哪幾個(gè)bookie上。比如第3條消息跟5取模是3,就寫到Bookie3、Bookie4和Bookie5。

  這樣以輪詢的方式將Ledger數(shù)據(jù)寫入各個(gè)bookie節(jié)點(diǎn),每個(gè)bookie節(jié)點(diǎn)的數(shù)據(jù)是均衡的,每個(gè)bookie節(jié)點(diǎn)的磁盤帶寬和網(wǎng)卡帶寬都能得到充分利用。

  2.2 讀高可用

  Reader在讀取數(shù)據(jù)時(shí),可以讀取多份數(shù)據(jù)中的任意一份數(shù)據(jù)。BookKeeper會(huì)設(shè)置一個(gè)讀超時(shí)時(shí)間,如果讀取超時(shí)了,會(huì)給另外一個(gè)bookie節(jié)點(diǎn)(speculative read)發(fā)送讀請(qǐng)求。

  2.3 寫高可用

  如果某個(gè)bookie節(jié)點(diǎn)(比如bookie5)發(fā)生故障不能寫入了,BookKeeper會(huì)做如下處理:

  記錄出錯(cuò)的entry id

  對(duì)故障節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行封裝

  關(guān)閉當(dāng)前的Ledger,重新打開一個(gè)新的Ledger,這個(gè)Ledger會(huì)重新選擇bookie節(jié)點(diǎn),1、2、3、4、6。

  如果bookie5恢復(fù),就不再提供寫服務(wù)了,只提供讀服務(wù)。

  如果不能恢復(fù),就把bookie5的數(shù)據(jù),從其他節(jié)點(diǎn)的備份中恢復(fù)到新的節(jié)點(diǎn)上,這個(gè)過程需要根據(jù)Ledger id跟5取模來判斷是否落到bookie5上,數(shù)據(jù)恢復(fù)過程并不影響Reader,因?yàn)槠渌麅煞輸?shù)據(jù)可以繼續(xù)提供服務(wù)。

  I/O模型

  BookKeeper的I/O模型如下圖,這個(gè)圖是單個(gè)bookie的數(shù)據(jù)流轉(zhuǎn):

微信圖片_20210710153154.png

  整個(gè)流程入下:

  Writer寫入的數(shù)據(jù)首先到達(dá)Journal,Journal將數(shù)據(jù)進(jìn)行g(shù)roup后刷到到Journal盤,這個(gè)刷盤的數(shù)據(jù)順序跟writer寫入順序一致。

  Writer寫入Journal Disk是實(shí)時(shí)刷盤。

  Journal Disk的數(shù)據(jù)會(huì)寫入memory table進(jìn)行數(shù)據(jù)整理,把同一個(gè)topic的數(shù)據(jù)整理到一起。

  把整理好的數(shù)據(jù)刷盤。Index Disk保存entry的index,對(duì)應(yīng)entry在Logger Disks的offset。

  3.1 讀寫分離

  讀取數(shù)據(jù)時(shí),首先從Memory Cache中讀取數(shù)據(jù),如果數(shù)據(jù)不存在,才會(huì)去Index Disk和Logger Disk讀取數(shù)據(jù)。而寫數(shù)據(jù)是實(shí)時(shí)落盤到Journal Disk,這樣實(shí)現(xiàn)了讀寫隔離。

  3.2 強(qiáng)一致性

  數(shù)據(jù)可以實(shí)時(shí)刷盤到Journal Disk,保證了數(shù)據(jù)的強(qiáng)一致性。

  3.3 靈活SLA

  對(duì)于寫性能要求高的業(yè)務(wù)場(chǎng)景,可以單獨(dú)加強(qiáng)Journal盤性能,而對(duì)于讀性能要求高的場(chǎng)景,可以加強(qiáng)Ledger Disk和Index Disk的性能。

  Pulsar中的使用

  Pulsar的架構(gòu)圖如下:

微信圖片_20210710153157.png

Consumer消費(fèi)消息后,還會(huì)修改Cusor中保存的offset,并且也會(huì)記錄到BookKeeper。這樣保證了Cursor的一致性。




電子技術(shù)圖片.png

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。