Raft 是什么
⚫ Raft 提供了一种在计算系统集群中分布状态机的通用方法,确保集群中的每个节点 都同意一系列相同的状态转换
⚫ 它有许多开源参考实现,具有 Go,C ++,Java 和 Scala 中的完整规范实现
⚫ 一个 Raft 集群包含若干个服务器节点,通常是 5 个,这允许整个系统容忍 2 个节 点的失效,每个节点处于以下三种状态之一
◼follower(跟随者) :所有节点都以 follower 的状态开始。如果没收到 leader 消息则会变成 candidate 状态
◼candidate(候选人):会向其他节点“拉选票”,如果得到大部分的票则成为 leader,这个过程就叫做 Leader 选举(Leader Election)
◼leader(领导者):所有对系统的修改都会先经过 leader
⚫ Raft 通过选出一个 leader 来简化日志副本的管理,例如,日志项(log entry)只允许
从 leader 流向 follower
⚫ 基于 leader 的方法,Raft 算法可以分解成三个子问题
◼Leader election (领导选举):原来的 leader 挂掉后,必须选出一个新的 leader
◼Log replication (日志复制):leader 从客户端接收日志,并复制到整个集群中
◼Safety (安全性):如果有任意的 server 将日志项回放到状态机中了,那么其他 的 server 只会回放相同的日志项
//模拟三节点的分布式选举
//定义常量3
const raftCount = 3
//声明leader对象
type Leader struct {
//任期
Term int
//领导编号
LeaderId int
}
//创建存储leader的对象
//最初任期为0,-1代表没编号
var leader = Leader{0, -1}
//声明raft节点类型
type Raft struct {
//锁
mu sync.Mutex
//节点编号
me int
//当前任期
currentTerm int
//为哪个节点投票
votedFor int
//当前节点状态
//0 follower 1 candidat