了解不深,如有不足,请指出,可以邮箱联系
关于raft的简要介绍
引入
raft系列只考虑强一致性(线性一致性):我们可以将一个该分布式系统当作一个整体,某个客户端成功执行了写操作,那么所有客户端都一定能够读出刚刚写入的值
共识算法:保证在小部分节点( <=(N-1)/2 )故障的情况下,系统仍能退外正常提供服务。共识算法通常基于状态复制机模型,也就是所有节点从一个state出发,经过同样的操作log,最终达到一致的state
共识算法的代表是paxos,而raft是paxos的变种,优点是容易理解、易于实现
raft核心问题包括:选主、日志复制、安全性。三部分共同实现了raft的共识和容错机制
选主
前言
定义:在分布式系统中选择主节点用于完成特定工作
意义:先选出一个leader,然后让leader协调所有角色,这样算法会更加简单快速
特色:相较于其他一致性算法,raft赋予了leader更大的领导力,称之为strong leader。比如入职只能从leader发往其他节点,而不能反着来。这种方式简化了日志复制的逻辑
组成
leader:所有请求的处理者。接受客户端发起的操作请求,写入本地日志后同步到其他节点
follower:从leader接收更新请求,写入本地文件
candidate:如果follower没有按时接收到leader的心跳,则发起选举,本节点由follower转变为candidate,直到选举结束
选举过程
把握关键句子:
为了避免经过同时的超时时间而同时发生选举,采用随机化定时器随机生成每个节点的超时时间
leader通过心跳机制保证地位
日志复制
每条日志包括:状态机的操作指令、唯一的整数索引值以及term号
term相同的log是由同一个leader在其任期内发送的
项目解读
代码释疑
1 | A interface{} 表示空接口,可以表示任意类型的值。所以A可以存储各种不同类型的命令 |
raft.go
该文件主要用于定义单位
结构体
ApplyMsg:向应用层提交日志/安装快照
LogEntry:日志项,包括Command和term
Raft:定义了一个raft服务器
常量
ROLE_LEADER = “Leader”
ROLE_FOLLOWER = “Follower”
ROLE_CANDIDATES = “Candidates”