分布式算法:Paxos Raft 两种共识算法

1. Paxos算法

Paxos算法是 Leslie Lamport(莱斯利·兰伯特)在 1990 年提出的一种分布式系统共识算法。也是第一个被证明完备的共识算法(前提是不存在恶意节点)。

1.1 简介

Paxos算法是第一个被证明完备的分布式系统共识算法。共识算法的作用是让分布式系统中的多个节点之间对某个提案(Proposal)达成一致的看法。提案的含义在分布式系统中十分宽泛,像哪一个节点是Leader节点、多个事件发生的顺序等等都可以是一个提案。

当时提出的Paxos算法主要包括两个部分:

  • Basic-Paxos算法:描述的是多节点之间如何就某个值(提案Value)达成共识。
  • Multi-Paxos算法:描述的是执行多个Basic Paxos实例,就一系列值达成共识。Multi-Paxos说白了就是执行多次Basic Paxos ,核心还是Basic Paxos。

由于Paxos算法在国际上被公认的非常难以理解和实现,因此有人不断尝试简化这一算法,到了2013年 才诞生了一个比Paxos算法更易理解和实现的共识算法--Raft算法(下文提及)。更具体一点来说,Raft是Multi-Paxos的一个变种,其简化了Multi-Paxos的思想,变的更容易被理解以及工程实现。

针对没有恶意节点的情况,除了Raft算法之外,当前最常用的一些共识算法比如ZAB协议、Fast Paxos算法都是基于Paxos算法改进的。

在分布式系统中应对潜在恶意节点的攻击,区块链技术通常采用工作量证明(PoW,Proof-of-Work)和权益证明(PoS,Proof-of-Stake)等共识算法作为核心防御机制。以以太坊为例,这个全球第二大区块链平台在2022年完成了具有里程碑意义的共识机制转型——通过"合并"(The Merge)升级,其底层协议从能源消耗较高的工作量证明机制,正式切换为更节能环保的权益证明机制。这次技术跃迁不仅大幅降低了网络能耗,也为区块链的可扩展性提升开辟了新路径。

区块链系统使用的共识算法需要解决的核心问题是拜占庭将军问题,这和我们日常接触到的ZooKeeper、Ectd、Consul等分布式中间件不太一样。

1.2 Basic Paxos算法

Basic Paxos算法中存在3个重要角色:

1.提议者(Proposer):也可以叫做协调者(coordinator),提议者负责接收客户端的请求并发起提案。提案信息通常包括提案编号(coodinator),提议者负责接收客户端的请求并发起提案。

2.接受者(Accepter):也可以叫做投票员(voter),负责对提议者的提案进行投票,同时需要记住自己的投票历史;

3.学习者(Learner):如果有超过半数接受者就某个提议达成了共识,那么学习者就需要接受这个提议,并就该提议做出运算,然后将运算结果返回给客户端。

 为了减少实现该算法所需的节点数,一个节点可以身兼多个身份。并且,一个提案被选定,需要被半数以上的Accepter接受。这样的话,Basic Paxos算法还具备容错性,在少于一半的节点出现故障时,集群仍能够正常工作。

1.3 Multi Paxos 思想

Basic Paxos算法仅能够就单个值达成共识,为了能够对一系列的值达成共识,我们需要用到Multi Paxos思想。

Multi-Paxos只是一种思想,这种思想的核心就是通过多个Basic Paxos实例就一系列值达成共识。也就是说,Basic Paxos是Multi-Paxos思想的核心,Multi-Paxos就是多执行几次Basic Paxos。

由于兰伯特提到的 Multi-Paxos 思想缺少代码实现的必要细节(比如怎么选举领导者),所以在理解和实现上比较困难。

不过,也不需要担心,我们并不需要自己实现基于 Multi-Paxos 思想的共识算法,业界已经有了比较出名的实现。像 Raft 算法就是 Multi-Paxos 的一个变种,其简化了 Multi-Paxos 的思想,变得更容易被理解以及工程实现,实际项目中可以优先考虑 Raft 算法。

2. Raft算法

2.1 简介

当今的数据中心和应用程序在高度动态的环境中运行,为了应对高度动态的环境,它们通过额外的服务器进行横向扩展,并且根据需求进行扩展和收缩。同时,服务器和网络故障也很常见。

因此,系统必须在正常操作期间处理服务器的上下线,它们必须对变故作出反应并在几秒钟内自适应,对客户来说,明显的中断通常是不可接受的。

幸运的是,分布式共识可以帮助应对这些挑战。

2.1.1 拜占庭将军

在介绍共识算法之前,先介绍一个简化版拜占庭将军的例子来帮助理解共识算法。

假设多位拜占庭将军中没有叛军,信使的信息可靠但有可能被暗杀的情况下,将军们如何达成是否要进攻的一致性决定?

解决方案大致可以理解成:在所有将军中选出一个大将军,用来做出所有决定。

举例如下:假如现在一共有 3 个将军 A,B 和 C,每个将军都有一个随机时间的倒计时器,例如A倒计时最先结束,这个将军就把自己当成大将军候选人,然后派信使传递选举投票的信息给将军 B 和 C,如果将军 B 和 C 还没有把自己当作候选人(自己的倒计时还没有结束),并且没有把选举票投给其他人,它们就会把票投给将军 A,信使回到将军 A 时,将军 A 知道自己收到了足够的票数,成为大将军。在有了大将军之后,是否需要进攻就由大将军 A 决定,然后再去派信使通知另外两个将军,自己已经成为了大将军。如果一段时间还没收到将军 B 和 C 的回复(信使可能会被暗杀),那就再重派一个信使,直到收到回复。

 2.1.2 共识算法

共识是可容错系统中的一个基本问题:即使面对故障。服务器也要在共享状态上达成一致。

共识算法允许一组节点像一个整体一样工作,即使其中的一些节点出现故障也能够继续工作下去,其正确性主要是源于复制状态机的特性:一组server的状态机计算相同状态的副本,即使有一部分的server宕机了,它们也能够正常运行。

上图是复制状态机架构

 一般通过使用复制日志来实现复制状态机。每个server存储着一份包括命令序列的日志文件,状态机会按照顺序执行这些命令,因为每个日志包含相同的命令,并且顺序也相同,所以每个状态机处理相同的命令序列。由于状态机是确定性的,所以处理相同的状态,得到相同的输出。

因此共识算法的工作就是保持复制日志的一致性。服务器上的共识模块从客户端接受命令并将它们添加到日志中。它与服务器上的共识模块通信,以确保即使某些服务器发生故障。每个日志最终包含相同顺序请求。一旦命令被正确的复制,它们就被称为已提交。每个服务器的状态机按照日志顺序处理已提交的命令,并将输出返回给客户端,因此这些服务器形成了一个单一的高度可靠的状态机。

适用于于实际系统的共识算法通常具有以下特性:

  • 安全:确保在非拜占庭条件下的安全性,包括网络延迟、分区、包丢失、复制和重新排序。
  • 高可用:只要大多数服务器都是可操作的,并且可以互相通信,也可以与客户端进行通信那么这些服务器就可以看做完全功能可用的。因此一个典型的由五台服务器组成的集群可以容忍两台服务器端故障。假设服务器因停止而发生故障;它们稍后可能会从稳定存储上的状态中恢复并重新加入集群。
  • 一致性不依赖时序。错误的时钟和极端的消息延迟,在最坏的情况下也只会造成可用性问题,而不会产生一致性问题。
  • 在集群中大部分服务器响应,命令就可以完成,不会被少数运行缓慢地服务器来影响整体系统性能。

2.2 基础

2.2.1 节点类型

一个Raft集群包括若干服务器,以典型的5服务器集群举例。在任意的时间,每个服务器一定会处于以下三个状态中的某一个:

  • Leader:负责发起心跳,响应客户端,创建日志,同步日志。
  • Candidate:Leader选举过程中的临时角色,由Follower转化而来,发起投票参与竞选。
  • Follower:接受Leader的心跳和日志同步数据,投票给Candidate。

在正常情况下,只有一个服务器是Leader,剩下的服务器是Follower。Follower是被动的,它们不会发送任何请求,只是相应来自Leader和Candidate的请求。

 

2.2.2 任期

 

raft算法将时间划分为任意长度的任期(term),任期将用连续的数字表示,看做当前term号 。

每一个任期的开始都是一次选举,在选举开始时,一个或多个Candidate会尝试成为Leader。如果一个Candidate赢得了选举,它就会在该任期内担任Leader。如果没有选出Leader,将会开启另一个任期,并立刻开始下一次选举。raft算法保证在给定的一个任期最少要有一个Leader。

每个节点都会存储当前的term号,当服务器之间进行通讯的时候会交换当前的term号;如果有服务器发现自己的rerm号比别人小,那么它会更新到较大的term值。如果一个Candidate或者Leader发现自己过期了,它会立即退化成Follower。如果一台服务器收到的请求的term号是过期的,那么它会拒绝此次请求。

2.2.3 日志
  • entry:每一个事件成为entry,只有Leader能够创建entry 。entry的内容为<term,index,cmd>其中cmd是可以应用到状态机的操作。
  • log:由entry组成的数组,每一个entry都有一个自己在log中的index。只有Leader才可以改变其他节点的Log。entry总是先被Leader添加到自己的数组中,然后再发起共识请求,获得同意后才会被Leader提交给状态机。Follower只能从Leader获取新日志和当前的commitIndex,然后把对应的entry应用到自己的状态机中。

2.3 领导人选举

raft使用心跳机制来触发leader的选举。

如果一台服务器能够收到来自Leader或者Candidate的有效信息,那么它会一直保持为Follower状态,并且刷新自己的electionElapsed,重新计时。

Leader会向所有的follower周期性的发送心跳来保证自己的Leader地位。如果一个Follower在一个周期内没有收到心跳信息,就叫做选举超时,然后它就会认为此时没有可用的Leader,并且开始进行一次选举选出新的Leader。

为了开始新的选举,Follower会自增自己的term号并且转换状态为Candidate。然后他会向所有节点发起RequestVoteRPC请求,Candidate的状态会持续到以下情况发生:

  • 赢得选举
  • 其他节点赢得选举
  • 一轮选举结束,无人胜出

赢得选举的条件是:一个Candidate在一个任期内收到了来自集群内的多数选票(超过一半),就可以成为Leader。

在Candidate等待选票的时候,它可能收到其他节点 声明自己是Leader的心跳,此时有两种情况:

  • 该Leader的term号大于等于自己的term号,说明对方已经成为Leader,则自己退化为Follower。
  • 该Leader的term号小于自己的term号,那么会拒绝请求并让该节点更新term。

由于可能同一时刻出现多个Candidate,导致没有Candidate获得大多数选票,如果没有其他手段来重新分配选票的话,那么可能会无限重复下去。

raft使用了随机的选举超时时间来避免上述情况。每一个Candidate在发起选举后,都会随机化一个新的选举超时时间,这种机制使得各个服务器能够分散开来,在大多数情况下只有一个服务器会率先超时;它会在其他服务器超时之前赢得选举。

 2.4 日志复制

一旦选出了Leader,它就开始接受客户端的请求。每一个客户端的请求都包含一条需要被复制状态机(Replicated State Machine)执行的命令。

Leader 收到客户端请求后,会生成一个 entry,包含<index,term,cmd>,再将这个 entry 添加到自己的日志末尾后,向所有的节点广播该 entry,要求其他服务器复制这条 entry。

如果 Follower 接受该 entry,则会将 entry 添加到自己的日志后面,同时返回给 Leader 同意。

如果 Leader 收到了多数的成功响应,Leader 会将这个 entry 应用到自己的状态机中,之后可以称这个 entry 是 committed 的,并且向客户端返回执行结果。

raft 保证以下两个性质:

  • 在两个日志里,有两个 entry 拥有相同的 index 和 term,那么它们一定有相同的 cmd
  • 在两个日志里,有两个 entry 拥有相同的 index 和 term,那么它们前面的 entry 也一定相同

 通过“仅有 Leader 可以生成 entry”来保证第一个性质,第二个性质需要一致性检查来进行保证。

一般情况下,Leader 和 Follower 的日志保持一致,然后,Leader 的崩溃会导致日志不一样,这样一致性检查会产生失败。Leader 通过强制 Follower 复制自己的日志来处理日志的不一致。这就意味着,在 Follower 上的冲突日志会被领导者的日志覆盖。

 Leader 给每一个Follower 维护了一个 nextIndex,它表示 Leader 将要发送给该追随者的下一条日志条目的索引。当一个 Leader 开始掌权时,它会将 nextIndex 初始化为它的最新的日志条目索引数+1。如果一个 Follower 的日志和 Leader 的不一致,AppendEntries 一致性检查会在下一次 AppendEntries RPC 时返回失败。在失败之后,Leader 会将 nextIndex 递减然后重试 AppendEntries RPC。最终 nextIndex 会达到一个 LeaderFollower 日志一致的地方。这时,AppendEntries 会返回成功,Follower 中冲突的日志条目都被移除了,并且添加所缺少的上了 Leader 的日志条目。一旦 AppendEntries 返回成功,FollowerLeader 的日志就一致了,这样的状态会保持到该任期结束。

2.5 安全性

2.5.1 选举限制

Leader 需要保证自己存储全部已经提交的日志条目。这样才可以使日志条目只有一个流向:从 Leader 流向 Follower,Leader 永远不会覆盖已经存在的日志条目。

每个 Candidate 发送 RequestVoteRPC 时,都会带上最后一个 entry 的信息。所有节点收到投票信息时,会对该 entry 进行比较,如果发现自己的更新,则拒绝投票给该 Candidate。

2.5.2 节点崩溃

如果 Leader 崩溃,集群中的节点在 electionTimeout 时间内没有收到 Leader 的心跳信息就会触发新一轮的选主,在选主期间整个集群对外是不可用的。

如果 Follower 和 Candidate 崩溃,处理方式会简单很多。之后发送给它的 RequestVoteRPC 和 AppendEntriesRPC 会失败。由于 raft 的所有请求都是幂等的,所以失败的话会无限的重试。如果崩溃恢复后,就可以收到新的请求,然后选择追加或者拒绝 entry。

 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

 2.5.3 时间性与可用性

raft 的要求之一就是安全性不依赖于时间:系统不能仅仅因为一些事件发生的比预想的快一些或者慢一些就产生错误。为了保证上述要求,最好能满足以下的时间条件:

broadcastTime << electionTimeout << MTBF

  • broadcastTime:向其他节点并发发送消息的平均响应时间;
  • electionTimeout:选举超时时间;
  • MTBF(mean time between failures):单台机器的平均健康时间

broadcastTime应该比electionTimeout小一个数量级,为的是使Leader能够持续发送心跳信息(heartbeat)来阻止Follower开始选举;

electionTimeout也要比MTBF小几个数量级,为的是使得系统稳定运行。当Leader崩溃时,大约会在整个electionTimeout的时间内不可用;我们希望这种情况仅占全部时间的很小一部分。

由于broadcastTimeMTBF是由系统决定的属性,因此需要决定electionTimeout的时间。

一般来说,broadcastTime 一般为 0.5~20ms,electionTimeout 可以设置为 10~500ms,MTBF 一般为一两个月。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39118.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day20-前端Web案例——部门管理

目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…

信创-人大金仓数据库创建

一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址&#xff1a;https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 ‌ 实例结构 ‌&#xff1a;由数据库文件和 KingbaseES 实例组成。数据…

[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1)

[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1) 解题过程 打开题目环境 看题目意思应该是让我找备份文件 备份文件一般的后缀名为 .rar .zip .7z .tar.gz .bak .swp .txt .html .bak 直接扫描一下 在url中输入/index.php.bak 弱类型比较 为弱相等&#xff0c;即当…

【嵌入式Linux】基于ArmLinux的智能垃圾分类系统项目

目录 1. 功能需求2. Python基础2.1 特点2.2 Python基础知识2.3 dict嵌套简单说明 3. C语言调用Python3.1 搭建编译环境3.2 直接调用python语句3.3 调用无参python函数3.4 调用有参python函数 4. 阿里云垃圾识别方案4.1 接入阿里云4.2 C语言调用阿里云Python接口 5. 香橙派使用摄…

css的背景

css背景属性&#xff0c;可以给页面元素添加背景样式。 一.背景颜色 二.背景图片 语法 backgroud-image &#xff1a;none || url(图像地址) 三.背景平铺 既可以添加背景颜色也可以添加背景图片&#xff0c;只不过背景图片会压住背景颜色 四.背景位置 1.方位名词 如果只指定…

macOS Sequoia 15.3 一直弹出“xx正在访问你的屏幕”

&#x1f645; 问题描述 macOS 系统升级后&#xff08;15.2或者15.3均出现过此问题&#xff09;&#xff0c;不管是截图还是开腾讯会议&#xff0c;只要跟捕捉屏幕有关&#xff0c;都一直弹出这个选项&#xff0c;而且所有软件我都允许访问屏幕了&#xff0c;这个不是询问是否…

高德终端技术总结:高可用架构如何练成?

前言 高德地图作为国民级应用&#xff0c;特别是出行场景的独特性&#xff0c;要确保在线导航高并发和交通安全级的超稳定性&#xff0c;这对技术团队提出异乎寻常的高要求&#xff0c;无论是终端、云端&#xff0c;还是“终端-云端”之间的连接&#xff0c;都必须实现“高可用…

UDP套接字编程(代码)

什么是socket套接字编程&#xff1f; 通过Ip地址 端口号这种方式定位一台主机&#xff0c;这样的方式我们就叫做socket套接字。 Udp Socket 接口介绍 这些案列我们使用的接口基本都是一样的&#xff0c;所以在这里我先把接口介绍完&#xff0c;具体的细节后面在说明。 创…

C# 调用 VITS,推理模型 将文字转wav音频net8.0 跨平台

一、系统环境 操作系统&#xff1a;win10&#xff0c;win11 运行环境&#xff1a;dotnet8 工具:命令行&#xff0c;powershell 开源库:sherpa-onnx 二、工具和源码下载 开源库:https://k2-fsa.github.io/sherpa/onnx/index.html 运行环境下载 https://dotnet.microsoft.c…

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

背景前摇&原视频教程&#xff1a; 最近看到很多同学都在用Coze平台操作数据&#xff0c;我也想了解一下工作流的搭建和数据处理过程&#xff0c;但是一下子又看不懂太复杂的逻辑&#xff0c;于是上B站搜索相关的基础教程。 Coze官方教程&#xff1a; 之前有看过Coze平台…

Certd自动化申请和部署SSL证书并配置https

服务器使用的华为云&#xff0c;之前SSL证书通过配置Cloudflare的DNS实现的&#xff0c;最近华为云备案提示需修改解析至境内华为云IP&#xff0c;若解析境外IP&#xff0c;域名无需备案&#xff0c;需注销或取消接入备案信息&#xff0c;改为使用Certd自搭建证书管理工具&…

AI基础01-文本数据采集

本篇文章是学习文本数据的采集&#xff0c;作为人工智能训练师或者数据分析师有时需要先获取数据&#xff0c;然后进行数据清洗、数据标注。很明显数据采集是后续步骤的基础。 1&#xff09;数据采集定义 数据采集&#xff1a;data acquisition&#xff0c;DAQ 又称为数据获取…

生活电子常识-deepseek-r1本地化部署+ui界面搭建

前言 deepseek-r1 14b模型&#xff0c;32b模型部署在本地电脑上也能实现非常好的性能。 因此有兴趣研究了下如何在本地部署。 同时最新流行mauns工作流&#xff0c;他们提供一句话实现网页端任意应用的能力。实际上&#xff0c;你也可以用本地的模型来实现离线的ai工作流功能。…

vue3+ts中 .vue文件引入报错:找不到模块或其相应的类型声明

新创建的vue3项目在vscode打开出现报错&#xff1a;找不到模块或其相应的类型声明 解决&#xff1a;在env.d.ts文件添加配置&#xff1a; declare module *.vue {import type { DefineComponent } from vue// eslint-disable-next-line typescript-eslint/no-explicit-any, …

Ubuntu 22.04 二进制安装单节点 MySQL

Ubuntu 22.04 二进制安装 MySQL LTS&#xff08;长期支持版&#xff09;完整教程 MySQL LTS 版本选择&#xff1a; 目前 MySQL 8.4.4 是长期支持&#xff08;LTS&#xff09;版本&#xff0c;持续更新并保持稳定。 下载版本&#xff1a; 你也可以在 MySQL 官方网站确认最新稳…

安装和管理最新的Python3环境(以Mac为例)

背景&#xff1a; 随着大模型技术的快速发展&#xff0c;各种基于AI的测试技术也层出不穷&#xff0c;有些场景需要在较高版本的Python3环境下实现&#xff0c;否则可能会出现兼容性问题。另外考虑自己对于Python3的各个版本环境的管理和使用其实一直都不是特别的清楚&#xf…

【计算机网络】网络简介

文章目录 1. 局域网与广域网1.1 局域网1.2 广域网 2. 路由器和交换机3. 五元组3.1 IP和端口3.2 协议3.3 协议分层 4. OSI七层网络协议5. TCP/IP五层模型5.1 TCP/IP模型介绍5.2 网络设备所在分层 6. 封装与分用6.1 数据包的称谓6.2 封装6.3 分用 1. 局域网与广域网 1.1 局域网 …

【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等

Dify介绍 官网&#xff1a;https://dify.ai/zh生成式 AI 应用创新引擎开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力&#xff0c;轻松构建和运营生成式 AI 原生应用。 Dify安装脚本 目录创建 mkdir -p /data/yunxinai &&a…

人工智能和量子时代的网络安全

在不断发展的网络安全领域&#xff0c;人工智能和量子技术正在迅速改变游戏规则。它们的潜力有望极大地改变政府和组织保护、防御和发展系统以应对不断发展的网络威胁的方式。 人工智能 (AI) 在检测和缓解网络威胁方面表现出了巨大的潜力。人工智能算法可以快速分析大量数据、…

前端样式库推广——TailwindCss

官方网址&#xff1a; https://tailwindcss.com/docs/installation/using-vite 中文官方文档&#xff1a;https://www.tailwindcss.cn/ github地址&#xff1a;tailwindcss 正在使用tailwindcss的网站&#xff1a;https://tailwindcss.com/showcase 一看github&#xff0c;竟然…