一个基于raft的java库,用于构建高可用性、高持久性、强一致性的提交日志,它可以作为分布式存储系统的持久层,例如消息传递、流、kv、db等。
Dledger增加了许多在[原始论文]中没有描述的新功能(https:raft.github.ioraft.pdf)。它已被证明是一个真正的生产准备产品。
- Leader选举
- Preferred leader election
- Pre-vote protocol
- 高性能、高可靠的存储支持
- 领导者和追随者之间的并行日志复制
- 异步复制
- 状态机
- Multi-Raft
- High tolerance of symmetric network partition
- High tolerance of asymmetric network partition
- Jepsen verification with fault injection
- DLedgerConfig:主从切换模块相关的配置信息。
- MemberState:节点状态机,即Raft协议中Follower、 Candidate、Leader三种状态的状态机实现。
- DLedgerClientProtocol:DLedger客户端协议,主要定义如下3个方法:
- CompletableFuture get(GetEntriesRequest request):客户端从服务器获取日志条目(获取数据)。
- CompletableFuture append(AppendEntryRequest request):客户端向服务器追加日志(存储数据)。
- CompletableFuture metadata(MetadataRequest request):获取元数据。
- DLedgerProtocol:DLedger客户端协议,主要定义如下4个方法:
- CompletableFuture vote(VoteRequest request):发起投票请求。
- CompletableFuture heartBeat(HeartBeatRequest request):Leader节点向从节点发送心跳包。
- CompletableFuture pull(PullEntriesRequest request):拉取日志条目。
- CompletableFuture push(PushEntryRequest request):推送日志条目,用于日志传播。
- DLedgerClientProtocolHandler:DLedger客户端协议处理器。
- DLedgerProtocolHander:DLedger服务端协议处理器。
- DLedgerRpcService:DLedger节点之前的网络通信,默认基于Netty实现,默认实现类为DLedgerRpcNettyService。
- DLedgerLeaderElector:基于Raft协议的Leader选举类。(重点,入口:io.openmessaging.storage.dledger.DLedgerLeaderElector.StateMaintainer.doWork#)
- DLedgerServer:基于Raft协议的集群内节点的封装类。
- DLedgerEntryPusher:基于Raft协议的日志复制实现类。
- EntryDispatcher:Leader节点用于向Follower节点主动同步数据的线程实现,对于一个Raft集群,有多少个Follower节点,在Leader节点中就会有多少个EntryDispatcher线程,每一个线程专门负责向一个Follower节点同步数据。
- EntryHandler:Follower节点用于处理Leader节点发起的日志复制请求。
-
64bit JDK 1.8+
-
Maven 3.2.x
mvn clean install -DskipTests
Print Help in Command Line
java -jar example/target/dledger-example.jar
A high-available, high-durable, strong-consistent, append-only log store.
Start a Standalone Appender Server
java -jar example/target/dledger-example.jar appender
Append Data to Appender
java -jar example/target/dledger-example.jar append -d "Hello World"
After this command, you have appended a log which contains "Hello World" to the appender.
Get Data from Appender
java -jar example/target/dledger-example.jar get -i 0
After this command, you have got the log which contains "Hello World" from the appender.
A simple multi-register model
Start a Standalone RegisterModel Server
java -jar example/target/dledger-example.jar register
Write Value for a Key
java -jar example/target/dledger-example.jar write -k 13 -v 31
After this command, you have written a key-value pair which is <13, 31> to the register model.
Read Value for a Key
java -jar example/target/dledger-example.jar read -k 13
After this command, you have read the value 31 for the key 13 from the register model.
We always welcome new contributions, whether for trivial cleanups, big new features. We are always interested in adding new contributors. What we look for are series of contributions, good taste and ongoing interest in the project. If you are interested in becoming a committer, please let one of the existing committers know and they can help you walk through the process.
Apache License, Version 2.0 Copyright (C) Apache Software Foundation