首页 > 编程语言 >Paxos算法

Paxos算法

时间:2022-10-04 17:45:47浏览次数:67  
标签:val 半数 proposer 算法 num proposal Paxos acceptor

解决什么问题

  • paxos用于确定一个不可变变量的取值。这看似是一个简单的功能,但是分布式系统中时刻伴随着乱序,故障的现象,并且为了提高系统可用率,存储采用多个副本存储,此时确定一个变量的取值就不是一个简单的功能了。

应用

以分布式式存储系统为例,数据的值是可以一直变化的,但是其存储方式可以拆分为不同的变更记录,使用paxos来确定每一次变更的确定性取值。

 

问题分析:

  • paxos解决的问题系统抽象:确定一个变量var的取值
  • 系统组成:
    • 系统内部由多个acceptor组成,负责存储和管理var变量。
    • 系统外部由多个proposer组成,负责发起proposal(n,v),设置变量var的值,其中编号是n,值是v
  • 系统主要要求:
    • var的取值的一致性,如果var取值没有确定,则系统认为var取值为NULL,一旦系统认为var取值被确定了,var的值不可被更改

 

 

  • 额外要求:  
    • 多个proposer可能并发调用,并且可以提出不同的取值。
    • 系统能容忍少数(半数以下)accetpor故障。
    • 系统能容忍任意proposer在任何时候发生故障。
  • 当前假设:acceptor不会丢失数据。
  • 统一术语:
    • val=v被选中 => v被写入超过超半数的acceptor

paxos算法:

  • acceptor需要存储的元素:
    • prepare最大num,记为PreNum
    • 已接受的proposal(n, v)中,编号n最大proposal,记为accept(ProNum_ProVal),没有接受过proposal则记为accept(null)
  • 阶段1:准备阶段
    • a(proposer做法):向超过半数的accetpor发送一个num=n的预请求,记为prepare(n)
    • b(acceptor做法):acceptor收到prepare(n)后,对比PreNum和n
      • 如果PreNum>n,回复reject()
      • 否则,acceptor接受该prepare(n),并设置PreNum=n,并返回accept(ProNum_ProVal)或者accept(null)
  • 阶段2:提交阶段
    • a(proposer做法):根据阶段1a中的返回值。
      • 如果收到至少一个reject(),则返回<error>
      • 如果收到的回应数没超过半数,则返回<error>
      • 如果收到超半数不为reject()的回应,根据阶段1b中的返回值
        • 如果所有返回值为accept(null),则proposer向所有acceptor发送acceptI(n, v)。
        • 取返回值accept(ProNum_ProVal),判断v的个数是否超过半数
          • 是 => v被选中,返回<ok,v>
          • 否 => 向所有accetpor发送proposal(n, v),其中v是所有accept(ProNum_ProVal)中ProNum最大对应的ProVal,n是节点1a中的num。
    • b(acceptor做法):根据节点2a接收到的proposal(n, v) , 判断PreNum和n
      • n<PreNum, 不接受该accept
      • 否则,接收proposal(n, v),记录accept(n_v),并广播accept(n_v)

   

论文的推导过程理解:

  • 多个acceptor存储val,如何才被定义val被选中?
    • 超过半数acceptor写入成功某个取值v时,称val被选中 => 理论是抽屉原理,两个超半数的acceptor集合必有一个acceptor重合,最先写入超半数acceptor集合成功的val(v)会被选中,后续的超半数集合acceptor必然能获取到该选中的val(v)。
  • 为什么要添加自增编号num?
    • 需要写入超半数acceptor && 容忍半数以下的acceptor故障。acceptor总个数为5,v1、v2写入成功acceptor的数量=2,此时剩下的一个acceptor故障 => 其中一个acceptor必然会写入两次val,写入是通过添加自增编号(规定高阶=>num更大)区分两次,甚至多次写入。
  • 既然一个acceptor会写入多个值,如何确保val的取值不可变?(被选中之后,不在提出写入其他值)
    • 一旦proposer发现val=n的值被选中,则使用已经被选中的val写入acceptor。
    • 更加严苛的做法(找其充分条件,论文中的证明过程就是一步步找满足不可变条件的充分条件,直至工程上容易实现)
      • 假设当num=m时,val=v已经写入超过半数acceptor,有num=n(n>m),proposer写入任意一个acceptor的val都应该是v => 简称P2a
      • 假设当num=m时,val=v已经写入超过半数acceptor,有num=n(n>m),proposer都只能发送proposal(n,v) => 简称P2b
  • 如何确保P2b? => P2c(最难理解的部分)
    • 在发出proposal(n,v)之前
      • 要么确保超半数acceptor没有接受过任何自增编号小于n的proposal(证明还没有任何va被选中,此时可以v可以是任何值)。
      • 要么确保超半数acceptor所接受的所有proposal中,最大小于n自增编号的proposal对应的val为v (归纳法可证明,如果v已经被超半数acceptor所接受,每次取最大num对应的v,那高阶的proposal的val一定是v)
  • 两阶段提交中的阶段1 prepare解决了什么问题?
    • 查询是否有val已经被选中
    • 由于proposer的调用会乱序,通过自增编号num=n锁定acceptor,使得acceptor不在接受num<n的proposal,从而可以信任查询的结果,然后按照P2c的原则实操。

 

标签:val,半数,proposer,算法,num,proposal,Paxos,acceptor
From: https://www.cnblogs.com/sambloghome/p/16721377.html

相关文章

  • 快速排序算法
    快速排序(QuickSort)是对冒泡排序的一种改进,通过一趟排序将数据序列分成两部分,其中一部分的所有数据比另一部分的所有数据都要小,然后按此方法对两部分数据分别进行快速......
  • PCA算法介绍及源码实现
    前言PCA(主成分分析)是十大经典机器学习算法之一。PCA是Pearson在1901年提出的,后来由Hotelling在1933年加以发展提出的一种多变量的统计方法。PCA算法介绍PCA(principalc......
  • 二分查找算法的起步判定优化
    packagecom.example.grokkingalgorithmsdemo.binarysearch;importlombok.extern.slf4j.Slf4j;/***@Author:Frank*@Date:2022-06-0412:12*/@Slf4jpublicclassBin......
  • 经典算法
     算法稳定性稳定性是指在一组待排序记录中,如果存在任意两个相等的记录R和S,且在待排序记录中R在S前,如果在排序后R依然在S前,即它们的前后位置在排序前后不发生改变,则......
  • 冒泡排序算法
    冒泡排序算法(BubbleSort)算法是一种简单的排序算法,它在重复访问要排序的元素列时,会依次比较相邻的两个元素,如果左边的元素大于后边的元素,就将二者交换位置,如此重复,......
  • 二分查找算法
    二分查找算法又叫做折半查找,要求待查找的序列有序,每次查找都取中间的值与待查关键字进行比较,如果中间位置的值比待查关键字大,则在序列的左半部分继续执行该查找过程,如......
  • 牛客网高频算法题系列-BM16-删除有序链表中重复的元素-II
    牛客网高频算法题系列-BM16-删除有序链表中重复的元素-II题目描述给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。原题目见:BM......
  • AcWing 算法提高课 矩阵乘法
    可以用快速幂的形式求大量的相同矩阵乘法。1、快速幂求斐波那契数列的第n项(n很大)先将斐波那契数列的递推转化成矩阵形式 然后用快速幂求解A^n 例题:求斐波那契数列......
  • 手写现代前端框架diff算法-前端面试进阶
    前言在前端工程上,日益复杂的今天,性能优化已经成为必不可少的环境。前端需要从每一个细节的问题去优化。那么如何更优,当然与他的如何怎么实现的有关。比如key为什么不能使用......
  • 计算机系统进程调度算法
    不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。批处理系统批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终......