跳到主要内容

三十五、源码分析 RocketMQ DLedger 多副本存储实现


本节目录

1、 DLedger存储相关类图;

  • 1.1 DLedgerStore
  • 1.2 DLedgerMemoryStore
  • 1.3 DLedgerMmapFileStore

2、 DLedger存储对标RocketMQ存储;

3、 DLedger数据存储格式;

4、 DLedger索引存储格式;

5、 思考;

RocketMQ DLedger 的存储实现思路与 RocketMQ 的存储实现思路相似,本文就不再从源码角度详细剖析其实现,只是点出其实现关键点。我们不妨简单回顾一下 CommitLog 文件、ConsumeQueue 文件设计思想。

其文件组成形式如下:
 
正如上图所示,多个 commitlog 文件组成一个逻辑上的连续文件,使用 MappedFileQueue 表示,单个 commitlog 文件使用 MappedFile 表示。

> 温馨提示:如果想详细了解 RocketMQ 关于存储部分的讲解,可以关注笔者的《RocketMQ 技术内幕》一书。

1、DLedger 存储相关类图

 

1.1 DLedgerStore

存储抽象类,定义如下核心方法:

  • public abstract DLedgerEntry appendAsLeader(DLedgerEntry entry)
    向主节点追加日志(数据)。
  • public abstract DLedgerEntry appendAsFollower(DLedgerEntry entry, long leaderTerm, String leaderId)
    向从节点同步日志。
  • public abstract DLedgerEntry get(Long index)