Raft

KitDB官方提供了Raft协议的插件。此Raft协插件基于蚂蚁金服开源的生产级Raft协议-Jraft

更详细的使用方式和示例可见 DEMO-KitDelay

使用

GET IT

  1. <dependency>
  2. <groupId>top.thinkin.kitdb</groupId>
  3. <artifactId>raft</artifactId>
  4. <version>VERSION</version>
  5. </dependency>

VERSION是Maven Central的最新版本号。您还可以在此图像上找到当前版本:Maven Central

准备

应准备至少三台节点例如: 192.168.0.2,192.168.0.3,192.168.0.4每台主机上,需要准备raft相关文件存储的目录,并保证程序对相关目录的操作权限

集群配置-GroupConfig

参数说明示例
electionTimeoutMs节点超时时间(毫秒),默认10001000
snapshotIntervalSecs自动 Snapshot 间隔时间(秒),默认3600默认3600
group组名称test
initNodes初始节点配置,由节点IP+端口组成,端口可以随意自定义192.168.0.2:8057,192.168.0.3:8057,192.168.0.4:8057

本地节点配置-NodeConfig

参数说明示例
raftDir本节点的raft数据目录/data/raft
node本节点配置,由个IP+端口组成192.168.0.2:8057

启动

只需创建KitDB实例,并与集群配置和本地节点配置一起加载Raft插件,即可启动一个KitDB-Raft节点

  1. // 创建KitDB
  2. DB db = DB.build("/data/kitdb");
  3. //创建集群配置
  4. GroupConfig groupConfig = new GroupConfig();
  5. groupConfig.setGroup("test");
  6. groupConfig.setInitNodes("192.168.0.2:8057,192.168.0.3:8057,192.168.0.4:8057");
  7. groupConfig.setElectionTimeoutMs(5000);
  8. groupConfig.setSnapshotIntervalSecs(10*60);
  9. //创建本地节点配置
  10. NodeConfig nodeConfig = new NodeConfig();
  11. nodeConfig.setNode("192.168.0.2:8057");
  12. nodeConfig.setRaftDir("/data/raft");
  13. //加载Raft
  14. KitRaft kitRaft = new KitRaft(groupConfig, nodeConfig, db);

启动 192.168.0.2、192.168.0.3、192.168.0.4 节点,即组成了一个三节点的强制一致性KitDB集群

写操作:

  1. // 只允许Leader节点写操作
  2. Assert.isTrue(kitRaft.isLeader(),"not leader");
  3. // 操作会提交到所有节点
  4. db.getrKv().set("hello","world".getBytes());

读操作:

  1. // 读操作不限制节点
  2. db.getrKv().get("hello");

节点限制和可用性

加载了Raft的KitDB实例,作为集群的一个节点,会受如下限制

Leader节点可写,所有节点可读

在Raft协议下,只有Leader节点可写,读不受节点角色影响。需要以下方法判断是否是Leader

  1. kitRaft.isLeader();

可用性

  • 集群的可用节点必须大于等于50%,集群的写才是可用的
  • 在leader选举期间,集群写不可用
  • 读不受集群可用性的影响

节点管理

KitRaft提供了一些方法,进行集群管理

可以在所有节点执行的方法

getLeader - 获取Leader

isLeader - 判断是否是leader

getLeaderIP - 获取Leader的IP

只能在Leader节点执行的方法

addNode - 向集群中添加节点

removeNode - 移除集群中的节点

transferLeader - 转换Leader

getNodes - 获取节点列表

getAliveNodes - 获取可用节点列表