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相关推荐

  1. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...

  2. JAVA基础(JAVA 执行环境) 第一天

    JAVA程序有3中执行环境. (1)能够单独运行的程序,称为Java Application(Java应用程序). (2)在Internet浏览器中运行的程序,称为 Java Applet(JAVA小 ...

  3. java.utilDate和java.sql.Date

    java.utilDate和java.sql.Date由广州疯狂软件教育java培训分享: java程序中的时间类型有java.util.Date和java.sql.Date两种.两者之间的关系和转化 ...

  4. java 终极超类,Java问答:终极父类(3),java问答

    Java问答:终极父类(3),java问答Java问答:终极父类(上) Java问答:终极父类(下) Java问答:终极父类(2)-上篇 Java问答:终极父类(2)-下篇 在之前关于 Object ...

  5. java.lang.OutOfMemoryError: Java heap space错误及...

    为什么80%的码农都做不了架构师?>>>    以下是从网上找到的关于堆空间溢出的错误解决办法: java.lang.OutOfMemoryError: Java heap spac ...

  6. 浅谈Java SE、Java EE、Java ME三者的区别

    1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程 ...

  7. java.lang.OutOfMemoryError: Java heap space的解决办法

    如果在启动过程中出现内存溢出问题,抛出类似如下异常信息: java.lang.OutOfMemoryError: Java heap space 可以尝试办法: A.修改Tomcat/bin/cata ...

  8. Java接口和Java抽象类

    Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了. 1.Java接口和Java抽象类最大的一个区别,就在于Java ...

  9. Java SE和Java EE应用的性能调优

    凡事预则立,不预则废,和许多事情一样,Java性能调优的成功,离不开行动计划.方法或策略以及特定的领域背景知识.为了在Java性能调优工作中有所成就,你得超越"花似雾中看"的状态, ...

  10. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer

    java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer 1.改sql select ...

最新文章

  1. HDU 1028 HDU Ignatius and the Princess III
  2. 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
  3. 基于JavaFX的SimpleDateFormat演示程序
  4. 160 - 7 aLoNg3x.2
  5. linux+free参数类型,linux的free命令
  6. git使用过程及常用命令
  7. android new view参数,Android ViewModel附加参数
  8. 实操教程|Pytorch - 弹性训练极简实现( 附源码)
  9. phpStorm 2017.3.1,WebStorm 2017.3.4 最新版本免费注册激活方法
  10. 微信科室预约挂号小程序
  11. Qt 动态加载.qrc文件
  12. Unity 使用video player播放360全景视频
  13. sa-token集成jwt
  14. linux安装Aria2和部署AriaNg Web服务
  15. 四川一度智信|小白卖家不懂选品?
  16. 不重启JVM动态添加日志(阿里Arthas)
  17. fgets函数的用法
  18. 计量经济学复习笔记(六)updated
  19. Linux 解析 ip 的各种命令
  20. 2005年5月信息系统监理师

热门文章

  1. 冰河真人出镜聊职业发展,说点对大家有用的
  2. java窗口的repaint_Java Swing revalidate()与repaint()
  3. 整理了史上最全的 Python 学习资料无偿送给大家,PDF 电子书大合集(免费)
  4. conda修改默认环境配置及Jupyter Notebook下载和保存默认路径(笔记用)
  5. matlab中调用函数
  6. 2017百度前端技术学院习题-03
  7. macOS系统将App安装至移动硬盘的方法
  8. [内核内存] slab分配器1---slab机制详解
  9. 绿化和卸载 DOS 批处理
  10. VC HID开发笔记