简介
dledger是openmessaging的一个组件, raft算法实现,用于分布式日志,本系列分析dledger如何实现raft概念,以及dledger在rocketmq的应用
本系列使用dledger v0.40
本文分析dledger的日志,包括写入,复制,共识点推进
关键词
Raft
Openmessaging
参考资料
In Search of an Understandable Consensus Algorithm raft论文简版
技术架构
- 应用/client client是dledger提供给应用访问节点的组件
以下是节点内组件
- rpc服务
rpc服务内置rpc client/rpc server,对外接收外部rpc访问,包括client和节点间通讯;对内,解释rpc请求,转发给Server;对外,发送rpc请求到其他节点
- Server
主程序,负责节点启动,其他组件的启动;写入日志请求初步处理等
- Elector
选举类,负责集群主节点选举
- EntryPusher
日志写入器,内置分发器和处理器,分发器主节点用于复制日志到跟随者;处理器跟随者使用,写入日志
- 存储
存储日志条目,有两个实现,基于内存和基于文件
- 快照/状态机
新版本的dledger提供状态机,dledger成为通用的raft组件,不再是rocketmq专用
日志
技术架构
日志组件核心是维护共识日志,所有节点都认可的日志记录点。client发起写入rpc请求,领导者处理,写入本地存储,领导者复制到其他节点,不断推进日志共识点。集群领导者下线,其他节点重新选主,使用共识点恢复集群
- EntryPusher 统筹日志复制全局的角色,为领导者构建跟随者对应的EntryDispatcher,负责跟随者的同步,为每个跟随者构建EntryHandler处理同步请求
- 集群领导者通过比对/截取/写入/提交 同步日志
- QuorumAckChecker全局提交,推进共识
下面详细分析各参与组件
领导者写入
应用写入日志需要由领导者处理,领导者写入消息到本地存储后,复制到跟随者
写入请求DLedgerServer的handleAppend方法处理,然后appendAsLeader写入存储,最后DLedgerEntryPusher的appendClosure方法,登记本节点的日志水位线,pending返回
复制
领导者写入日志,揭开集群同步的序幕
领导者为每个跟随者构建EntryDispatcher,负责该跟随者的同步,QuorumAckChecker全局提交,确定共识index
EntryDispatcher是有状态,定时驱动
上图展示EntryDispatcher状态变更,状态变更执行的动作,相对应的EntryHandler处理方法,当然,实际不是直接交互的,EntryHandler缓存请求,定时处理,后面章节详细分析
其中,
INSTALL_SNAPSHOT 放到后续存储/快照中分析,在本版本,快照可选,没有该功能不影响日志复制
COMMIT EntryDispatcher没有处在该状态,只是一个操作
关键属性
很大程度上,理解dledger的日志复制就是理解日志存储的位置点和位置点动态变化,本章介绍一下关键属性