• 分布式系统一致性算法(Paxos)


    CAP理论

        一致性(Consistency)
        可用性(Availability)
        分区容错性(网络分区)Partition tolerance

    CAP理论的特点,就是CAP只能满足其中2条

    CA(放弃P):将所有的数据放在一个节点。满足一致性、可用性。

    AP(放弃C):放弃强一致性,用最终一致性来保证。

    CP(放弃A):一旦系统遇见故障,受到影响的服务器需要等待一段时间,在恢复期间无法对外提供服务。
    2P理论(two phase commit)

    二段提交(RDBMS(传统关系型数据库)经常就这种机制,保证强一致性)

    提交步骤:

    阶段1:提交事务请求(投票阶段,任何一个结点失败,不能继续进行提交)

    阶段2:执行事务提交(commit、rollback。任何一个结点失败 rollback)

    3P理论(three phase commit)

    阶段1:是否可以进行事务提交

    阶段2: 提交事务请求

    阶段3:执行事务提交

    怎么保证事务一定提交?

    事务管理器将,所有数据结点list存储,循环执行操作,设立flag标记状态。

    根据flag状态,执行操作或回滚。
    BASE理论

        基本可用(bascially available):在分布式系统出现,允许损失部分可用性(服务降级、页面降级)
        软状态(soft state):允许分布式系统出现中间状态。而且中间状态不影响系统的可用性。
        最终一致性(Eventually consistent):data replications经过一段时间达到一致性。

    Paxos算法

           Paxos算法是莱斯利·兰伯特(英语:Leslie Lamport,LaTeX中的“La”)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。

          Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。

    基于拜占庭将军问题解析:

    分为以下两种角色:

        proposer:参谋1,参谋2(提交者)
        acceptor: 将军1,将军2,将军3(决策者)

    1、先后提议的场景

        参谋1发起提议,派通信兵带信给3个将军,内容为(编号1)
        3个将军收到参谋1的提议,由于之前还没有保存任何编号,因此把(编号1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(ok)
        参谋1收到至少2个将军的回复,再次派通信兵带信给3个将军,内容为(编号1,进攻时间1)
        3个将军收到参谋1的时间,把(编号1,进攻时间1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(Accepted)
        参谋1收到至少2个将军的(Accepted)内容,确认进攻时间已经被大家接收;
        参谋2发起提议,派通信兵带信给3个将军,内容为(编号2)
        3个将军收到参谋2的提议,由于(编号2)比(编号1)大,因此把(编号2)保存下来,避免遗忘;又由于之前已经接受参谋1的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1)
        参谋2收到至少2个将军的回复,由于回复中带来了已接受的参谋1的提议内容,参谋2因此不再提出新的进攻时间,接受参谋1提出的时间

    2、交叉提交场景

    1.参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);
    2.3个将军的情况如下
           a)将军1和将军2收到参谋1的提议,将军1和将军2把(编号1)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok)
            b)负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议
    3.参谋2在同一时间也发起了提议,派通信兵带信给3个将军,内容为(编号2)
    4.3个将军的情况如下
            a)将军2和将军3收到参谋2的提议,将军2和将军3把(编号2)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok)
            b)负责通知将军1的通信兵被抓,因此将军1没收到参谋2的提议
    5.参谋1收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号1,进攻时间1)
    6.2个将军的情况如下
            a)将军1收到了(编号1,进攻时间1),和自己保存的编号相同,因此把(编号1,进攻时间1)保存下来;同时让通信兵带信回去,内容为(Accepted)
           b)将军2收到了(编号1,进攻时间1),由于(编号1)小于已经保存的(编号2),因此让通信兵带信回去,内容为(Rejected,编号2)
    7.参谋2收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号2,进攻时间2)
    8.将军2和将军3收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去,内容为(Accepted)
    9.参谋2收到至少2个将军的(Accepted)内容,确认进攻时间已经被多数派接受
    10.参谋1只收到了1个将军的(Accepted)内容,同时收到一个(Rejected,编号2)
    参谋1重新发起提议,派通信兵带信给3个将军,内容为(编号3)
    11.3个将军的情况如下
           a)将军1收到参谋1的提议,由于(编号3)大于之前保存的(编号1),因此把(编号3)保存下来;由于将军1已经接受参谋1前一次的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1)
           b)将军2收到参谋1的提议,由于(编号3)大于之前保存的(编号2),因此把(编号3)保存下来;由于将军2已经接受参谋2的提议,因此让通信兵带信回去,内容为(编号2,进攻时间2)
            c)负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议
    12.参谋1收到了至少2个将军的回复,比较两个回复的编号大小,选择大编号对应的进攻时间作为最新的提议;参谋1再次派通信兵带信给有答复的2个将军,内容为(编号3,进攻时间2)
    13.将军1和将军2收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去,内容为(Accepted)
    14.参谋1收到了至少2个将军的(accepted)内容,确认进攻时间已经被多数派接受。
    ————————————————
    版权声明:本文为CSDN博主「吴风斌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wuxians/java/article/details/81275441

  • 相关阅读:
    java语言中public、private、protected三个关键字的用法,重写和重载的区别。
    MVC模式中M,V,C每个代表意义,并简述在Struts中MVC的表现方式。
    abstract class和interface有什么区别?
    简单说明什么是递归?什么情况会使用?并使用java实现一个简单的递归程序。
    在项目中用过Spring的哪些方面?及用过哪些Ajax框架?
    简述基于Struts框架Web应用的工作流程
    List、Map、Set三个接口存储元素时各有什么特点?
    mybatis查询时间段sql语句
    Maven pom.xml中添加指定的中央仓库
    为什么需要RPC,而不是简单的HTTP接口
  • 原文地址:https://www.cnblogs.com/cnhk19/p/12890478.html
Copyright © 2020-2023  润新知