探索分布式强一致性奥秘:Paxos共识算法的精妙之旅

        提到分布式算法,就不得不提 Paxos 算法,在过去几十年里,它基本上是分布式共识的代名词,因为当前一批常用的共识算法都是基于它改进的。比如,Fast Paxos 算法、Cheap Paxos、Raft 算法等。

        由莱斯利·兰伯特(Leslie Lamport)于1990年首次提出,并在后续文章中进一步阐述。Paxos 算法旨在解决在一个可能发生网络分区、节点失效或其他异常情况的分布式环境中,如何让所有参与决策的节点对某个值达成一致同意的问题。

        兰伯特提出的Paxos总共包含两部分:

  1. 一个是 Basic Paxos 算法,描述的是多节点之间如何就某个值(提案Value)达成共识
  2. 另一个是 Multi-Paxos 思想,描述的是执行多个 Basic Paxos 实例,就一系列值达成共识

Basic Paxos

        先来看一个例子

        假设有一个分布式集群,由三个节点 A、B、C 组成,提供只读 KV 存储服务,创建只读变量的时候,必须要先写入数据,而且这个数据后续不能被修改。因此一个节点写入只读变量后就不能再修改了,所以所有节点必须要先对只读变量达成共识,然后所有节点在一次创建这个只读变量。

        当有多个客户端(如客户端1、2)访问这个系统试图创建同一个只读变量(如X),客户端1试图创建值为3的X,客户端2试图创建值为7的X,这样要如何达成共识,实现各节点上X值一直呢?

        为了帮助人们更好的理解 Basic Paxos 算法,兰伯特在讲解时,也使用了一些独有而且比较重要的概念,提案、准备(Prepare)请求、接受(Accept)请求、角色等等,其中最重要的就是角色。因为角色是对 Basic Paxos 中最核心的三个功能的抽象,比如,由接受者(Acceptor)对提议者的值进行投票,并存储接受的值。

        角色划分

        在 Basic Paxos 中,由提议者(Proposer)、接受者(Acceotor)、学习者(Learner)三种角色,如图:

  • 提议者(Proposer):提议一个值,用于投票表决。为了方便演示,可以把客户端1和2看做是提议者。但在绝大多数场景中,集群中收到客户端请求的节点,才是提议者。这样做的好处是,对业务代码没有侵入性,也就是说,我们不需要在代码中实现算法逻辑,就可以像使用数据库一样访问后端数据。
  • 接受者(Acceptor):对每个提议的值进行投票,并存储接受的值,比如 A、B、C 三个节点。一般来说,集群中的所有节点都在扮演接受者的角色,参与共识协商,并接受和存储数据。

        这里需要强调一下:前面不是说接收客户端请求的节点是提议者吗?这里怎么又是接受者呢?这是因为一个节点(或进程)可以身兼多个角色。想象一下,一个 3 节点的集群,1 个节点收到了请求,那么该节点将作为提议者发起二阶段提交,然后这个节点和另外 2 个节点一起作为接受者进行共识协商,就像下图的样子:

  • 学习者(Leaner):被告知投票的结果,接受达成的共识值,存储保存,不参与投票的过程。一般来说,学习者是备份节点,比如“Master-Slave”模型中的Slave,被动的接受数据,容灾备份。

        达成共识过程

        有这样一个场景,假如你所在的公司有一个新项目需要开发,业务比较复杂,你的领导给组内每个成员下发了任务,要求每人写一个项目方案,最终开会讨论采用哪套方案,为了区分每套方案,每个方案都有一个标识,称为提案编号,来唯一标识。

        与你的做法类似,在 Basic Paxos 中,兰伯特也使用提案代表一个提议。不过在提案中,除了提案编号,还包含了提议值。使用 [n, v] 表示一个提案,n 为提案编号,v 为提议值。

        整个共识协商是分两个阶段进行的。假设客户端 1 的提案编号为 1,客户端 2 的提案编号为5,并假设节点 A、B 先收到来自客户端1的准备请求,节点 C 先收到来自客户端 2 的准备请求。

        准备(Prepare)阶段

        先来看第一阶段,首先客户端 1、2 作为提议者,分别向所有接受者发送包含提案编号的准备请求:

        在准备请求时不需要准备提议的值的,只需要携带提案编号就可以了,这是容易误解的地方。接着,当A、B收到提案编号为 1 的准备请求,节点 C 收到提案编号为 2 的准备请求后,将进行这样的处理:

  • 由于之前没有通过任何提案,所以节点 A、B 将返回一个"尚无提案"的响应。也就说节点 A和 B 在告诉提议者,我之前没有通过任何提案,并承诺以后不在响应提案编号小于等于 1 的准备请求,不会通过编号小于1的提案。
  • 节点 C 也是如此,它将返回一个“尚无提案”的响应,并承诺以后不在响应提案编号小于 5 的提案,不会通过提案编号小于5的提案。

        另外,当节点 A、B 收到提案编号为 5 的准备请求,和节点 C 收到提案编号为 1 的准备请求的时候,将进行这样的处理:

  • 当节点 A、B 收到提案编号为 5 的准备请求时,因为提案编号 5 大于他们之前响应的准备请求的提案编号 1,而且两个节点都没有通过任何提案,所以它将返回一个“尚无提案”的响应,并承诺以后不在响应提案编号小于 5 的准备请求,不会通过提案小于 5 的提案。
  • 当节点 C 收到提案编号为 1 的准备请求时,由于天编号 1 小于之前响应的准备请求的提案编号 5,所以丢弃该准备请求,不做响应。

        接受(Acceptor)阶段

        第二个阶段也就是接受阶段,首先客户端 1、2 在收到大多数节点的准备响应之后,会分别发送接受请求:

  • 当客户端 1 收到大多数的接受者(节点A、B)的准备响应之后根据响应中提案编号最大的提案值,设置接受请求中的值。因为该值在来自节点 A、B 的准备响应中都为空,所以就把自己的提议值 3 作为提案的值,发送接受请求 [1, 3]。
  • 当客户端2收到大多数的接受者的准备响应后(节点A、B、C),根据响应中提案编号最大的提案值,来设置接受请求中的值。因为该值来自节点 A、B、C 准备响应都为空,所以就把自己的提议值7作为提案的值,发送接受请求 [5, 7]。

        当三个节点接受到两个客户端的接受请求时,会进行这样的处理:

  • 当节点 A、B、C 接受到请求 [1, 3] 的时候,由于提案的提案编号 1 小于三个节点承诺能通过的提案的最小提案编号 5,所以提案 [1, 3] 将被拒绝。
  • 当节点 A、B、C 接受到请求 [5, 7] 的时候,由于提案的提案编号 5 不小于三个节点承诺能通过的提案的最小提案编号 5,所以就通过提案 [5, 7],也就是接受了值 7,三个节点就 X 值为 7 达成共识。

        如果集群中有学习者,当接受者通过了一个提案时,就通知给所有的学习者。当学习者发现大多数的接受者都通过了某个提案,那么它也通过该提案,接受该提案的值。  

Multi-Paxos算法 

        Basic Paxos 只能就单个值(Value)达成共识,一旦遇到为一系列的值实现共识的时候,它就不管用了。虽然兰伯特提到可以通过多次执行 Basic Paxos 实例(比如每接收到一个值时,就执行一次 Basic Paxos 算法)实现一系列值的共识。但是,读完论文后,虽然每个英文单词都能读懂,但还是不理解兰伯特提到的 Multi-Paxos,为什么 Multi-Paxos 这么难理解呢?

        兰伯特并没有把 Multi-Paxos 讲清楚,只是介绍了大概的思想,缺少算法过程的细节和编程所必须的细节。这就导致了每个人实现的 Multi-Paxos 都不一样。不过从本质上看,大家都是在兰伯特提到的 Multi-Paxos 思想上补充细节,设计自己的 Multi-Paxos 算法,然后实现它(比如 Chubby 的 Multi-Paxos 实现、Raft 算法等)。

        所以这里补充一下,兰伯特提出的 Multi-Paxos 是一种思想,不是算法。而 Multi-Paxos 是一种统称,它是指基于 Multi-Paxos 思想,通过多个 basic-Paxos 实现一系列值的共识算法。这一点尤为重要。

        到这里 Paxos 共识算法就介绍完了。

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

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

相关文章

Spring6学习技术|AOP

学习材料 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解) AOP AOP(Aspect Oriented Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程的…

AIDL的工作原理与使用示例 跨进程通信 远程方法调用RPC

AIDL的介绍与使用 AIDL(Android Interface Definition Language)是Android中用于定义客户端和服务端之间通信接口的一种接口定义语言。它允许你定义客户端和服务的通信协议,用于在不同的进程间或同一进程的不同组件间进行数据传递。AIDL通过…

算法项目(3)—— 从零实现KNN、朴素贝叶斯垃圾邮件分类

本文包含什么? 项目运行的方式项目代码,自己实现KNN算法以及朴素贝叶斯算法.代码介绍运行有问题? csdn上后台随时售后.项目说明 本文主要是自己从0实现KNN算法以及朴素贝叶斯算法.然后使用英文垃圾邮件数据集进行垃圾邮件分类.常见的代码均调用sklearn库来实现,本文自行实现…

从零学习Linux操作系统第二十八部分 shell脚本中的执行流控制

一、什么是执行流、循环执行流 执行流:改变执行顺序,使之更方便操作者 循环执行流:根据脚本是执行流再某一个状态下进行循环执行,进行多次执行后再往下走(for语句) for语句 作用 为循环执行动作 for语句…

opencv判断灰化情况

目的 先说说理论: 在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分…

LeetCode LCR 055.二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

vue实现拖拽(vuedraggable)

实现效果: 左侧往右侧拖动,右侧列表可以进行拖拽排序。 安装引用: npm install vuedraggable import draggable from vuedraggable 使用: data数据: componentList: [{groupName: 考试题型,children: [{componentType: danxua…

SQLite 的使用

SQLite 是一个轻量级、自包含和无服务器的关系型数据库管理系统(RDBMS),广泛应用于嵌入式系统、移动应用程序和小中型网站。它易于创建、需要的配置较少,并且提供了用于管理和操作数据的强大功能集。本文,我们将带领你…

电路设计(26)——交通信号灯的multism仿真

1.功能要求 使用数字芯片设计一款交通信号灯,使得: 主干道的绿灯时间为60S,红灯时间为45S 次干道的红灯时间为60S,绿灯时间为45S 主、次干道,绿灯的最后5S内,黄灯闪烁 使用数码管显示各自的倒计时时间。 按…

openssl3.2 - 编译 - zlib.dll不要使用绝对路径

文章目录 openssl3.2 - 编译 - 编译时的动态库zlib.dll不要使用绝对路径概述测试zlib特性在安装好的目录中是否正常笔记70-test_tls13certcomp.t80-test_cms.t对测试环境的猜测从头再编译测试安装一次测试一下随便改变位置的openssl用到zlib时是否好使测试一下随便改变位置的op…

Docker Nginx 负载均衡搭建(服务宕机-配置高可用) - 附(Python案例,其它语言同理)

目录 一 . 概要 1. 什么是负载均衡 2. 负载均衡有哪些优势? (1)应用程序可用性 (2)应用程序可扩展性 (3)应用程序安全 (4)应用程序性能 3 . Nginx负载均衡调度策…

核密度分析

一.算法介绍 核密度估计(Kernel Density Estimation)是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用,包括: 数据可视化:核密度估计可以用来绘制平滑的密度曲线或热力图,从而直观地表…

win系统下安装php8.3版本并配置环境变量的详细教程

本篇文章主要讲解在win系统下安装和配置php8.3版本,并配置环境变量的详细教程。 日期:2024年2月22日 作者:任聪聪 一、下载php8.3版本包 php8.3版本官方下载地址:https://windows.php.net/download#php-8.3 步骤一、打开下载地址…

【Unity】Unity与安卓交互

问题描述 Unity和安卓手机进行交互,是我们开发游戏中最常见的场景。本教程将从一个简单的例子来演示一下。 本教程需要用到Android Studio2021.1.1 1.Android Studio新建一个工程 2.选择Empty Activity 然后点击Next 3.点击Finish完成创建 4.选择File-New-New Mo…

【python 3.9.18】windowns安装版

因为这个版本官方未提供,所以需要自己编译出来,其他没有的版本可以依据下面的进行生成一个exe也可行。 成品: https://gitee.com/greatLong/python-3.9.18/tree/master/python-3.9.18/PCbuild/amd64 1、环境准备 需要使用到 这里面还需要选…

【MATLAB GUI】 5. 图像处理菜单(菜单编辑器)

看B站up主freexyn的freexyn编程实例视频教程系列36Matlab GUI的学习笔记 任务要求设计一个图像处理菜单,实现图像的打开导入、灰度处理、存储等功能 修改过文件名,所以运行的时候会有一点点报错,但是不影响运行 打开工具栏下边的菜单编辑器…

创建一个基于Node.js的实时聊天应用

在当今数字化社会,实时通讯已成为人们生活中不可或缺的一部分。无论是在社交媒体平台上与朋友交流,还是在工作场合中与同事协作,实时聊天应用都扮演着重要角色。与此同时,Node.js作为一种流行的后端技术,为开发者提供了…

CrossOver虚拟机软件2024有哪些功能?最新版本支持哪些游戏?

CrossOver由codewaver公司开发的类虚拟机软件,目的是使linux和Mac OS X操作系统和window系统兼容。CrossOver不像Parallels或VMware的模拟器,而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏,而不…

LangChain支持哔哩哔哩视频总结

是基于LangChain框架下的开发,所以最开始请先 pip install Langchain pip install bilibili-api-python 技术要点: 使用Langchain框架自带的Document loaders 修改BiliBiliLoader的源码,自带的并不支持当前b站的视频加载 源码文件修改&a…

【高德地图】Android高德地图绘制标记点Marker

📖第4章 Android高德地图绘制标记点Marker ✅绘制默认 Marker✅绘制多个Marker✅绘制自定义 Marker✅Marker点击事件✅Marker动画效果✅Marker拖拽事件✅绘制默认 Infowindow🚩隐藏InfoWindow 弹框 ✅绘制自定义 InfoWindow🚩实现 InfoWindow…