分布式一致性协议:Raft协议
文章目录
- 1. Raft协议
- ①:Leader选举
- ②:集群节点数据同步
- ③:发生网络分区,出现脑裂如何处理?
1. Raft协议
Raft协议动态演示图
nacos
的CP
架构是通过Raft
协议来实现的,Raft
协议和ZAB
协议都是分布式一致性协议的实现,两者很类似,主要包括两部分:
- Leader选举(半数以上节点投票同意)
- 集群节点写入数据同步(两阶段提交,半数以上节点写入成功)
①:Leader选举
集群中各节点有三种状态可以切换:跟随者(Follower
)、领导者(Leader
)、候选者(Candidater
)
在进行leader选举时,所有的节点都从跟随者(
Follower
)状态开始
这些跟随者(
Follower
)如果没有收到其他leader
的心跳,那么他们会变成候选者(Candidater
)状态
当然,跟随者(
Follower
)在成为候选者(Candidater
)状态时,并不是只要没接收到Leader
心跳就会变换状态,这样是不合理的! Raft协议规定了Follower
成为Candidater
之前所等待的时间被随机分配在150
毫秒至300
毫秒之间,尽可能的避免多个节点同时发起投票,造成多节点选票一致的情况。如果出现了多节点选票一致的情况,那么此次选举作废,重新随机分配等待时间,重新发起选举,直到选举成功!
变成候选者(
Candidater
)的B节点开始向其他节点开始发起投票!
其他节点在接收到B节点的投票请求时,分别给B投一票,并重新为自己随机分配一个
150 - 300毫秒
的选举时间!
B节点获取了大于集群节点一半的选票,变成了领导者
Leader
后续B作为
Leader
会给其他节点发送心跳验证节点存活、同步数据。其他节点接受心跳后会重置变成候选者(Candidater
)状态的时间。
如果B节点宕机,A、C节点会通过
150 - 300毫秒
的随机时间后变为候选者(Candidater
)节点,并在AC中选举新的Leader
节点!由于C节点收到了A和C(自身)节点的选票,同时2 > 1.5
,所以C变为新的Leader
!
②:集群节点数据同步
首先客户端集群写数据时,只能向
Leader
节点中写当
Leader
接收到数据时,并不是马上在Leader
节点内部保存数据,并给客户端回应。而是把数据传输给其他节点。其他节点接收到数据后给
Leader
返回响应,Leader
接收到大多数(可配置,一般为半数以上)Flower
节点的响应后,数据才在Leader
节点提交,写入Leader
节点内部,并响应给客户端写数据成功!
Leader
响应给客户端写数据成功,然后再通过心跳把数据更新到其他Flower
节点下
③:发生网络分区,出现脑裂如何处理?
- 当多个节点发生了网络分区,就会出现多个
Leader
,也就是俗称的脑裂
现象!
- 由于
Raft
协议规定:更新数据时Leader
要与Flower
节点通信,且必须收到大多数(默认半数)节点的响应才能更新数据成功,下图由于网络分区把5
个节点的集群变成了两个分区,分区之间无法通信:- B节点作为
Leader
在他自己的分区内最多接受1个节点响应,1=1(半数)
,并没有大于半数1
,所以无法更新数据,进而无法给客户端更新成功的响应,可以无法对外提供服务,该分区不可用! - 而C节点作为
Leader
在他自己的分区内可以接受2个节点响应,2>1.5(半数)
,大于半数节点1.5
,所以在当前分区内可以正常更新数据,正常给客户端发送成功的响应! - 通过这个半数机制,保证即使发生了脑裂,也能保证数据的一致性!
- B节点作为
- 当网络分区恢复后,
Leader
节点B由于看到Leader
节点C拥有更多的选票,就把自己的Leader
身份下掉,变为Leader
节点C的Flower
节点!并回滚自己之前未提交的数据SET 3
。然后通过心跳从Leader
节点C同步最新的数据!
分布式一致性协议:Raft协议相关推荐
- [分布式一致性协议] ------ raft协议的解释与理解
前言 在分布式系统中,为了保证容错性,一般会维护多个副本集群,提高系统的高可用,但与之带来的问题就是多个副本的一致性(consensus)问题. 我们认为,对于一个具有一致性的的集群中,同一时刻所有节 ...
- 分布式一致性之raft算法
文章目录 一句话简介ratf算法 分布式一致性的难点 CAP理论 分布式一致性:Raft算法 选举过程 新官上任 根正苗红 仍需努力 一句话简介ratf算法 没听过不要紧,我原先也没听过. Raft ...
- 分布式一致性算法Raft简介(上)
最近看了Ongaro在2014年的博士论文<CONSENSUS: BRIDGING THEORY AND PRACTICE>的部分章节,对raft有了初步的理解.其中论文中提到用于教学的u ...
- 分布式一致性算法Raft原理图释
什么是分布式一致性算法Raft 分布式一致性算法Raft:指在分布式场景下实现集群数据同步的解决方案 掌握了这个算法,就可以较容易地处理绝大部分场景的容错和数据一致性需求 Raft三大角色 跟随者(F ...
- 分布式一致性算法Raft
导语 | 对于很多工程人员来说,Paxos算法不容易理解和落地实现.因此斯坦福学者提出了一个更易理解和实现的共识算法Raft.本文主要介绍Raft的基本原理.算法流程以及和Paxos的区别. 一.Ra ...
- 分布式一致性算法Raft简介(下)
slide 15: 这一节开始讲leader changes,即leader的变更过程中如何保证log的一致性: 1)需要明白的是,新leader上任后,各个server的log状态很可能是不一致的: ...
- 浅谈分布式一致性:Raft 与 SOFAJRaft
简介: SOFAJRaft已开源 作者 | 家纯 来源 | 阿里技术公众号 一 分布式共识算法 (Consensus Algorithm) 1 如何理解分布式共识? 多个参与者针对某一件事达成完全一致 ...
- 【Raft】分布式一致性算法Raft和zab、paxos
目录 前言 Raft算法 Raft动画教程 Raft手动设置模拟 Raft协议说明 Raft和zab区别 paxos算法 前言 开发面试Zookeeper肯定要问,Zab协议逃不掉,那么和 Raft ...
- 浅谈分布式一致性算法raft
前言:在分布式的系统中,存在很多的节点,节点之间如何进行协作运行.高效流转.主节点挂了怎么办.如何选主.各节点之间如何保持一致,这都是不可不面对的问题,此时raft算法应运而生,专门 用来解决上述问题 ...
- 22张图,带你入门分布式一致性算法Raft
前言 单点系统的数据是天然一致的,但为了避免单点故障问题,我们引入了分布式系统. 将数据以副本的形式保存在多个节点上,可以有效避免单点故障造成的服务不可用以及数据丢失的情况. 但如何去保证多个节点的一 ...
最新文章
- 网络表述学习经典论文——DeepWalk
- C#写的NoSQL开源项目/系统(系列)
- Kubernetes — kubectl 的基本使用
- 不错的东西: AutoMapper
- i5 11300H和i5 10300H 的区别
- TensorFlow(八)激活函数
- ubuntu安装python_ubuntu18.04下源码编译安装最新版本Python3
- php文件夹转换网页,PHP转换文件夹下所有文件的编码 适合发布网站的其他编码版本...
- 再也不怕SVN冲突:轻松解决SVN冲突
- 13产品经理要懂的-人性的恶要怎么利用
- fscanf不读取_NCNN-Breakdown(3) 读取网络的proto信息
- Python画图实战之画K线图【附带自动下载股票数据】
- 企业信息化政务信息化浙里办
- 请你相信心有多大,舞台就会有多大
- 佩服的一个阿里 P9 大佬,离职了...
- Canvas绘制抽奖转盘
- czl蒻蒟的OI之路8
- VLAN trunk扩展 MUXVLAN 原理与实验
- 企业名称登记管理规定
- oracle数据库scn是什么
热门文章
- win10安装python3_win10 64位肿么安装python3.x
- aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...
- js正则匹配闭合标签_我从Vue源码中学到的一些JS编程技巧
- JS实现前端动态分页码
- webstorm vue代码修改后不更新问题
- 纷享逍客宣布完成E+轮融资 长山兴资本领投
- LoadRunner解决“服务器正在运行中”方法
- MySQL到MsSQL的迁移工具——SSMA
- ubuntu 10.04 CTS 环境搭建
- 如何将sinaweibo demo project 加入到 Three20UI中