raft协议
2020-10-30 00:46:13 12 举报
AI智能生成
Raft协议
作者其他创作
大纲/内容
介绍
Raft提供了一种在计算系统集群中分布状态机的通用方法,确保集群中的每个节点都同意一系列相同的状态转换<br>
一个Raft集群包含若干个服务器节点,通常是3个,这允许整个系统容忍1个节点的失效;<br>
CAP原则
含义: 一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)
raft支持
一致性(Consistency)
分区容错性(Partition tolerance)
开源项目
consoul
etcd
共识算法
参考
https://raft.github.io/
官方
https://github.com/klboke/raft-animation
动画
《etcd技术内幕》
术语
Candidate(候选人)
会向其他节点“拉选票”,如果得到大部分的票则成为leader,这个过程就叫做Leader选举(Leader Election)
Leader(领导者)
所有对系统的修改都会先经过leader
Follower(跟随者)
所有节点都以 follower 的状态开始。如果没收到 leader消息则会变成 candidate状态
Term(任期)
leader 当选期间的任期
选举超时
选举超时被随机分配在150毫秒至300毫秒之间,超时后节点状态会变为 Candidate 并且向其他节点发起投票
心跳超时
Leader 与 Follower 的heartbeat 时间,heartbeat 停止后会触发新一轮 Term 的选举
主要组成
节点状态
candidate(候选人)
会向其他节点“拉选票”,如果得到大部分的票则成为leader,这个过程就叫做Leader选举(Leader Election)
leader(领导者)
所有对系统的修改都会先经过leader
follower(跟随者)
所有节点都以 follower 的状态开始。如果没收到 leader消息则会变成 candidate状态
Leader election (领导选举)<br>
描述
选出 Leader 作为可操作入口
心跳机制
触发 Leader ellection
程序运行时
启动时刻
节点状态 Follower
运行中
一段时间内未收到heartbeat信息 (心跳超时)
节点状态 Candidate
得到票数大于集群节点数一半
节点状态 Leader
收到heartbeat 心跳的信息
节点状态 Follower
选举过程
开始选举时,Follower 等待选举超时(随机150ms~300ms)后转换成 Candidate 状态, 并且会给当前 Term + 1 后发起投票请求
冷知识
当某个节点要发起选举之前,需要进入一个叫 PreVote 状态。<br>在该状态下,节点会尝试连接集群的其他节点,连接达半数以上节点,才真正发起新一轮选举
多场景应对
场景一 (奇数节点)
选举超时后,Candidate 先投自己然后会并行的向其他节点请求投票,如果其他的节点(无论当前是Candidate 还是 Follower)在当前Term下未进行过投票(包括投给自己),即必须为请求节点(Candidate)进行投票,并且重置其“选举超时”
场景二 (偶数节点, 当挂一个节点)
选举超时后,Candidate 先投自己然后会并行的向其他节点请求投票,如果此时某两个节点得票相同,则会放弃当前 Term 的投票,进入下一个 Term,重新进行投票,直至某个Candidate 成为Leader
如果某个Candidate 获取的票数大于节点数的一半,即成为当前Term 的 Leader
Leader 向其他节点发送“添加条目”信息,这些消息以“心跳超时”指定的时间间隔发送, Follower 会响应每个“追加条目”的信息 (即心跳信息)并重置heartbeat超时,直到下一个 Term 选举
脑裂场景
奇数节点,通常以脑裂出两边分区来举栗子
情况一
脑裂
少数节点分区
由于该分区处于只有低于一半节点数量的分区,触发不了选举 (参考上面的 冷知识)
多数节点分区
Leader 所在分区
恢复
少数节点分区的节点会重新 Follower 原本的 Leader, 并追上丢失的日志数据
情况二
脑裂
少数节点分区
Leader 所在分区
旧 Leader (Term)
多数节点分区
由于该分区是多数节点分区,此时与Leader节点失联,所以触发选举,并且最终因为票数大于总节点数的一半,<br>所以选举成功
新 Leader (Term + 1)
恢复
由于脑裂造成了 2 个 Leader ,所以当网络恢复时,新 Leader 的 Term 比 旧 Leader 的 Term 值大,少数节点分区所在节点(旧 Leader 的分区)会全部重新变为新 Leader 的 Follower
在脑裂期间对旧Leader 进行的写操作,因为由于日志没办法复制到半数以上的节点,所以无法进行commit, 当网络恢复时,成为新 Leader 的 Follower (由于新Leader 的 Term 会比 旧 Leader的Term 值大,所以会终止任期),并回滚之前未commit的日志且重新复制 新Leader 的日志;
Log replication (日志复制)<br>
日志复制过程
选出 Leader 后,Leader 会复制自己的日志到所有的节点,通过添加条目来增长日志
客户端发送消息给 Leader, Leader 追加一个条目信息并复制到其他节点,直到多数节点响应完成,将该条目提交归档
脑裂场景
参考 Leader election的场景
代码实现
成熟项目 (研究)
https://github.com/etcd-io/etcd/tree/master/raft
样例
https://github.com/etcd-io/etcd/tree/master/contrib/raftexample
右上角三连
点赞
收藏
克隆
收藏
收藏
0 条评论
下一页