0D1Lee0 / Raft-KV

基于 Raft 共识算法的 K-V 数据库

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Raft-KV

基于 Raft 共识算法的 K-V 数据库,具备线性一致性和分区容错性,在少于半数节点发生故障时仍可正常对外提供服务

特性

心跳与选举

  1. 利用定时线程池触发心跳与选举任务。
  2. 领导者节点通过心跳信号(RPC 调用)维护集群的日志提交状态
  3. 领导者发生故障时(心跳信号中断)集群自动选出日志最完整的节点当选下任领导者,保持系统整体可用。

日志读写与提交

  1. 由领导者节点处理客户端的读写请求。
  2. 收到读请求时返回最新的已提交数据。
  3. 收到写请求时,将日志复制至跟随者节点,等待超过半数节点复制成功后提交日志、应用命令至状态机并返回响应给客户端。

线性一致性

  1. 通过“读等待”机制进一步保证在系统发生网络分区时仍然满足线性一致性。
  2. 收到读请求时,领导者等待跟随者的心跳响应,如果得到多数派的正常响应,说明当前节点在发出心跳时依然是集群的合法领导者,可以直接返回数据给客户端。

客户端协议

  1. 在客户端协议中加入由 ip 和请求序号组成的“请求id”。具有相同 id 的请求只会被 raft 集群处理一次,以此保证幂等性。
  2. 跟随者节点收到客户端请求时,回复“重定向”响应。客户端将连接至响应报文提供的地址进行重试。
  3. 客户端请求超时后(节点故障),将连接 raft 集群的另一个节点并重试。

运行说明

  1. 在 VM 参数中配置节点端口号,如 -Dserver.port=8775
  2. 在 8775、8776、8777、8778 端口下运行 RaftNodeBootStrap
  3. 启动客户端 RaftClientRaftClientAuto 进行调试和验证

About

基于 Raft 共识算法的 K-V 数据库


Languages

Language:Java 100.0%