一、分布式共识协议引入

什么是分布式共识协议呢?让我们从一个简单的例子开始。

看看我们只有一个节点的系统,在这个系统中,你可以将节点想象为一个数据库系统,这个系统存储了一个值X。

我们有一个客户端(绿色圆圈)可以发送交易给这个系统。

例如客户端发送了值“8”给这个系统。我们很容易理解,由一个单独节点组成的系统要就某个值达成一致或共识很容易。

但如果我们的系统中有多个节点,应该如何达成共识呢?这就是分布式系统的共识问题,为了解决这个问题,科学家们提出了分布式共识协议。

二、Raft分布式共识协议

(一)概述

Raft是一种分布式共识协议的实现,在Raft中,一个节点可以处于三种状态中的一种:Follower、Candidate、Leader,如下图所示。

所有节点在最开始都处于Follower状态。

(二)Leader选举

Leader选举是分布式共识协议的核心功能,它是确保分布式共识协议能够有效处理外部请求的关键。

1、Leader选举之首次选举

在Raft中,有两个控制节点选举的超时机制。第一个是选举超时,这是Follower节点变为Candidate节点的时间,这个时间被随机设置为150ms~300ms之间。在一个选举超时时间周期后,Follower节点成为Candidate节点并进入一个新的选举周期,如下图所示。

Candidate节点首先给自己投一票,并将请求vote投票的Request请求发送给其他节点。

如果接受到请求的节点在这一轮中还没有投票,则为该candidate节点vote投票,并重置选举超时时间。

当Canditate节点收到大多数votes投票,它便成为Leader节点。

Leader节点开始向Follower节点发送追加条目消息,这些消息按照心跳超时的指定时间发送。

Follower节点随后响应每条追加条目信息。

这个选举期限将持续到Follower节点停止接收来自Leader节点的心跳并成为候选人为止。

2、Leader选举之重新选举

接下来我们停止leader节点(节点A)并观察一下重新选举leader的过程。

节点C从Follower变为Canditate的随机时间比节点B短,率先发起了投票,所以抢得了Leader节点。

现在,节点C成为第二轮选举期限的Leader节点。

3、Leader选举之分裂投票

需要多数投票才能保证每个任期只能选举一名领导人,如果两个节点同时成为领导人,可能会发生分裂投票。

让我们来看看分裂投票的例子。如下图所示,节点A和节点D两个节点同时成为Canditate并开始了新一轮选举,并且每个节点都先于另一个节点到达单个Follower节点,所以每个Canditate都收到了同等数量的投票,且均不超过半数节点。

每个Canditate在无法成为Leader节点后,会重新成为Follower节点,并重置竞选超时时间,该超时时间是随机的,这使得不同的节点不会总是同时成为Canditate节点,使得选出唯一Leader成为可能。

(三)日志复制Log Replication

日志复制是Raft共识算法中的另一个核心实现,它是确保所有节点能够他同步数据的关键。

一旦我们选出了领导者,我们需要将对系统的所有更改复制到所有节点。这是通过使用用于heartbeats的相同Append Entries消息来完成的。

首先客户端发送修改给leader,这个修改将被追加到leader的log中。

然后修改将随着Leader的心跳发送给Followers。

一旦大多数Follower承认它,Leader就会提交一个条目......然后提交一个响应给客户端。

随后客户端发送add 2的命令,经过Leader接收、Followers同步commit,系统的值将被更新为7。

(四)网络分区一致性

Raft甚至可以在出现网络分区时维持一致性。

现在我们在A&B、C&D&E之间增加一个分区,因为分区的存在,现在我们在不同的terms中拥有两个Leaders。

现在我们尝试增加另外一个客户端来尝试更新两个Leaders,客户端1将尝试更新Node B的值为3,node B无法复制到多数节点,因此其日志条目保持未提交状态。

另一个客户端2尝试更新Node D的值为8,这个操作将成功,因为它可以复制到多数节点。

现在我们尝试恢复网络分区,Node B将看到更高的选举term并下台,Node A&B都将回滚他们未提交的entries并同步新Leader的log。因此我们的log实现了跨集群一致性。

参考文献

[1] https://thesecretlivesofdata.com/raft/

可视化理解共识协议Raft的更多相关文章

  1. 共识协议——RAFT&PBFT

    区块链是一个没有中央权威的分布式对等系统.虽然权力下放可以防止各方的腐败行为,但是它必需要有一个可靠的共识协议来作出决策,让分散在世界各地的节点可以形成一致的意见.常见的共识算法有比特币采用的POW, ...

  2. 理解分布式一致性:Raft协议

    理解分布式一致性:Raft协议 什么是分布式一致性 Leader选举 日志复制流程 term选举周期 timeout 选举和选举timeout 选举分裂 日志复制和心跳timeout 在分布式系统中, ...

  3. 分布式一致性协议Raft原理与实例

    分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...

  4. 转载和积累系列 - 深入理解HTTP协议

    深入理解HTTP协议 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...

  5. 爬虫入门系列(一):快速理解HTTP协议

    4月份给自己挖一个爬虫系列的坑,主要涉及HTTP 协议.正则表达式.爬虫框架 Scrapy.消息队列.数据库等内容. 爬虫的基本原理是模拟浏览器进行 HTTP 请求,理解 HTTP 协议是写爬虫的必备 ...

  6. 深入理解AMQP协议

    深入理解AMQP协议 2018年10月22日 12:32:16 一剑何风情 阅读数:1941   文章目录 一.AMQP 是什么 二.AMQP模型 工作过程 深入理解 三.Exchange交换机 默认 ...

  7. 网络编程懒人入门(六):深入浅出,全面理解HTTP协议

    本文引用了自简书作者“涤生_Woo”的文章,内容有删减,感谢原作者的分享. 1.前言 HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广 ...

  8. (转存 作者未知)深入理解HTML协议

    深入理解HTML协议 http协议学 习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(Worl ...

  9. 3. 与服务器对话:理解 HTTP 协议

    0.服务器与本地交换机制 2.详解HTtp服务 (1)与服务器对话的流程 (2)Reque 请求 (3)Response 响应 200 成功 404 没有网页 (4)Get/Post区别 get查询数 ...

  10. 全面理解HTTP协议

    引言:作为一名软件工程Web专业学生,对于HTTP的熟悉掌握是必不可少的,特此做记录,打造自己的HTTP栈. URL与URI 我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么U ...

随机推荐

  1. 依赖倒置 DIP、依赖注入 DI、控制反转 IoC 和工厂模式

    1. 依赖倒置 依赖倒置原则(Dependency Inversion Principle, DIP)是 SOLID 原则中的一项,其核心思想是通过抽象解耦高层模块和低层模块,使二者都依赖于抽象而非具 ...

  2. PV、UV、VV、IP含义及计算方式

    什么是PV? PV 即 Page View,网站浏览量,指页面浏览的次数,用以衡量网站用户访问的网页数量. 用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计.一般来说,PV与来访者的数 ...

  3. Golang入门:协程(goroutine)

    goroutine goroutine 是 Go 的并发模型的核心概念.为了理解 goroutine,我们来定义几个术语.第一个是进程.进程是程序的实例,由计算机的操作系统运行.操作系统将一些资源(如 ...

  4. go map fatal error: concurrent map iteration and map write 读写锁与深度拷贝的坑

    起因 从币安实时拉取交易对的数据,这里使用了 map,用于存放每个交易对的最新价格,由于 map 并不是并发安全的所以加了读写锁. 但系统有时候还是会发生 fatal error: concurren ...

  5. halcon 入门教程(一) 预处理图像 (图像平滑,图像增强,二值化,形态学分析)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18779326 本来今天想写一下halcon深度学习教程(三)目标检测的,不过今天有显卡的那台电 ...

  6. FDMemtable如何增加一条自身复制的记录

    procedure TFrame_Bill.CopyARecord; var lAFDmemtable : TFDMemTable; begin {$REGION '增加一条复制的记录'} try l ...

  7. C# 多项目打包时如何将项目引用转为包依赖

    项目背景 最近开发一组类库,大约会有五六个项目.一个Core,加上若干面向不同产品的实现库,A/B/C/D...它们都依赖Core. 首先,我想统一版本号,这个容易,通过Directory.Build ...

  8. python Response的语法

    -- r.status_code #响应状态码 -- r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩 -- r.headers #以字典对象存储服务器响应头 ...

  9. JVM 的 TLAB(Thread-Local Allocation Buffer)是什么?

    JVM 的 TLAB(Thread-Local Allocation Buffer)是什么? TLAB(Thread-Local Allocation Buffer)简介 TLAB(Thread-Lo ...

  10. Reactjs之Vue用户0基础上手Reactjs笔记

    Reactjs之Vue用户0基础上手Reactjs笔记 - 搜栈网 (seekstack.cn)https://www.seekstack.cn/post/382