raft协议
2020-10-30 00:46:13 12 举报
AI智能生成
Raft协议
作者其他创作
大纲/内容
介绍
Raft提供了一种在计算系统集群中分布状态机的通用方法,确保集群中的每个节点都同意一系列相同的状态转换
一个Raft集群包含若干个服务器节点,通常是3个,这允许整个系统容忍1个节点的失效;
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 (领导选举)
描述
选出 Leader 作为可操作入口
心跳机制
触发 Leader ellection
程序运行时
启动时刻
节点状态 Follower
运行中
一段时间内未收到heartbeat信息 (心跳超时)
节点状态 Candidate
得到票数大于集群节点数一半
节点状态 Leader
收到heartbeat 心跳的信息
节点状态 Follower
选举过程
开始选举时,Follower 等待选举超时(随机150ms~300ms)后转换成 Candidate 状态, 并且会给当前 Term + 1 后发起投票请求
冷知识
当某个节点要发起选举之前,需要进入一个叫 PreVote 状态。
在该状态下,节点会尝试连接集群的其他节点,连接达半数以上节点,才真正发起新一轮选举
在该状态下,节点会尝试连接集群的其他节点,连接达半数以上节点,才真正发起新一轮选举
多场景应对
场景一 (奇数节点)
选举超时后,Candidate 先投自己然后会并行的向其他节点请求投票,如果其他的节点(无论当前是Candidate 还是 Follower)在当前Term下未进行过投票(包括投给自己),即必须为请求节点(Candidate)进行投票,并且重置其“选举超时”
场景二 (偶数节点, 当挂一个节点)
选举超时后,Candidate 先投自己然后会并行的向其他节点请求投票,如果此时某两个节点得票相同,则会放弃当前 Term 的投票,进入下一个 Term,重新进行投票,直至某个Candidate 成为Leader
如果某个Candidate 获取的票数大于节点数的一半,即成为当前Term 的 Leader
Leader 向其他节点发送“添加条目”信息,这些消息以“心跳超时”指定的时间间隔发送, Follower 会响应每个“追加条目”的信息 (即心跳信息)并重置heartbeat超时,直到下一个 Term 选举
脑裂场景
奇数节点,通常以脑裂出两边分区来举栗子
情况一
脑裂
少数节点分区
由于该分区处于只有低于一半节点数量的分区,触发不了选举 (参考上面的 冷知识)
多数节点分区
Leader 所在分区
恢复
少数节点分区的节点会重新 Follower 原本的 Leader, 并追上丢失的日志数据
情况二
脑裂
少数节点分区
Leader 所在分区
旧 Leader (Term)
多数节点分区
由于该分区是多数节点分区,此时与Leader节点失联,所以触发选举,并且最终因为票数大于总节点数的一半,
所以选举成功
所以选举成功
新 Leader (Term + 1)
恢复
由于脑裂造成了 2 个 Leader ,所以当网络恢复时,新 Leader 的 Term 比 旧 Leader 的 Term 值大,少数节点分区所在节点(旧 Leader 的分区)会全部重新变为新 Leader 的 Follower
在脑裂期间对旧Leader 进行的写操作,因为由于日志没办法复制到半数以上的节点,所以无法进行commit, 当网络恢复时,成为新 Leader 的 Follower (由于新Leader 的 Term 会比 旧 Leader的Term 值大,所以会终止任期),并回滚之前未commit的日志且重新复制 新Leader 的日志;
Log replication (日志复制)
日志复制过程
选出 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 条评论
下一页