一、分布式共识协议引入

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

看看我们只有一个节点的系统,在这个系统中,你可以将节点想象为一个数据库系统,这个系统存储了一个值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. 【ABAQUS模态动力学】Material-Damping 对模态分析的影响

    先说结论,执行Frequency Step (特征值提取)时定义材料行为中的Damping 行为,对结果没有影响. 1. abaqus calculation compare 1.1 ANALYSIS ...

  2. 三分钟掌握音视频处理 | 在 Rust 中优雅地使用 FFmpeg

    前言 音视频处理看似高深莫测,但在开发中,我们或多或少都会遇到相关需求,比如视频格式转换.剪辑.添加水印.音频提取等. FFmpeg 作为行业标准,几乎无所不能,很多流行的软件(如 VLC.YouTu ...

  3. [每日算法 - 华为机试] LeetCode1160. 拼写单词

    题目入口 力扣https://leetcode.cn/problems/find-words-that-can-be-formed-by-characters/ 题目概述 给你一份『词汇表』(字符串数 ...

  4. 【Java】Java提取${}占位符并组装对应值

    目录 Java提取${}占位符并组装对应值 零.起因 壹.想法 贰.实现 叁.总结 肆.参考文档 Java提取${}占位符并组装对应值 实现了一个${}装配工~ 零.起因 最近写个JavaWeb项目, ...

  5. 【C#】SuperSocket配置启动UDP服务器

    SuperSocket配置UDP服务器 零.需求 两个设备局域网联机,需要用广播自动搜寻,而SuperSocket1.6的默认AppServer使用的是TCP,但只有UDP才支持广播. 一.解决 推荐 ...

  6. MySqlDataAdapter.Fill() 报异常‘给定关键字不在字典中’的解决方案

    MySqlDataAdapter.Fill() 报异常'给定关键字不在字典中'的解决方案 解决办法 升级依赖库 后来发现居然是MySql.Data.dll文件版本问题,我开始使用的是6.2.1.0版本 ...

  7. 离线版nRF Connect for Desktop安装方法

    首先确保两台电脑都安装了nRF Connect for Desktop 先在一台能连网的电脑上安装自己想要的App 然后把APP拷贝到没有网的电脑上 从%USERPROFILE%\.nrfconnec ...

  8. 应用引入LLM实践

    LLM最近在各行各业遍地开花,产生了很好的效果,也落地了很多好的功能应用. 无论是从实际应用角度,还是从营销角度,我们都需要接入大模型能力. 拿国内比较火的Deepseek来说,具有良好的推理能力,可 ...

  9. HTB-UnderPass

    该靶机nmap扫描udp发现161端口snmp服务,利用snmpwalk扫描得到目录信息,使用dirsearch扫描得到一个yml文件,存放数据库账号密码,记录下来,此时需要登录口,使用字典扫描拼接/ ...

  10. 使用Python对理想气体进行建模

    引言 在日常生活中,我们常常听到"气体",但你是否知道气体的行为是如何被科学家们用数学模型描述的呢?今天,我们就来聊聊如何用 Python 对理想气体进行建模,帮助大家更好地理解气 ...