zoukankan      html  css  js  c++  java
  • (16)云计算核心算法之Paxos算法

    云计算的基础技术是集群技术,支撑集群高效协同工作的需要一系列资源和任务调度算法。

    这一系列调度算法中,有3种核心算法奠定了集群互连互通的基础,它们是Paxos算法,DHT算法和Gossip协议。

    其中,Paxos算法解决分布式系统中信息一致性的问题。

    Paxos算法要解决的问题:

    Paxos算法要解决的问题是一个分布式系统如何就某个value(指令)达成一致。

    为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致

    Paxos算法的知识背景:

    (1)分布式系统中的各个节点称为"processor"

    (2)processor可以担任"proposer","accpter","learner"三个角色中的一个或多个角色。

    (3)proposal = [num(编号), value],其中num是proposal的编号(按proposal被提出的顺序递增),不同proposal的num必须是不一样的,value就是需要同步的指令。

    (4)proposer可以propose(提出)proposal;accepter可以accept(接受)proposal;learner可以学习被choose出来的value。

    (5)choose:当一个proposal被大多数(多数派)的accepter所接受时就说这个proposal被choose,同时该proposal的value也被choose。

    (6)各个processor之间的信息传递可以延迟,丢失,但是传达到的信息都是正确的

    Paxos算法的核心:

    Paxos算法认为,只要满足以下三个条件就能保证数据的一致性:

    (1)一个value只有在被proposer提出之后才可以被choose;

    (2)每次只有一个value被choose;

    (3)value只有被choose之后才能被learners所获取;

    Paxos算法其实就是对条件2的不断加强。

    条件2的加强版:

    1.每次只有一个value被choose  2.任意两个majority(多数派)至少含有一个公共accepter  3.一个accepter只能接受一个value

    如何保证条件2?

     有以下限制:

    p1: 每个accepter都必须接受它收到的第一个proposal

    p2:如果一个value为v的proposal被choose,那么此后被choose的编号更大的proposal的value也必须是v

    p2a:如果一个value为v的proposal被choose,那么此后任意accepter接受的编号更大的proposal的value也必须是v

    p2b:如果一个value为v的proposal被choose,那么此后被任意proposer提出的编号更大的proposal的value也必须是v

    其中p2,p2a和p2b的关系为: p2b蕴含p2a,p2a蕴含p2,翻译成人话就是如果满足了p2b,则p2a一定满足;如果满足了p2a,则p2一定满足。

    若同时满足p1和p2b这两个限制,则已经可以保证分布式系统中的一致性。但由于p2b很难在实际中实现,所以还需要对p2b进行加强。

    p2c:如果一个proposal=(n,v)想要被提出,那么存在一个多数派S,要么S中没有accepter接受任何num<n的proposal,要么S中accepter所接受的proposal中编号最大的proposal的value是v

    p2c是p2b的加强,即若满足p2c则一定能满足p2b的要求。

    为了满足p2c,一个proposer要想提出一个编号为n的proposal,它必须知道accepter多数派中已经接受的编号小于n的最大的编号是多少。

    proposer提出一个proposal的算法:

    (1)proposer选择一个编号n并向一组accepter发送一个prepare请求(包含所选择的编号n),要求accepter返回promise,promise包含两个信息:1.不再接受任何编号小于

    n的proposal的承诺2.该accepter所接受的小于n的最大编号的proposal,如果该accepter还未接受过任何proposal则不用返回这个信息。

    (2)如果proposer接收到大多数的accepter所返回的promise,则该proposer可以提出编号为n,value为promise所带回的proposal的value的proposal,如果promise没有带回有关的proposal则value可以为任意值。

    proposer通过向一组accepter发送accept请求来发送一个已经被接受的proposal。

    accepter接受proposal的算法:

    p1a:当且仅当accpter没有对任何编号大于n的prepare做出过promise时,它可以接受一个编号为n的proposal。

    p1a蕴含p1

    即使是宕机或者重启accepter也必须记住它所接受的最大编号的proposal以及它所做出过回应的最大编号的prepare请求。proposer要保证不提出重复的proposal。

    proposal提出和接受的系统描述,这个过程分为请求和提出两个阶段:

  • 相关阅读:
    驯服 Tiger: 并发集合 超越 Map、Collection、List 和 Set
    模块化Java:声明式模块化
    模块化Java:静态模块化
    用 Apache Tika 理解信息内容
    Refactoring: Encapsulate Collection
    新型的几乎万能的数据结构CDO
    CDO数据结构基础(1) 转载
    模块化Java简介(转载infoq)
    模块化Java:动态模块化
    责任链模式(C++)
  • 原文地址:https://www.cnblogs.com/paradis/p/11037295.html
Copyright © 2011-2022 走看看