一、背景
Dledger是RocketMQ4.5以后推出来的功能,用于实现副本的集群选举
源码地址: 机智的路易 / dledger
二、架构设计
通信层
(一)协议
使用Raft算法
(二)请求与响应
Entry
- GetEntries
- PullEntries
- PushEntries
HeatBeat
VoteRequest
Metadata
- MetadataRequest
- MetadataRepose
AppendEntry
- AppendEntryRequest
- AppendEntryReponse
- BatchAppendEntryRequest
异步
基本都使用异步操作来实现
存储层
(一)Command
对操作系统的操作,提供了4种命令
- GetCommand:
- LeadershipTransferCommand:
- ReadFileCommand:
- AppendCommand:
(二)mmp
三、启动与停止
(一)启动参数
使用com.beust.jcommander.JCommander接收启动的环境变量传入,实现命令行交互。
参数 默认值 含义
-g --group default 组名
-i --selfId n0 id
-p --peers n0-localhost:20911 端口
-s --storeBaseDir D:/tmp/dledgerstore 保存目录
默认存储在当前磁盘下的
/tmp/dledgerstore/dledger-n0
DLedgerConfig
(二)启动流程
(1)属性注入(没属性,则默认)
(2)根据属性创建 DLedgerServer
(3)启动DLedgerServer
启动一系列服务(以下服务的内容待更新)
①存储:启动线程flushData和cleanSpace
②RPC:默认启动了两个Netty的客户端与服务端 (实现双向通信)
③推送:
④选举:获取角色
⑤定时任务:每秒执行一次checkPreferredLeader
单程线程线程池,里面是一个守护线程,进行
(4)添加优雅停止的钩子
(三)钩子函数
关闭方式有三种:
正常关闭:当最后一个非守护线程结束 / 调用了System.exit / 通过其他特定平台关闭(发送SIGINT,SIGTERM信号等)
强制关闭:调用Runtime.halt方法 / 直接kill JVM进程(发送SIGKILL信号)
异常关闭:运行中遇到RuntimeException异常等。
shutdown钩子函数使用案例
Thread thread1 = new Thread(() -> System.out.println("thread1..."));
// 定义关闭线程
Thread shutdownThread = new Thread(() -> System.out.println("shutdownThread..."));
// jvm关闭的时候先执行该线程钩子
Runtime.getRuntime().addShutdownHook(shutdownThread);