0%

开源学习go-raft

了解不深,如有不足,请指出,可以邮箱联系

关于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
2
3
A interface{} 表示空接口,可以表示任意类型的值。所以A可以存储各种不同类型的命令


raft.go

该文件主要用于定义单位

结构体

ApplyMsg:向应用层提交日志/安装快照

LogEntry:日志项,包括Command和term

Raft:定义了一个raft服务器

常量

ROLE_LEADER = “Leader”

ROLE_FOLLOWER = “Follower”

ROLE_CANDIDATES = “Candidates”

commit.go

资料来源

https://github.com/owenliang/go-raft

深度解析 Raft 分布式一致性协议 - 掘金 (juejin.cn)

欢迎关注我的其它发布渠道