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-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依赖库来实现一套分布式存储系统。

配置依赖

com.github.wenweihu86.raft

raft-java-core

1.8.0

定义数据写入和读取接口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算法 java_raft-java首页、文档和下载 - 分布式一致性算法 Raft 的 Java 实现 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java痴和堆_JAVA虚拟机理解 - 爱笑的痴迷者的个人空间 - OSCHINA - 中文开源技术交流社区...

    JVM定义: JVM(Java Virtual Machine),是一种运行Java程序的软件实现,是虚拟的机器.Java程序与平台无关,它直接在虚拟机中运行. JVM运行过程: JVM将内存分划如下 ...

  2. java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...

    暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...

  3. 文档上传下载 php开源,PHP文件的上传下载 - PHP开发学习门户的个人空间 - OSCHINA - 中文开源技术交流社区...

    (1).在标签中将enctype和method两个属性指明相应的值. Enctype="multipart/form-data"; Method="POST" ...

  4. java顺序表冒泡排序_冒泡排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...

    冒泡排序就这么简单 在我大一的时候自学c语言和数据结构,我当时就接触到了冒泡排序(当时使用的是C语言编写的).现在大三了,想要在暑假找到一份实习的工作,又要回顾一下数据结构与算法的知识点了. 排序对我 ...

  5. 每天学习java一小时_java再学感受 - 编程一小时的个人空间 - OSCHINA - 中文开源技术交流社区...

    首先的是,我买了一本新的有关于java的书,刚开始看,其实在此之前我已经学了一本java语法的书本,现在我买的这本书是我用来提升自己的java认知水平的,首先是对这本书的第一印象吧,里面的内容比较详细 ...

  6. java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...

  7. java 负载均衡_java负载均衡 - 岁月静好I的个人空间 - OSCHINA - 中文开源技术交流社区...

    作用 对系统的高可用,网络压力的缓解,处理能力扩容的重要手段之一. 服务器负载 我们通常所说的负载是指:服务器负载 软硬件负载 服务器负载又分为:软件负载--硬件负载 软件负载:通过在服务器上安装一些 ...

  8. java拆分任意五位数_五位数拆分出各位 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...

    5.输入一个五位数,输出一个反转的五位数 输入->12345 输出->54321 //这是五位数字拆分方法. System.out.println("请输入五位数的数字:&quo ...

  9. java中加载窗口的函数_Java函数调用 - playgame的个人页面 - OSCHINA - 中文开源技术交流社区...

    Java函数调用和存储过程一样步骤如下: 1. 编写自定义的函数,或调用系统函数,为简单起见,我调用Mysql CONCAT()函数. 2.编写java调用测试类,可以是main方法,也可以JUnit ...

  10. java跨域cookie共享_cookie跨域共享 - qijian0503的个人空间 - OSCHINA - 中文开源技术交流社区...

    问题描述 需要解决前端pc跟服务端(java),跨域后都能获取到同一个cookie. 使用二级域名共享cookie有一个限制条件,就是两个域名的二级域名必须相同 前端pc访问域名:a.b.com 后端 ...

最新文章

  1. 符合自己的德国学校与专业
  2. PingingLab传世经典系列《CCNA完全配置宝典》-2.5 RIPv2基本配置
  3. pytorch问题汇总
  4. 真我闪博,闪靓自我!
  5. db2查最新值的前一天值_现在的C1驾照值多少钱?最新价格曝光,老司机一看赚翻了...
  6. 详解CockroachDB事务处理系统
  7. PHP中__get()和__set()的用法实例详
  8. Red 编程语言 2019 开发计划:全速前进!
  9. Matlab程序转为C++代码
  10. 【转载】白素贞的身世之谜
  11. 操作系统中的FCFS(First Come First Served)先来先服务算法,java实现
  12. 老路《用得上的商学课》学习开篇(自序)
  13. 嵌入式课程 之 超声波传感器实验
  14. English语法_定语从句 - 小细节
  15. meebo FireFox add-on
  16. CISCO 思科2960G CONSOLE口越过登陆账号密码访问
  17. 【Python学习笔记】(九)正则表达式:re模块
  18. 试验数据管理平台解决方案--MDM
  19. 爬虫逆向 js逆向常用工具简单介绍
  20. 一文读懂微信之父张小龙:失败天才、颠覆者、独裁者、人性操控师

热门文章

  1. Xposed框架分析
  2. 计算机网络-聊天室的设计与实现
  3. theano java_Theano:调用Theano函数的论据
  4. jacob word另存为
  5. Java 高级 多线程 线程安全 3 种常见解决方案教程.
  6. 戴尔微型计算机云处理器,为创作与品质而生 戴尔全新XPS15 OLED云解析
  7. 2017计算机基础教学大纲,《计算机应用基础》教学大纲
  8. 机器学习_深度学习毕设题目汇总——数据分析_数据挖掘
  9. 精灵混合加密系统_混合云的数据备份
  10. 深 入 认 识 WIN95 注 册 表