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)是分布式系统需要解决的一个核心问题.分布式系统一般是由多个地位相等的节点组成,各个节点之间的交互就好比几个人聚在一起讨论问题.让 ...
随机推荐
- 华为云MVP熊保松谈物联网开发:华为云IoT是首选,小熊派是神器
摘要:在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间,也得乘风破浪跟上新技术的节奏. 在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间 ...
- 通过源码学习@functools.lru_cache
一.前言 通常在一些代码中包含了重复运算,而这些重复运算会大大增加代码运行所耗费的时间,比如使用递归实现斐波那契数列. 举个例子,当求 fibonacci(5) 时,需要求得 fibonacci(3) ...
- day13 函数入门
目录 一.什么是函数 二.为何要有函数 三.如何用函数 1.定义函数的三种形式: 形式一.无参函数(自身能干活) 形式二.有参函数(需要外部的材料来加工) 形式三.空函数(在写框架构思函数的时候) 2 ...
- LDAP注入介绍
LDAP注入介绍 一. 前言 前些日子在看 OWASP TOP 10 时看到了对LDAP注入攻击的介绍,对此产生了兴趣,在网上经过一番搜索之后找到了构成本文主要来源的资料,整理出来分享给大家. 二. ...
- Tomcat更改错误页面指向,改变404,500错误页面
在公司工作了一段时间,也被安排做了一个App,而且后台也是我来写和布置的,由于一次安全检查,需要我把tomcat默认页(管理页面)关闭,于是我只能进行默认指向变更,但是后面我又想到要是用户输入不存在的 ...
- java IO流 (五) 转换流的使用 以及编码集
转换流的使用 1.转换流涉及到的类:属于字符流InputStreamReader:将一个字节的输入流转换为字符的输入流解码:字节.字节数组 --->字符数组.字符串 OutputStreamWr ...
- 爬虫页面解析 lxml 简单教程
一.与字符串的相互转换 1.字符串转变为etree 对象 import lxml.html tree = lxml.html.fromstring(content) # content 字符串对象 2 ...
- redis(十一):Redis 列表(List) (python)
# -*- coding: utf-8 -*- import redis r =redis.Redis(host="123.156.74.190",port=6379,passwo ...
- 性能测试必备知识(4)- 使用 stress 和 sysstat
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html stress 介绍 Linux 系统压力测试 ...
- C++语法小记---自己实现Thread类
自己实现Thread类 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 参考:https://b ...