package
0.0.0-20210923095818-d09112687d82
Repository: https://github.com/feitianlove/multiplepracticetaking.git
Documentation: pkg.go.dev

# README

raft协议的简单实现

实现raft的选举

  • 1、更具raft paper添加相应raft所包含的状态属性

  • 2、添加相应的自定义属性

  • 3、查找入口Make函数: 对raft结构各个成员进行初始化

  • 4、初始化完成之后准备选举

    • 填充请求参数和响应参数(论文有)
    • 遍历节点,向每个节点发送投票请求,接收请求结果与响应
    • 关闭计数器与通道
    • 遍历缓存通道,获取每一个响应中的结果
    • 统计票数,当票数超过一半,当选leader
    • 当选leader重置相关状态、发起心跳
    • 如果没有当选为leader,需要考虑当前任期的是不是最新的,通过响应的任期号进行更新
  • 5、 其他follower处理接收到的投票请求 RequestVote

    • 如果候选人的任期没有自己的大,就返回false
    • 如果 votedFor 为-1或者为 candidateId,并且候选⼈的⽇志⾄少和⾃⼰⼀样新,那么就投票给他

实现raft的日志复制

  • 1、当raft当选leader之后就可以发起一个日志复制的操作
  • 2、修改raft结构
    • 添加日志提交和日志复制的一致性检查
    • 添加一个applyCh接收日志响应
    • 添加shutdown作为中断标志
  • 3、实现日志复制
    • 实现重置函数resetOnElection
    • 填充start函数: 修改默认值、将命令以日志的方式传递给leader、更新自己的nextIndex与matchIndex、唤醒一致性检查
    • 实现一致性检查函数
  • 4、实现向每个节点发起日志复制操作
  • 5、首先实现日志请求与响应结构
  • 6、发起日志rpc请求的日志复制send函数
  • 7、接收follower的响应
  • 8、如果响应成功,更新相关数据
  • 9、更新响应的索引
  • 10、如果响应失败
    • 判断任期号
    • 然后变更leader的任期号和角色状态
    • 根据冲突编号 进行属性修改 -11、判断已经提交的日志索引,与当前最后一个被应用的日志索引大小

# Functions

No description provided by the author
the service or tester wants to create a Raft server.
No description provided by the author

# Constants

Debugging.

# Structs

日志复制请求结构.
日志复制响应结构.
as each Raft peer becomes aware that successive log entries are committed, the peer should send an ApplyMsg to the service (or tester) on the same server, via the applyCh passed to Make().
日志结构.
No description provided by the author
A Go object implementing a single Raft peer.
example RequestVote RPC arguments structure.
example RequestVote RPC reply structure.