源碼分析 RocketMQ DLedger 多副本存儲(chǔ)實(shí)現(xiàn)

      網(wǎng)友投稿 897 2022-05-28

      本節(jié)目錄

      1、DLedger 存儲(chǔ)相關(guān)類圖

      1.1 DLedgerStore

      1.2 DLedgerMemoryStore

      1.3 DLedgerMmapFileStore

      2、DLedger 存儲(chǔ) 對(duì)標(biāo) RocketMQ 存儲(chǔ)

      3、DLedger 數(shù)據(jù)存儲(chǔ)格式

      4、DLedger 索引存儲(chǔ)格式

      5、思考

      其文件組成形式如下:

      正如上圖所示,多個(gè) commitlog 文件組成一個(gè)邏輯上的連續(xù)文件,使用 MappedFileQueue 表示,單個(gè) commitlog 文件使用 MappedFile 表示。

      源碼分析 RocketMQ DLedger 多副本存儲(chǔ)實(shí)現(xiàn)

      溫馨提示:如果想詳細(xì)了解 RocketMQ 關(guān)于存儲(chǔ)部分的講解,可以關(guān)注筆者的《RocketMQ 技術(shù)內(nèi)幕》一書。

      1、DLedger 存儲(chǔ)相關(guān)類圖

      1.1 DLedgerStore

      存儲(chǔ)抽象類,定義如下核心方法:

      public abstract DLedgerEntry appendAsLeader(DLedgerEntry entry)

      向主節(jié)點(diǎn)追加日志(數(shù)據(jù))。

      public abstract DLedgerEntry appendAsFollower(DLedgerEntry entry, long leaderTerm, String leaderId)

      向從節(jié)點(diǎn)同步日志。

      public abstract DLedgerEntry get(Long index)

      根據(jù)日志下標(biāo)查找日志。

      public abstract long getCommittedIndex()

      獲取已提交的下標(biāo)。

      public abstract long getLedgerEndTerm()

      獲取 Leader 當(dāng)前最大的投票輪次。

      public abstract long getLedgerEndIndex()

      獲取 Leader 下一條日志寫入的下標(biāo)(最新日志的下標(biāo))。

      public abstract long getLedgerBeginIndex()

      獲取 Leader 第一條消息的下標(biāo)。

      public void updateCommittedIndex(long term, long committedIndex)

      更新commitedIndex的值,為空實(shí)現(xiàn),由具體的存儲(chǔ)子類實(shí)現(xiàn)。

      protected void updateLedgerEndIndexAndTerm()

      更新 Leader 維護(hù)的 ledgerEndIndex 和 ledgerEndTerm 。

      public void flush()

      刷寫,空方法,由具體子類實(shí)現(xiàn)。

      public long truncate(DLedgerEntry entry, long leaderTerm, String leaderId)

      刪除日志,空方法,由具體子類實(shí)現(xiàn)。

      public void startup()

      啟動(dòng)存儲(chǔ)管理器,空方法,由具體子類實(shí)現(xiàn)。

      public void shutdown()

      關(guān)閉存儲(chǔ)管理器,空方法,由具體子類實(shí)現(xiàn)。

      1.2 DLedgerMemoryStore

      Dledger 基于內(nèi)存實(shí)現(xiàn)的日志存儲(chǔ)。

      1.3 DLedgerMmapFileStore

      基于文件內(nèi)存映射機(jī)制的存儲(chǔ)實(shí)現(xiàn)。其核心屬性如下:

      long ledgerBeginIndex = -1

      日志的起始索引,默認(rèn)為 -1。

      l- ong ledgerEndIndex = -1

      下一條日志下標(biāo),默認(rèn)為 -1。

      long committedIndex = -1

      已提交的日志索引。

      long ledgerEndTerm

      當(dāng)前最大的投票輪次。

      DLedgerConfig dLedgerConfig

      DLedger 的配置信息。

      MemberState memberState

      狀態(tài)機(jī)。

      MmapFileList dataFileList

      日志文件(數(shù)據(jù)文件)的內(nèi)存映射Queue。

      MmapFileList indexFileList

      索引文件的內(nèi)存映射文件集合。(可對(duì)標(biāo) RocketMQ MappedFIleQueue )。

      ThreadLocal< ByteBuffer> localIndexBuffer

      本地線程變量,用來(lái)緩存索引ByteBuffer。

      ThreadLocal< ByteBuffer> localEntryBuffer

      本地線程變量,用來(lái)緩存數(shù)據(jù)索引ByteBuffer。

      FlushDataService flushDataService

      數(shù)據(jù)文件刷盤線程。

      CleanSpaceService cleanSpaceService

      清除過期日志文件線程。

      boolean isDiskFull = false

      磁盤是否已滿。

      long lastCheckPointTimeMs

      上一次檢測(cè)點(diǎn)(時(shí)間戳)。

      AtomicBoolean hasLoaded

      是否已經(jīng)加載,主要用來(lái)避免重復(fù)加載(初始化)日志文件。

      AtomicBoolean hasRecovered

      是否已恢復(fù)。

      2、DLedger 存儲(chǔ) 對(duì)標(biāo) RocketMQ 存儲(chǔ)

      存儲(chǔ)部分主要包含存儲(chǔ)映射文件、消息存儲(chǔ)格式、刷盤、文件加載與文件恢復(fù)、過期文件刪除等,由于這些內(nèi)容在 RocketMQ 存儲(chǔ)部分都已詳細(xì)介紹,故本文點(diǎn)到為止,其對(duì)應(yīng)的參考映射如下:

      在 RocketMQ 中使用 MappedFile 來(lái)表示一個(gè)物理文件,而在 DLedger 中使用 DefaultMmapFIle 來(lái)表示一個(gè)物理文件。

      在 RocketMQ 中使用 MappedFile 來(lái)表示多個(gè)物理文件(邏輯上連續(xù)),而在 DLedger 中則使用MmapFileList。

      在 RocketMQ 中使用 DefaultMessageStore 來(lái)封裝存儲(chǔ)邏輯,而在 DLedger 中則使用DLedgerMmapFileStore來(lái)封裝存儲(chǔ)邏輯。

      在 RocketMQ 中使用 Commitlog F l u s h C o m m i t L o g S e r v i c e 來(lái) 實(shí) 現(xiàn) c o m m i t l o g 文 件 的 刷 盤 , 而 在 D L e d g e r 中 則 使 用 D L e d g e r M m a p F i l e S t o r e FlushCommitLogService 來(lái)實(shí)現(xiàn) commitlog 文件的刷盤,而在 DLedger 中則使用DLedgerMmapFileStore FlushCommitLogService來(lái)實(shí)現(xiàn)commitlog文件的刷盤,而在DLedger中則使用DLedgerMmapFileStoreFlushDataService來(lái)實(shí)現(xiàn)文件刷盤。

      在 RocketMQ 中使用 DefaultMessageStore C l e a n C o m m i t l o g S e r v i c e 來(lái) 實(shí) 現(xiàn) c o m m i t l o g 過 期 文 件 的 刪 除 , 而 D L e d g e r 中 則 使 用 D L e d g e r M m a p F i l e S t o r e CleanCommitlogService 來(lái)實(shí)現(xiàn) commitlog 過期文件的刪除,而 DLedger 中則使用 DLedgerMmapFileStore CleanCommitlogService來(lái)實(shí)現(xiàn)commitlog過期文件的刪除,而DLedger中則使用DLedgerMmapFileStoreCleanSpaceService來(lái)實(shí)現(xiàn)。

      由于其實(shí)現(xiàn)原理相同,上述部分已經(jīng)在《RocketMQ 技術(shù)內(nèi)幕》第4章中詳細(xì)剖析,故這里就不重復(fù)分析了。

      3、DLedger 數(shù)據(jù)存儲(chǔ)格式

      存儲(chǔ)格式字段的含義如下:

      magic

      魔數(shù),4字節(jié)。

      size

      條目總長(zhǎng)度,包含 Header(協(xié)議頭) + 消息體,占4字節(jié)。

      entryIndex

      當(dāng)前條目的 index,占8字節(jié)。

      entryTerm

      當(dāng)前條目所屬的 投票輪次,占8字節(jié)。

      pos

      該條目的物理偏移量,類似于 commitlog 文件的物理偏移量,占8字節(jié)。

      channel

      保留字段,當(dāng)前版本未使用,占4字節(jié)。

      chain crc

      當(dāng)前版本未使用,占4字節(jié)。

      body crc

      body 的 CRC 校驗(yàn)和,用來(lái)區(qū)分?jǐn)?shù)據(jù)是否損壞,占4字節(jié)。

      body size

      用來(lái)存儲(chǔ) body 的長(zhǎng)度,占4個(gè)字節(jié)。

      body

      具體消息的內(nèi)容。

      源碼參考點(diǎn):DLedgerMmapFileStore#recover、DLedgerEntry、DLedgerEntryCoder。

      4、DLedger 索引存儲(chǔ)格式

      即一個(gè)索引條目占32個(gè)字節(jié)。

      5、思考

      1、DLedger 如果整合 RocketMQ 中的 commitlog 文件,使之支持多副本?

      2、從老版本如何升級(jí)到新版本,需要考慮哪些因素呢?

      尊敬的讀者朋友們,都閱讀到這里了,麻煩幫忙點(diǎn)個(gè)贊鼓勵(lì)一下我,謝謝。

      見文如面,我是威哥,熱衷于成體系剖析JAVA主流中間件,關(guān)注公眾號(hào)『中間件興趣圈』,回復(fù)專欄可獲取成體系專欄導(dǎo)航,回復(fù)資料可以獲取筆者的學(xué)習(xí)思維導(dǎo)圖。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:交易理念 :游資、私募的超短線投資理念
      下一篇:如何查詢硬盤序列號(hào)?百度基本都是錯(cuò)的,其實(shí)一條命令搞定!
      相關(guān)文章
      亚洲精品乱码久久久久久V | 亚洲另类少妇17p| 亚洲精品动漫在线| 亚洲AV第一页国产精品| 亚洲大尺度无码无码专区| 亚洲国产小视频精品久久久三级 | 亚洲同性男gay网站在线观看| 亚洲成在人天堂在线| 亚洲精品国产美女久久久| 亚洲?v女人的天堂在线观看| 亚洲av无码专区在线观看亚| 亚洲AV无码一区二区乱子仑| 亚洲国产欧洲综合997久久| 亚洲精品又粗又大又爽A片| 亚洲国产精品久久久久秋霞小| 亚洲欧美成人av在线观看| 亚洲日本va一区二区三区| 亚洲欧美国产国产一区二区三区| 亚洲午夜无码久久| 亚洲欧美国产国产综合一区| 亚洲AV成人精品日韩一区| 国产亚洲精品第一综合| 亚洲精品国产va在线观看蜜芽| 亚洲国产婷婷综合在线精品| 中文字幕亚洲乱码熟女一区二区| 国产aⅴ无码专区亚洲av麻豆| 亚洲成a人片77777kkkk| 亚洲无线电影官网| 亚洲AV无码一区二区三区人| 亚洲熟女精品中文字幕| 久久精品国产亚洲AV未满十八| 亚洲av无码专区在线观看素人| 久久影院亚洲一区| 亚洲五月午夜免费在线视频| 在线A亚洲老鸭窝天堂| 亚洲国产精品第一区二区| 亚洲综合久久成人69| 亚洲美女免费视频| 中文字幕在线观看亚洲视频| 亚洲av日韩综合一区久热| 亚洲一区无码精品色|