excel求和與計(jì)算器求和相差0.01(excel求和0.00)
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 表示。
溫馨提示:如果想詳細(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)容。