• Basic-Paxos原理


    Basic-Paxos

    //参考paxos made sample

    核心是一致性协议算法.

    问题

    假定一个集合中的提案者可以产生一项决议. 一致性算法保证在提案者中只有一个提案可以形成决议. 如果没有提案形成决议, 那么就不应该有提案内容被提案者学习; 如果有提案形成决议, 那么提案者应该学习提案内容.

    要满足以下三个条件:

    • 已经被提案的值才可能被决议
    • 只有一个提案值可以形成决议
    • 提案者决不会学习一个没有形成决议的提案, 除非改提案已经形成决议

    一致性算法中定义三种角色: proposers(提案者), acceptors(接受者), and learners(学习者).

    假定这些角色可以正常通讯, 非拜占庭场景.

    • 每个角色可以任意速度处理, 可能由于错误停止, 也可能重新开始. 因为所有角色在提案决议后可能失败而重新开始, 所有角色失败而重新开始后一些信息是可以被记住的.
    • 信息可以任意长时间传输, 可以重复, 可以丢失, 但不会损坏.

    决议

    提案者可以给集合内的接受者发送提案, 当超过多数的接受者响应时才可形成提案决议.

    P1. 接受者必须接受其接收到的第一个提案

    在这个条件下, 同一时间不同的提案者可能会产生不同内容的提案, 可能导致所有的接受者接收了一个提案, 但没有任何一个提案形成多数派.

    假定提案包括提案ID和提案内容, 我们允许多个提案可以被选择, 但是需要保证所有决议的提案都必须有相同的提案内容. 这得益于下面的条件.

    P2. 如果提案内容为v的提案被选择, 那么任何高ID的提案内容都是v

    因为提案ID是有序的, 条件P2保证只有一个提案内容会被选择.

    P2a. 如果提案内容为v的提案被选择, 那么任何被接受者接受的高提案ID的提案内容也是v

    P2b. 如果提案内容为v的提案被选择, 那么任何提案者发布的高ID提案内容都是v

    P2c. 对任何的提案内容v, 提案ID为n来说, 如果提案发出, 那么多数接受者组成的集合S, S中没有接受者接受任何提案ID<n的提案, 或者S中的接受者接受了所有提案中提案ID<n提案内容为v的提案)

    换句话说, 提案者要求任何接受者不能接受任何提案ID<n的提案.

    第一阶段Prepare:

    P1a. 提案者发送提案请求

    提案者生成一个全局唯一且递增的提案ID(n), 并且向集群内所有接受者发送prepareRequest(这里无需携带提案内容, 只需要携带提案ID)

    P1b. 接受者应答提案请求

    应答者会做出两个承诺, 一个应答.

    两个承诺:

    • 承诺不再应答提案ID<=n的prepareRequest
    • 承诺不再应答提案ID<n的acceptRequest

    一个应答:

    • 返回接受者已经应答的提案中提案ID最大的提案.

    第二阶段Accept:

    P2a. 提案者发送提案应答

    如果提案者接收到了集群中大多数接受者响应的prepareRequest(ID=n), 那么提案者可以向集群内的所有接受者发送acceptRequest(提案ID为n, 提案内容为v), 提案内容可以是提案中被接受的提案ID最大的提案内容, 或者自己可以随意决定提案内容.

    P2b. 接受者应答提案应答

    如果接受者接收到提案ID为n的acceptRequest, 除非接受者已经应答了提案ID>n的acceptRequest, 否则接受者将会应答该提案应答.

    提案者是可以产生多个提案的, 每一个都追从协议

  • 相关阅读:
    HBase读写数据的详细流程及ROOT表/META表介绍
    HBase的概述和安装部署
    Linux常用命令行补充——持续更新
    电信项目java补充类
    Kafka的接口回调 +自定义分区、拦截器
    Kafka命令行操作及常用API
    Kafka概述及安装部署
    Kafka生产者案例报警告SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    python threading
    python thread
  • 原文地址:https://www.cnblogs.com/renolei/p/5352757.html
Copyright © 2020-2023  润新知