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

2024-02-22 15:52

本文主要是介绍探索分布式强一致性奥秘: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 共识算法就介绍完了。

这篇关于探索分布式强一致性奥秘:Paxos共识算法的精妙之旅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/735746

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯: