Raft协议理解
raft协议最关键的部分是领导选举和日志复制
日志复制
日志匹配原则:如果两个日志在相同索引位置的entry的任期号相同,那么这两个日志从头到这个索引位置之前完全相同。
日志匹配原则可以解释为如下两条
- 如果在不同的日志中的两个条目拥有相同的索引和任期号,那么他们存储了相同的指令。
这基于一个事实,领导者在一个任期中,在一个索引位置最多只会有一条entry
- 如果在不同的日志中的两个条目拥有相同的索引和任期号,那么他们之前的所有日志条目也全部相同。
有复制日志RPC中一致性检查保证,AppendEntriesRpc 参数携带了prevLogTerm和prevLogIndex,follower收到请求时,如果在自己的日志中找不到相同索引位置和任期号的entry就拒绝接收。
日志复制过程
- 领导者维护了nextIndex[],记录要发给每个follower的索引位置;领导者刚起来时,nextIndex赋值为最后一条entry的index + 1;
- follower收到AppendEntry请求时检查发现prevLogIndex和prevLogTerm与自己不一致,会拒绝;leader收到拒绝响应后,会减小nextIndex,并重新发送AppendEntry;
- 重复上面两步,最终会找到follower与leader entry匹配的位置,并从这个地方leader将数据复制给follower,最终达到follower与leader日志一致。
领导选举
简单说,领导选举会日志完整性最高的节点作为新的leader
怎么理解日志完整性?
论文“安全性->选举约束”里,明确规定了,新选出的leader必须包含之前所有已提交的日志,看如下两个场景:
有6个节点a ~ f
- 开始6个节点日志都是一致的,且都commit了
- leader a收到新的写,记logX, 并复制logX到其中两个follower b , c
- leader挂掉,开始新的一轮领导选举,会出现两种情形:b/c当选 or d/e/f当选,都可以
有5个节点a ~ e
同样上述场景,只会有b/c当选,d/e无法当选
如果d 尝试参选,发送自己的lastLogIndex和lastLogTerm,因为b/c的lastLogIndex都比d的大,所以不会投票给d
由这两个场景对比可知,日志完整性高,讲究的是拥有前面所有已提交的entry,并不一定要有最新的entry,最新的entry可能是新写的,只有少部分节点有
Raft协议理解的更多相关文章
- [搜狐科技]由浅入深理解Raft协议
由浅入深理解Raft协议 2017-10-16 12:12操作系统/设计 0 - Raft协议和Paxos的因缘 读过Raft论文<In Search of an Understandable ...
- 理解Raft协议
目录 1.Paxos算法存在的问题 2.Raft算法 2.1 复制状态机 2.2. Raft算法 2.2.1 安全性问题 2.2.2 Leader选举 2.2. ...
- 理解分布式一致性:Raft协议
理解分布式一致性:Raft协议 什么是分布式一致性 Leader选举 日志复制流程 term选举周期 timeout 选举和选举timeout 选举分裂 日志复制和心跳timeout 在分布式系统中, ...
- Raft协议实战之Redis Sentinel的选举Leader源码解析
这可能是我看过的写的最详细的关于redis 选举的文章了, 原文链接 Raft协议是用来解决分布式系统一致性问题的协议,在很长一段时间,Paxos被认为是解决分布式系统一致性的代名词.但是Paxos难 ...
- MIT-6.824 Raft协议
摘要 raft是一种比paxos容易理解的一致性算法,实现起来比paxos简单许多.本文前部分描述算法的细节,后部分尝试探讨下该算法的原理. 算法描述 raft算法之所以简单的原因之一是它将问题分解成 ...
- Raft协议学习笔记
目录 目录 1 1. 前言 1 2. 名词 1 3. 什么是分布式一致性? 3 4. Raft选举 3 4.1. 什么是Leader选举? 3 4.2. 选举的实现 4 4.3. Term和Lease ...
- Raft协议--中文论文介绍
本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...
- Paxos算法与Zookeeper分析,zab (zk)raft协议(etcd) 8. 与Galera及MySQL Group replication的比较
mit 分布式论文集 https://github.com/feixiao/Distributed-Systems wiki上描述的几种都明白了就出师了 raft 和 zab 是类似的,都是1.先选举 ...
- 从JRaft来看Raft协议实现细节
分布式系统和一致性问题 一致性问题(consensus problem)是分布式系统需要解决的一个核心问题.分布式系统一般是由多个地位相等的节点组成,各个节点之间的交互就好比几个人聚在一起讨论问题.让 ...
随机推荐
- C# 跨平台UI 技术
构建跨平台应用程序的的几种UI技术,以C# 或者其他基于.NET的 语言(诸如:Visual Basic[VB]).本文研究了三种跨平台技术,并讨论了在哪些情况下开发人员可以使用这些技术.本文使你对可 ...
- js返回上一页并刷新思路
在网上找了很多办法,比如window.history.go(-1):window.history.go(0): 试了下根本没用(不知道是不是我哪里写错了),想着在上一个页面写一个关闭页面并刷新的方法, ...
- WPF基于.Net Core
WPF基于.Net Core 因为最近.net core的热门,所以想实现一下.net core框架下的WPF项目,还是MVVM模式,下面就开始吧,简单做一个计算器吧. 使用VS2019作为开发工具 ...
- 基于web的图书管理系统设计与实现
原文链接:基于web的图书管理系统设计与实现 系统演示链接:点击这里查看演示 01 系统简述 图书管理系统就是利用计算机,结合互联网对图书进行结构化.自动化管理的一种软件,来提高对图书的管理效 ...
- JVM 专题十一:运行时数据区(六)方法区
1. 栈.堆.方法区关系交互 运行时数据区结构图: 从线程共享与否的角度来看: 2. 方法区的理解 2.1 方法区在哪里? <Java虚拟机规范>中明确说明:“尽管所有的方法区在逻辑上属于 ...
- shell专题(九):函数
9.1 系统函数 1.basename基本语法 basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字 ...
- python面试题三:Python 网络编程与并发
1 简述 OSI 七层协议. OSI七层协议模型主要是: 应用层(Application):为用户的应用程序(例如电子邮件.文件传输和终端仿真)提供网络服务. 表示层(Presentation):使用 ...
- java 面向对象(二十):类的结构:代码块
类的成员之四:代码块(初始化块)(重要性较属性.方法.构造器差一些)1.代码块的作用:用来初始化类.对象的信息2.分类:代码块要是使用修饰符,只能使用static分类:静态代码块 vs 非静态代码块3 ...
- Python之进程、线程、协程篇
本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
- C#各类集合介绍
集合(Collection)类是专门用于数据存储和检索的类.这些类提供了对栈(stack).队列(queue).列表(list)和哈希表(hash table)的支持.大多数集合类实现了相同的接口. ...