首页 > 编程语言 >Raft 共识算法

Raft 共识算法

时间:2022-09-30 19:56:10浏览次数:72  
标签:term candidate 记录 server 索引 算法 共识 Raft leader

转载请注明出处:https://www.cnblogs.com/morningli/p/16745294.html

raft是一种管理复制日志的算法,raft可以分解成三个相对独立的子问题:

  • 选主(Leader election):原有的leader故障后需要选举一个新的leader。
  • 复制(Log replication): leader必须接受client发送的记录(log entries)然后复制到集群中其他节点,并强制要求其他节点的日志和自己保持一致。
  • 安全(Safety):raft安全的关键是状态机安全:如果存在server将一个特定的记录应用到状态机中,不存在另外一个server在相同的日志索引上应用的是不同的命令。

算法组成

状态

  • 所有server上的持久性状态(在回应PRC之前更新到稳定存储(stable storage))
    • currentTerm:已知的最新的任期(term)(初始化为0,单调递增)
    • votedFor:当前任期内接受投票的candidateId(如果没有为null)
    • log[]:记录(log entries);每个记录包含应用到状态机的命令以及leader接收该记录时的任期
  • 所有server上的易变的状态
    • commitIndex:已知已经提交的最高的记录索引(初始化为0,单调递增)
    • lastApplied:已经应用到状态机的最高的记录索引(初始化为0,单调递增)
  • leader上的易变的状态(选举后重新初始化)
    • nextIndex[]:对于每个server,需要发送到这个server的下一条记录的索引(初始化为leader的最新的记录索引+1)
    • matchIndex[]:对于每个server,已知已经复制到这个server的最高的记录索引(初始化为0,单调递增)

AppendEntries RPC(leader调用来复制日志,也会被用作心跳)

  • 参数
    • term:leader的任期
    • leaderId:follower用来重定向客户端
    • prevLogIndex:新记录前一个记录的索引
    • prevLogTerm:prevLogIndex记录的任期
    • entries[]:需要存储的记录(心跳传空,为了提高效率可能会发送多个)
    • leaderCommit:leader的commitIndex
  • 返回
    • term:currentTerm,给leader更新自己的任期
    • success:如果follower包含匹配prevLogIndex和prevLogTerm的记录返回true
  • 接收者实现
    1. term < currentTerm 返回false
    2. prevLogTerm匹配但是找不到匹配prevLogIndex的记录返回false
    3. 如果已经存在的记录与其中一个新记录(index相同但是term不同)冲突,删除存在的这条记录以及后面的所有记录
    4. 添加不存在的新的记录到后面
    5. 如果leaderCommit > commitIndex,设置commitIndex = min(leaderCommit, 最新的记录索引)

RequestVote RPC(被candidate调用来收集选票)

  • 参数
    • term:candidate的任期
    • candidateId:请求投票的candidate
    • lastLogIndex:candidate最新的记录索引
    • lastLogTerm:candidate最新的记录任期
  • 返回
    • term:currentTerm,给candidate更新自己的任期
    • voteGranted:true表示candidate收到投票
  • 接收者实现
    1. term < currentTerm 返回 false
    2. 如果votedFor是null或者candidateId,并且candidate的日志至少和自己一样新,那么就投票给他

server 需遵守的规则

  • 所有server
    • 如果commitIndex > lastApplied:lastApplied自增,将log[lastApplied]应用到状态机中
    • 如果RPC请求或者返回包含term T > currentTerm: 设置currentTerm = T,并切换为follower
  • follower
    • 响应candidate和leader的RPC
    • 如果选举定时器超时没有收到当前leader的AppendEntries RPC或者没有向candidate投票:转换为candidate
  • candidate
    • 在转变成candidate后就立即开始选举过程
      • 自增currentTerm
      • 投票给自己
      • 重置选举定时器
      • 发送RequestVote RPC给所有其他server
    • 如果接收到大多数server的投票:成为leader
    • 如果接收到新leader发出的AppendEntries RPC:成为follower
    • 如果举定时器超时:开始新一轮选举
  • leader
    • 一旦成为领导人:发送第一个AppendEntries RPC(心跳)给每一个server;空闲时间重复发送防止选举定时器超时
    • 如果接收到客户端的命令:添加记录到本地日志后面,在完全应用到状态机后再响应客户端
    • 如果最新的记录索引 >= 某个follower的nextIndex:发送AppendEntries RPC,包含了从nextIndex开始的记录
      • 如果成功:更新follower的nextIndex和matchIndex
      • 如果因为日志不一致导致的失败:自减nextIndex并重试
    • 如果存在N > commitIndex,大多数的matchIndex[i] ≥ N并且log[N].term == currentTerm:设置commitIndex = N

算法不变量

  • Election Safety:每个任期足以多只有一个leader被选举出来
  • Leader Append-Only:leader不会覆盖或者删除自己的日志的记录;他只会在后面添加新的记录
  • Log Matching:如果两个日志包含一个相同索引和任期的记录,那么我们认为这个索引的记录以及之前的记录的内容完全一致
  • Leader Completeness:如果一个记录在一个任期内被提交,那么更高任期的leader的日志都会包含这个记录
  • State Machine Safety:如果一个server应用了一个给定索引的记录到状态机,不存在其他server在相同的索引位置应用不同的记录

参考:
https://github.com/maemual/raft-zh_cn

标签:term,candidate,记录,server,索引,算法,共识,Raft,leader
From: https://www.cnblogs.com/morningli/p/16745294.html

相关文章

  • 通关基本算法 day_10 -- 区间合并
    区间合并给我们很多很多区间,这两个区间有交集,我们合并成一个区间例如[1,9]和[3,13]可以合并为[1,13]原理按所有区间的左端点排序扫描整个区间,把所有可能有交点......
  • 求100以内的素数,简单算法
    算法思路:将1-100的数进行标识,从2开始求其2倍,则该数为合数,将标识置1;则依次向后进行,最后标识为0的数,即为素数。constintn=100;intisprim[n+1]={0};//每位数......
  • 【CV算法理解】SORT(Simple Online and Realtime Tracking)跟踪算法理解
      SORT 是一种简单的在线实时多目标跟踪算法。文章要点为:以IoU作为前后帧间目标关系度量指标;利用卡尔曼滤波器预测当前位置;通过匈牙利算法关联检测框到目标;应......
  • 【ML算法基础】马氏距离
       直观解释(x−μ)(\bold{x}-\bold{\mu})(x−μ)本质上是向量与平均值的距离。然后,将其除以协方差矩阵(或乘以协方差矩阵的逆数)。这实际上是多元变量的常规标......
  • 【CV算法基础】直方图的定义与扩展
    前言直方图、直方图归一化、直方图均衡化,使用情况,优缺点;图像增强;全局、局部增强;直方图离散函数,图像中每个灰度级的像素个数;归一化直方图图像中每个灰度级发生的概率估......
  • Windows Server 服务器漏洞:OpenSSL 信息泄露漏洞(CVE-2016-2183)和 OpenSSL弱加密算法
    一、更新openssl版本这个漏洞我目前了解到是直接使用系统自带版本,版本过低引起的弱加密信息泄露,直接更新。更新会同时把标题两个漏洞都补上先下载一波安装包: http://sl......
  • 字节笔试算法题
    题目1给定一个字符串,进行以下操作:三个同样的字母连在一起,去掉一个:比如helllo->hello两对一样的字母(AABB型)连在一起,去掉第二对的一个字母:比如helloo->hello上面......
  • AM5728 Opencl 案例汇总:实现sobel算法,计算向量和,矩阵转置
    案例一:实现sobel算法OpenCV(Open Source Computer Vision Library)是一个基于BSD许可开源发行的跨平台计算机视觉库。实现图像处理和计算机视觉方面的很多通用计算。......
  • 算法判断矩形和圆形相交 OBB & Circle
        转自:https://www.zhihu.com/question/24251545......
  • 算法练习-第八天【字符串】
    字符串344.反转字符串参考:代码随想录344.反转字符串思考题目要求在原地反转字符串,既然是原地反转那么可以第一时间想到双指针,一个指针指向头部,一个指向尾部,互换元素。......