/raft

the raft for java.(分布式一致性协议 raft java 版本实现,分布式的基石)

Primary LanguageJavaApache License 2.0Apache-2.0

raft

raft raft 算法的基本 java 实现。

Maven Central Open Source Love

如果有一些疑难杂症,可以加入:技术交流群

创作目的

大家好,我是老马。

主要是为了学习一下 raft,天天听别人吹牛听烦了。

用了很久也不懂,就学习一下。

特性

  • leader 选举
  • 日志复制
  • 成员变更
  • 日志压缩

变更日志

CHANGE_LOG.md

入门

quick start

🔥🔥🔥🔥🔥 注意:该项目仅支持 oracle jdk8 启动。

🔴🔴🔴🔴🔴 注意:idea 需要安装 lombok 插件。

验证 "leader 选举"

  1. 启动RaftBootstrapTest1、RaftBootstrapTest2、RaftBootstrapTest3、RaftBootstrapTest4、RaftBootstrapTest5
  2. 依次启动 5 个 RaftNodeBootStrap 节点, 端口分别是 8775,8776, 8777, 8778, 8779.
  3. 观察控制台, 约 6 秒后, 会发生选举事件,此时,会产生一个 leader. 而 leader 会立刻发送心跳维持自己的地位.
  4. 如果leader 的端口是 8775, 使用 idea 关闭 8775 端口,模拟节点挂掉, 大约 15 秒后, 会重新开始选举, 并且会在剩余的 4 个节点中,产生一个新的 leader. 并开始发送心跳日志。

验证"日志复制"

正常状态下
  1. 启动RaftBootstrapTest1、RaftBootstrapTest2、RaftBootstrapTest3、RaftBootstrapTest4、RaftBootstrapTest5
  2. 依次启动 5 个 RaftNodeBootStrap 节点, 端口分别是 8775,8776, 8777, 8778, 8779.
  3. 使用客户端写入 kv 数据.
  4. 杀掉所有节点, 使用 junit test 读取每个 rocksDB 的值, 验证每个节点的数据是否一致.
非正常状态下
  1. 启动RaftBootstrapTest1、RaftBootstrapTest2、RaftBootstrapTest3、RaftBootstrapTest4、RaftBootstrapTest5
  2. 依次启动 5 个 RaftNodeBootStrap 节点, 端口分别是 8775,8776, 8777, 8778, 8779.
  3. 使用客户端写入 kv 数据.
  4. 杀掉 leader (假设是 8775).
  5. 再次写入数据.
  6. 重启 8775.
  7. 关闭所有节点, 读取 RocksDB 验证数据一致性.

拓展阅读

raft-07-java 如何编写一个 Raft 分布式 KV 存储 lu-raft-kv

后期 ROAD-MAP

  • 成员变更 add/remove

  • 日志压缩

  • 输出的信息优化

  • 企业级 raft + 实际使用

技术鸣谢

主要参考项目 https://github.com/stateIs0/lu-raft-kv

目前用于学习,后续希望可以拓展简化自己使用