云计算核心算法(一)

目录

    • 一、Paxos算法
      • (一)Paxos算法背景知识
      • (二)Paxos算法详解
      • (三)Paxos算法举例


  云计算的基础技术是集群技术,支撑集群高效协同工作需要一系列资源和任务调度算法,良好的调度算法可以提高集群处理能力,有效分配资源,加速作业进度。

在这里插入图片描述

一、Paxos算法

  Paxos算法解决的问题是一个分布式系统如何就某个value(决议)达成一致。Paxos算法作为分布式系统中最著名的算法之一,在目前所有的一致性算法中,该算法最常用而且被认为是最有效的。

(一)Paxos算法背景知识

  在介绍Paxos算法之前,先介绍以下背景知识:
  (1)processor可以担任三个角色“proposer”、“accepter”和“learner”中的一个或多个角色。
  (2)proposal和value:proposal一般译为“提案”,value一般译为“决议”。
  (3)proposer可以propose(提出)proposal;accepter可以accept(接受)proposal。
  (4)各个processor之间信息的传递可以延迟、丢失,但是在这个算法中假设传达到的信息都是正确的。

(二)Paxos算法详解

  Paxos算法的核心是,只要满足下面三个条件就能保证数据的一致性:
  (1)一个value只有在被proposer 提出之后才可以被choose;
  (2)每次只有一个value被choose;
  (3)value只有被choose之后才能被learners所获取。
  这三个条件其实很好理解,而这三个条件中最重要的就是条件2, Paxos算法也就是对条件2的不断加强。如何保证每次只有一个value被chosen呢?
  首先,来看一个单点问题:只有一个proposer和一个accepter, proposer传递有一个proposal给accepter,accepter接受并执行。这种机制很简单也很容易实现。但是如果其中一个processor宕机或者重启导致没有接收到信息那么整个系统就瘫痪了。显然,这不是理想的系统。 当系统有多个processor时(分布式系统),一个proposer向一组acepter发送proposal,这些acepter可能接受这个proposal也可能不接受(例如proposal丢失)。现在来加强条件2:
①条件 2 ②任意两个majority至少 含有一个公共accepter } ③一个accepter只能接受一个value \left. \begin{array}{l} ①条件2\\[2ex] ②任意两个\text{majority}至少\\ 含有一个公共\text{accepter} \end{array} \right\} ③一个\text{accepter}只能接受一个\text{value} 条件2任意两个majority至少含有一个公共accepter 一个accepter只能接受一个value

  这一步推导很简单,例如,有一个accepter集合,这个集合里有3个accepter,显然多数派至少含有两个accepter,如果有两个value则有两个多数派,而两个多数派至少有一个重合的accepter,也就是说这个accepter接受了两个不同value (议案)。这样有了3的限制则保证了只有一个value被chosen。
  假设当分布式系统刚刚运行的时候只有一个proposer提出了一个proposal,如果所有的accepter都不接受这个proposal则系统不会运行,因此要求p1。
  p1:每个accepter都必须接受它收到的第一个proposal。
  注意,p1是不完备的,例如,由两个proposer和4个accepter组成的分布式系统中,如果两个proposer几乎同时提出了两个value不同的proposal,而这两个proposal分别被两个accepter接受了,这样就没有value被chosen,因为这个案例中的多数派至少由3个accepter组成。但是我们现在暂时搁置这个问题,在后面会进行讲解。
  由于p1,显然,一个accepter可以接受多个proposal (由③可以知道这些proposal有着相同的value)。根据③,通过引入 proposal=[num, value],于是有了限制p2。
  p2:如果一个value为v的proposal被choose,那么此后被choose的编号更大的proposal的value也必须是v。
  然而,一个proposal要被choose必须被大多数accepter所接受,故得到了p2的加强版本p2a。
  p2a:如果一个value为v的proposal被choose,那么此后被任意accepter接受的编号更大的proposal的value也必须是v。
  到这里出现了一个矛盾,如果一个value为v1的proposal p1被choose了,随后又有一个proposer提出了一个value为v2的proposal p2,这个p2送达了accepter x,巧合的是之前所有送往x的proposal都丢失了,也就是说这个p2是送达x的第一个proposal,根据p1这个x必须接受p2,而根据p2a 则不能,因此对p2a再做一次加强。 因为一个proposal要被accepter所接受,它必须被proposer所提出,故得到了对p2a的加强版本p2b。
  p2b:如果一个value为v的proposal被choose,那么此后被任意proposer提出的编号更大的proposal的value也必须是v。
  这三个限制的关系是,p2b→p2a→p2,即p2b蕴含p2a,p2a蕴含p2。
  到这里p1和p2b已经可以保证分布式中的一致性,然而,p2b虽然在逻辑上满足要求却很难在实际中实现,因为proposer提出的proposal是难以限制的。所以,编者对p2b又做了一次加强。
  p2c:如果一个 proposal=( n n n,v) “想要”被提出,那么存在一个多数派S,要么(a)S中没有accepter接受任何num< n n n的proposal,要么(b)S中accepter所接受的proposal中编号最大的proposal的value是v。
  从p2b到p2c是整个Paxos算法最难以理解的地方,维基百科和一些人的博客对此处的理解都不太一样,p2c是p2b的加强,即p2c→p2b。现在解释一下p2c的含义,如果 proposal( n n n,v) 想要被提出,有两种情况:
  (1)S中没有accepter接受num≤ n n n的proposal,也就是说proposal是第一个proposal。num==1的proposal的提出是不受到限制的。
  (2)S中accepter所接受的proposal中编号最大的proposal的value是v,S中accepter接受了某个或者一些proposal,那么这些proposal的value已经被choose。前面说过p2c是p2b的加强,p2b要求一旦某个value被choose,则以后提出的proposal的value必须跟被choose的value一致。proposal想要被提出则它的value必须和编号最大的proposal value一致。为什么是编号最大的而不是编号为 n n n-1 ( n n n为当前接受的proposal的编号) 的呢?因为一个proposal被多数派S接受之后它后续的proposal有可能丢失。
  为了满足p2c,一个proposer要想提出一个编号为 n n n的proposal,它必须知道accepter多数派中已经接受的或者将要接受的编号小于 n n n的最大的编号是多少。知道已经接受的proposal的编号是很简单的,但是预测就比较难实现了,Paxos通过让accepter承诺不再接受任何编号小于 n n n的proposal来控制。因此,proposer提出一个proposal需要经过以下两步:
  (1)proposer选择一个编号 n n n并向一组accepter发送一个prepare请求 (包含所选择的编号 n n n),要求accepter返回promise,promise包含两个信息:①不再接受任何编号小于 n n n的proposal的承诺;②该accepter所接受的小于 n n n的最大编号的proposal,如果该accepter还未接受过任何proposal则不用返回这个信息。
  (2)如果proposer接收到大多数的accepter所返回的promise,则该proposer可以提出编号为 n n n,value为promise所带回的proposal的value的proposal,如果promise没有带回有关的proposal则value可以为任意值。
  proposer通过向一组 (不一定是发给它promise的那一组) accepter发送accept请求来发送一个已经被接受的proposal。以上是proposer提出proposal的算法,下面看看accepter接受proposal的算法。
  p1a:当且仅当accepter没有对任何编号大于 n n n的prepare做出过promise时,它可以接受一个编号为 n n n的proposal。
  显然,p1a蕴含p1。与proposer不同的是,即使是宕机或者重启accepter也必须“记住”它所接受的最大编号的proposal以及它所做出过回应的最大编号的prepare请求。而proposer只要保证不提出重复的proposal即可。

  对一个proposal的提出和接受做一个系统的描述,这个过程分为请求和提出两个阶段。
  1)请求阶段
  (1)proposer选择一个编号n,并向accepter多数派发出一个prepare请求。
  (2)如果accepter接受到的prepare所带有的编号n比它之前所做出过回应的prepare请求的编号都要高,则该accepter回应proposer一个promise。
  2)提出阶段
  (1)如果proposer收到了accepter多数派对它所发出的prepare请求所做的回应,则它发出带有proposal的accept请求,proposal = (num,value),value为回应所带回的proposal的value值。
  (2)如果accepter接受到一个accept请求,如果该accepter之前没有对任何编号大于n的prepare请求做出过promise,则接受该proposal。

在这里插入图片描述
  PR:prepare request(假设p1到a3的PR丢失)。a1和a2是第一次接受到prepare请求,所以返回promise(不带回proposal),此时p1收到了a1和a2的promise,但是根据提出阶段的proposer必须接受来自多数派的promise才可以提出accept 请求,因此不会出现先前例子中的情况。

(三)Paxos算法举例

  在一个分布式数据库系统中,有5个节点S1、S2、S3、S4、S5,假设各节点的初始状态一致,则每个节点都执行相同的操作序列,那么它们最后能得到一个一致的状态。现在用Paxos算法保证每个节点都执行相同的操作序列。假设S1只传输sql命令 (proposer),剩下的都是数据库节点 (accepter)。

步骤一

  S1选定编号1(假设第一个命令编号为1),向集合database={s2, s3, s4, s5}的一个多数派子集发送Prepare Request(PR)。

在这里插入图片描述
步骤二

  如果通信顺利,所有的多数派都收到了PR。如果通信部分失败导致接受到PR的节点不构成多数派则S1重复步骤1(PR编号递增)。

在这里插入图片描述
步骤三

  S1接收到多数派的Paromise,向集合database发出带有第一个SQL命令(这里的SQL命令就是之前的value)的Proposal,编号为1,因为Promise没有带回Proposal所以这里的SQL命令没有限制。

在这里插入图片描述
步骤四

  如果通信顺利,所有的数据库节点都收到了S1所提出的proposal (编号为1),而它们之前并没有做过任何编号大于1的prepare,因此它们接收这个proposal,由此多数派形成,决议也就产生了。然后各个节点执行决议的内容也就是SQL命令,然后等待S1提出第二个SQL命令:如果通信部分失败,这种情况下,如果接受到proposal1的节点可以构成多数派则和通信顺利的情况下一样;反之则不然,由于构不成多数派则不能产生决议,所有的数据库节点都不执行SQL命令,从而保证了数据库内容的一致性。

在这里插入图片描述
步骤五

  重复以上操作,注意Proposal、Prepare以及Promise的编号递增,以及Promise根据情况带回Proposal。

在这里插入图片描述

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

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

相关文章

【python】Numpy运行报错详细分析:IndexError: too many indices for array

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

创建vue3项目并配置PC端屏幕适配

一、创建vue3项目 1.使用vue cli创建 vue created 项目名2.选择自定义方式创建vue3项目 3.选择项目所需要的依赖项(刚学习vue的同学建议选择安装&#xff08;Linter / Formatter 支持代码风格检查和格式化&#xff09; 对于每一项的功能&#xff0c;做了一个简单的描述&a…

Web开发:一个可拖拽的模态框(HTML、CSS、JavaScript)

目录 一、需求描述 二、实现效果 三、完整代码 四、实现过程 1、HTML 页面结构 2、CSS 元素样式 3、JavaScript动态控制 &#xff08;1&#xff09;获取元素 &#xff08;2&#xff09;显示\隐藏遮罩层与模态框 &#xff08;3&#xff09;实现模态框拖动效果 一、需求…

增长新引擎,构建基于 CDP 的用户运营竞争力

本文将围绕“企业如何通过构建基于 CDP 的用户运营体系提升业务增长”这一核心&#xff0c;详细介绍企业数据化运营现状&#xff0c;拆解用户运营目标&#xff0c;展示神策 CDP 的关键能力以及用户运营策略落地的完整路径。 一、洞察&#xff1a;企业数据化运营面临的挑战 当前…

C语言-网络编程-UDP通信创建流程

UDP 通信创建流程 UDP 是⼀个传输层的⽆连接的协议&#xff0c;我们编写代码⼀般是分为两个端。⼀个我们称之为发送端&#xff0c;另⼀ 个我们称之为接收端。正常⼀般是接收端先运⾏&#xff0c;然后等待结束发送端发送过来的数据。 创建套接字 首先&#xff0c;我们需要创建…

四、GD32 MCU 常见外设介绍 (5) TIMER 模块介绍

5.1.TIMER 基础知识 TIMER分高级定时器&#xff0c;通用定时器L0&#xff0c;L1&#xff0c;L2和基本定时器。 5.2.硬件连接说明 TIMER 属于片内外设&#xff0c;对于外部硬件设计&#xff0c;只需要单独IO口外接信号线即可。 5.3.GD32 TIMER 外设原理简介&#xff08;以 G…

/秋招突击——7/21——复习{堆——数组中的第K大元素}——新作{回溯——全排列、子集、电话号码的字母组合、组合总和、括号生成}

文章目录 引言复习数组中的第K大的最大元素复习实现参考实现 新作回溯模板46 全排列个人实现参考实现 子集个人实现参考实现 电话号码的字母组合复习实现 组合总和个人实现参考实现 括号生成复习实现 总结 引言 昨天的科大讯飞笔试做的稀烂&#xff0c;今天回来好好练习一下&a…

JUC并发编程02-常见方法

start方法与run方法 直接调用run方法-》主线程实现&#xff0c;并不会启动一个新线程。多次调用start方法-》会抛出非法线程异常的错&#xff0c;当线程变成了runnable状态就不能用start方法了。 sleep方法与yield方法 调用sleep会让当前线程从running进入 timed waiting状态…

测试——Junit

内容大纲: 常用的五个注解 测试用例顺序指定 参数化 测试套件 断言 1. 常用的五个注解 1.1 Test 通常情况下,我们输入要写在main方法下,此时我想直接输出: Test void Test01(){System.out.println("第一个测试用例"); } 1.2 BeforeAll AfterAll BeforeALL在Tes…

RK3568笔记四十一:DHT11驱动开发测试

若该文为原创文章&#xff0c;转载请注明原文出处。 记录开发单总线&#xff0c;读取DHT11温湿度 一、DHT11介绍 DHT11是串行接口&#xff08;单线双向&#xff09;DATA 用于微处理器与 DHT11之间的通讯和同步&#xff0c;采用单总线数据格式&#xff0c;一次通讯时间4ms左右…

利用一维数组计算今天是今年的第几天

分析&#xff1a; 在一维数组里初始化12个月份&#xff0c;在进行判断是不是闰年&#xff0c;是闰年就把数组的二月的下标改为29&#xff0c;否则不变就按照平年计算&#xff0c;最后把想要计算的月份减1累加到sum里&#xff0c;在进行计算该月份的天也要累加。例如&#xff1a…

神经网络处理器模拟器的一点思考

一 神经网络处理器 通常基于FPGA的神经网络处理器进行部署某种网络&#xff0c;考虑的因素较多&#xff0c;具体包括网络模型的不同&#xff0c;涵盖不同的算子、激活函数、调度策略等等&#xff1b;具体硬件实现&#xff0c;涉及神经网络处理器并行度、硬件资源消耗&#xff0…

java高级——Collection集合之Set探索(底层为HashMap实现)

java高级——Collection集合之Set探索 前情提要文章介绍继承结构底层代码&#xff08;一张图你就悟了&#xff09;下期预告 前情提要 上一篇文章我们探索了HashMap&#xff0c;详细解说了哈希冲突&#xff0c;红黑树以及Map底层到底是怎么实现的&#xff0c;这一篇我们简单说一…

图像生成(Text-to-Image)发展脉络

这篇博客对 图像生成&#xff08;image generation&#xff09; 领域的经典工作发展进行了梳理&#xff0c;包括重要的一些改进&#xff0c;目的是帮助读者对此领域有一个整体的发展方向把握&#xff0c;并非是对每个工作的详细介绍。 脉络发展&#xff08;时间顺序&#xff0…

气膜工业仓储与气膜体育馆的配置区别—轻空间

气膜工业仓储和气膜体育馆在配置上有明显的区别&#xff0c;这主要是由于它们的使用功能和环境不同所导致的。 结构设计 气膜工业仓储&#xff1a; 主要设计为大跨度、大空间&#xff0c;以便容纳大量货物。 气膜体育馆&#xff1a; 设计注重支撑观众席、运动场地和相关设施&…

Golang | Leetcode Golang题解之第274题H指数

题目&#xff1a; 题解&#xff1a; func hIndex(citations []int) int {// 答案最多只能到数组长度left,right:0,len(citations)var mid intfor left<right{// 1 防止死循环mid(leftright1)>>1cnt:0for _,v:range citations{if v>mid{cnt}}if cnt>mid{// 要找…

One-Class SVM

前提知识&#xff1a;支持向量机&#xff08;SVM&#xff09;-CSDN博客 主要思想 找一个超平面将样本中的正例圈出来&#xff0c;预测就是用这个超平面做决策&#xff0c;在圈内的样本就认为是正样本&#xff0c;圈外的是其他样本&#xff0c;如图1所示&#xff1a; 图1 OSVM…

完整创建一个vite前端项目

目录 1.先创建一个vite项目 2.下载第三方依赖 ① 安装路由vue-router ② 安装vuex全局数据管理 ③ 安装element-plus ④ 安装element-plus图标 ⑤ 安装axios发送请求 ⑥ 完整main.js代码模板 3.开发组件 4.登陆页面开发用例 5. 完整项目代码 废话少说&#xff0c;直接…

【C#】| 与 及其相关例子

按位或&#xff08;|&#xff09; 按位或运算符 | 对两个数的每一位进行比较&#xff0c;如果两个数中至少有一个为 1&#xff0c;则结果位为 1&#xff1b;否则&#xff0c;结果位为0。 1010 (10 in decimal) | 1100 (12 in decimal) ------1110 (14 in decimal) 力扣相关…

【MySQL进阶之路 | 高级篇】EXPLAIN的进一步使用

1. EXPLAIN的四种输出格式 EXPLAIN可以输出四种格式&#xff1a;传统格式&#xff0c;JSON格式&#xff0c;TREE格式以及可视化输出。用户可以根据需要选择使用于自己的格式。 1). 传统格式 传统格式简单明了&#xff0c;输出是一个表格形式。 2). JSON格式 第一种格式中介…