Raft
KitDB官方提供了Raft协议的插件。此Raft协插件基于蚂蚁金服开源的生产级Raft协议-Jraft
更详细的使用方式和示例可见 DEMO-KitDelay
使用
GET IT
<dependency>
<groupId>top.thinkin.kitdb</groupId>
<artifactId>raft</artifactId>
<version>VERSION</version>
</dependency>
VERSION是Maven Central的最新版本号。您还可以在此图像上找到当前版本:
准备
应准备至少三台节点例如: 192.168.0.2,192.168.0.3,192.168.0.4每台主机上,需要准备raft相关文件存储的目录,并保证程序对相关目录的操作权限
集群配置-GroupConfig
参数 | 说明 | 示例 |
---|---|---|
electionTimeoutMs | 节点超时时间(毫秒),默认1000 | 1000 |
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节点
// 创建KitDB
DB db = DB.build("/data/kitdb");
//创建集群配置
GroupConfig groupConfig = new GroupConfig();
groupConfig.setGroup("test");
groupConfig.setInitNodes("192.168.0.2:8057,192.168.0.3:8057,192.168.0.4:8057");
groupConfig.setElectionTimeoutMs(5000);
groupConfig.setSnapshotIntervalSecs(10*60);
//创建本地节点配置
NodeConfig nodeConfig = new NodeConfig();
nodeConfig.setNode("192.168.0.2:8057");
nodeConfig.setRaftDir("/data/raft");
//加载Raft
KitRaft kitRaft = new KitRaft(groupConfig, nodeConfig, db);
启动 192.168.0.2、192.168.0.3、192.168.0.4 节点,即组成了一个三节点的强制一致性KitDB集群
写操作:
// 只允许Leader节点写操作
Assert.isTrue(kitRaft.isLeader(),"not leader");
// 操作会提交到所有节点
db.getrKv().set("hello","world".getBytes());
读操作:
// 读操作不限制节点
db.getrKv().get("hello");
节点限制和可用性
加载了Raft的KitDB实例,作为集群的一个节点,会受如下限制
Leader节点可写,所有节点可读
在Raft协议下,只有Leader节点可写,读不受节点角色影响。需要以下方法判断是否是Leader
kitRaft.isLeader();
可用性
- 集群的可用节点必须大于等于50%,集群的写才是可用的
- 在leader选举期间,集群写不可用
- 读不受集群可用性的影响
节点管理
KitRaft提供了一些方法,进行集群管理