Raft implementation library for Java.
参考自Raft论文和Raft作者的开源实现LogCabin。
leader选举
日志复制
snapshot
集群成员动态更变
在本地单机上部署一套3实例的raft集群,执行如下脚本:
cd raft-java-example && sh deploy.sh
该脚本会在raft-java-example/env目录部署三个实例example1、example2、example3;
同时会创建一个client目录,用于测试raft集群读写功能。
部署成功后,测试写操作,通过如下脚本: cd env/client
./bin/run_client.sh "127.0.0.1:8051,127.0.0.1:8052,127.0.0.1:8053" hello world
测试读操作命令:
./bin/run_client.sh "127.0.0.1:8051,127.0.0.1:8052,127.0.0.1:8053" hello
下面介绍如何在代码中使用raft-java依赖库来实现一套分布式存储系统。
<dependency> <groupId>com.github.wenweihu86.raft</groupId> <artifactId>raft-java-core</artifactId> <version>1.8.0</version> </dependency>
message SetRequest { string key = 1; string value = 2; } message SetResponse { bool success = 1; } message GetRequest { string key = 1; } message GetResponse { string value = 1; }
public interface ExampleService { Example.SetResponse set(Example.SetRequest request); Example.GetResponse get(Example.GetRequest request); }
实现状态机StateMachine接口实现类
// 该接口三个方法主要是给Raft内部调用 public interface StateMachine { /** * 对状态机中数据进行snapshot,每个节点本地定时调用 * @param snapshotDir snapshot数据输出目录 */ void writeSnapshot(String snapshotDir); /** * 读取snapshot到状态机,节点启动时调用 * @param snapshotDir snapshot数据目录 */ void readSnapshot(String snapshotDir); /** * 将数据应用到状态机 * @param dataBytes 数据二进制 */ void apply(byte[] dataBytes); }
实现数据写入和读取接口
// ExampleService实现类中需要包含以下成员 private RaftNode raftNode; private ExampleStateMachine stateMachine;
// 数据写入主要逻辑 byte[] data = request.toByteArray(); // 数据同步写入raft集群 boolean success = raftNode.replicate(data, Raft.EntryType.ENTRY_TYPE_DATA); Example.SetResponse response = Example.SetResponse.newBuilder().setSuccess(success).build();
// 数据读取主要逻辑,由具体应用状态机实现 Example.GetResponse response = stateMachine.get(request);
服务端启动逻辑
// 初始化RPCServer RPCServer server = new RPCServer(localServer.getEndPoint().getPort()); // 应用状态机 ExampleStateMachine stateMachine = new ExampleStateMachine(); // 设置Raft选项,比如: RaftOptions.snapshotMinLogSize = 10 * 1024; RaftOptions.snapshotPeriodSeconds = 30; RaftOptions.maxSegmentFileSize = 1024 * 1024; // 初始化RaftNode RaftNode raftNode = new RaftNode(serverList, localServer, stateMachine); // 注册Raft节点之间相互调用的服务 RaftConsensusService raftConsensusService = new RaftConsensusServiceImpl(raftNode); server.registerService(raftConsensusService); // 注册给Client调用的Raft服务 RaftClientService raftClientService = new RaftClientServiceImpl(raftNode); server.registerService(raftClientService); // 注册应用自己提供的服务 ExampleService exampleService = new ExampleServiceImpl(raftNode, stateMachine); server.registerService(exampleService); // 启动RPCServer,初始化Raft节点 server.start(); raftNode.init();
Raft声称是一种易于理解的分布式一致性算法。有不少工程师们翻了它的论文,参考了很多资料,最后只好怀疑自己是不是智商有问题。 Raft一直以来是很多高级资深程序员技术上的天花板,捅破相当有难度。每次刚刚拿起时汹涌澎湃,过不了多久便偃旗息鼓了,有一种丧尸般的难受。渴望逃离技术舒适区时会经常经历有这种挫折。在分布式系统领域,Raft就是一道很高的门槛,迈过了这道坎后面技术的自由度就可以再上一个台阶。
raft-java Raft implementation library for Java. 参考自Raft论文和Raft作者的开源实现LogCabin。 支持的功能leader选举 日志复制 snapshot 集群成员动态更变 Quick Start 在本地单机上部署一套3实例的raft集群,执行如下脚本: cd raft-java-example && sh deploy.sh 该脚本会在r
raft-java Raft implementation library for Java. 参考自Raft论文和Raft作者的开源实现LogCabin。 支持的功能 leader选举 日志复制 snapshot 集群成员动态更变 Quick Start 在本地单机上部署一套3实例的raft集群,执行如下脚本: cd raft-java-example && sh deploy.sh 该脚本会在
// 初始化RPCServer RPCServer server = new RPCServer(localServer.getEndPoint().getPort()); // 应用状态机 ExampleStateMachine stateMachine = new ExampleStateMachine(); // 设置Raft选项,比如: RaftOptions.snapshotMinLog
raft-java Raft implementation library for Java. 参考自Raft论文和Raft作者的开源实现LogCabin。 支持的功能 leader选举 日志复制 snapshot 集群成员动态更变 Quick Start 在本地单机上部署一套3实例的raft集群,执行如下脚本: cd raft-java-example && sh deploy.sh 该脚本会在
支持的功能: 1、leader选举 2、日志复制 3、snapshot 4、集群成员动态更变 源码:https://github.com/wenweihu86/raft-java Quick Start 在本地单机上部署一套3实例的raft集群,执行如下脚本: cd raft-java-example && sh deploy.sh 该脚本会在raft-java-example/env目录部署三个
raft-java Raft implementation library for Java. 参考自Raft论文和Raft作者的开源实现LogCabin。 支持的功能 leader选举 日志复制 snapshot 集群成员动态更变 Quick Start 在本地单机上部署一套3实例的raft集群,执行如下脚本: cd raft-java-example && sh deploy.sh 该脚本会在
raft-java Raft implementation library for Java. 参考自Raft论文和Raft作者的开源实现LogCabin。 项目Fork自wenweihu86/raft-java,修正了原项目com.baidu.brpc.exceptions.RpcException: serviceInterface must not be set repeatedly, pl
raft-java Raft implementation library for Java. 参考自Raft论文和Raft作者的开源实现LogCabin。 支持的功能 leader选举 日志复制 snapshot 集群成员动态更变 Quick Start 在本地单机上部署一套3实例的raft集群,执行如下脚本: cd raft-java-example && sh deploy.sh 该脚本会在
Raft 算法是一种分布式一致性算法,它可以确保一组服务器在遇到任何故障情况下仍然可以达成一致并保持数据的一致性。 关于 Java 的实现,有许多第三方库可以提供实现 Raft 算法的功能。其中一个常用的库是 Copycat,它是一个高效、可扩展、易用的分布式系统框架,内置了 Raft 一致性算法的实现。 此外,也有一些其他的 Java 库可以实现 Raft 算法,例如 Jraft 和 Java-
分布式共识算法 (Consensus Algorithm) 如何理解分布式共识? 多个参与者 针对 某一件事 达成完全 一致 :一件事,一个结论 已达成一致的结论,不可推翻 有哪些分布式共识算法? Paxos:被认为是分布式共识算法的根本,其他都是其变种,但是 paxos 论文中只给出了单个提案的过程,并没有给出复制状态机中需要的 multi-paxos 的相关细节的描述,实现 paxos 具有很
Raft 新特性 Strong Leader 更强的领导形式 例如日志条目只会从领导者发送到其他服务器, 这很大程度上简化了对日志复制的管理 Leader Election 使用随机定时器来选举领导者 用最简单的方式减少了选举冲突的可能性 Membership Change 新的联合一致性 (joint consensus) 方法 复制状态机 1. 复制状态机通过日志实现 每台机器一份日志 每个日
jgroups-raft 项目是 JGroups 框架对 Raft 的实现。 Maven: <groupId>org.jgroups</groupId><artifactId>jgroups-raft</artifactId><version>0.2</version> Raft 是一个容易理解的共识算法。在容错和性能方面它相当于 Paxos(Google 的一致性算法)。所不同的是,它的分解为
Paxos 与 Raft Paxos 问题是指分布式的系统中存在故障(fault),但不存在恶意(corrupt)节点场景(即可能消息丢失或重复,但无错误消息)下的共识达成(Consensus)问题。因为最早是 Leslie Lamport 用 Paxon 岛的故事模型来进行描述而命名。 Paxos 1990 年由 Leslie Lamport 提出的 Paxos 共识算法,在工程角度实现了一种最
RAFT介绍 当前业界有很多分布式一致性复制协议,比如Paxos,Zab,Viewstamped Replication等,其中Lamport提出的Paxos被认为是分布式一致性复制协议的根本,其他的一致性复制协议都是其变种。但是Paxos论文中只给出了单个提案的过程,并没有给出复制状态机中需要的MultiPaxos的相关细节描述。Zab协议被应用在Zookeeper中,业界使用广泛,但是没有抽象
《分布式 Java》是一本关于 Java 分布式应用的学习教程,是对市面上基于 Java 的分布式系统最佳实践的技术总结。图文并茂,并通过大量实例让你走近 Java 的世界!