• 记录:Paxos原理、历程及实战


    转载原文:

    http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=403582309&idx=1&sn=80c006f4e84a8af35dc8e9654f018ace&3rd=MzA3MDU4NTYzMw==&scene=6#rd

    Paxos 协议简单回顾

    主备方式处理数据库高可用问题有上述诸多缺陷,要改进这种数据同步方式,我们先来梳理下数据库高可用的几个基本需求:

    1. 数据不丢失

    2. 服务持续可用

    3. 自动的主备切换

    使用Paxos协议的日志同步可以实现这三个需求,而 Paxos 协议需要依赖一个基本假设,主备之间有多数派机器(N / 2 + 1)存活并且他们之间的网络通信正常,如果不满足这个条件,则无法启动服务,数据也无法写入和读取。

    我们先来简单回顾一下 Paxos 协议的内容,首先,Paxos 协议是一个解决分布式系统中,多个节点之间就某个值(提案)达成一致(决议)的通信协议。它能够处理在少数派离线的情况下,剩余的多数派节点仍然能够达成一致。然后,再来看一下协议内容,它是一个两阶段的通信协议,推导过程我就不写了(中文资料请参考这篇 Http://t.cn/R40lGrp ),直接看最终协议内容:

    1、第一阶段 Prepare (Proposer:PrepareRequest , Acceptor:PrepareResponse

    P1a:Proposer 发送 Prepare

    Proposer 生成全局唯一且递增的提案 ID(Proposalid,以高位时间戳 + 低位机器 IP 可以保证唯一性和递增性),向 Paxos 集群的所有机器发送 PrepareRequest,这里无需携带提案内容,只携带 Proposalid 即可。

    P1b:Acceptor 应答 Prepare
    Acceptor 收到 PrepareRequest 后,做出“两个承诺,一个应答”。

    两个承诺:

    • 第一,不再应答 Proposalid 小于等于(注意:这里是 <= )当前请求的 PrepareRequest;

    • 第二,不再应答 Proposalid 小于(注意:这里是 < )当前请求的 AcceptRequest;(用于二阶段确认)

    一个应答: PrepareResponse

    • 返回自己已经 Accept 过的提案中 ProposalID 最大的那个提案的内容,如果没有则返回空值;

    注意:这“两个承诺”中,蕴含两个要点:

      1. 就是应答当前请求前,也要按照“两个承诺”检查是否会违背之前处理 PrepareRequest 时做出的承诺;

      2. 应答前要在本地持久化当前 Propsalid。

    2、第二阶段 Accept Proposer:AccpetRequest , Acceptor:AcceptResponse 

    P2a:Proposer 发送 Accept
    “提案生成规则”:Proposer 收集到多数派应答的 PrepareResponse 后,从中选择proposalid最大的提案内容,作为要发起 Accept 的提案,如果这个提案为空值,则可以自己随意决定提案内容。然后携带上当前 Proposalid,向 Paxos 集群的所有机器发送 AccpetRequest。

    P2b:Acceptor 应答 Accept

    Accpetor 收到 AccpetRequest 后,检查不违背自己之前作出的“两个承诺”情况下,持久化当前 Proposalid 和提案内容。最后 Proposer 收集到多数派应答的 AcceptResponse 后,形成决议。

    这里的“两个承诺”很重要,后面也会提及,请大家细细品味。

  • 相关阅读:
    实时计算平台构建
    Windows操作系统下VirtualBox开机自启动软件和虚拟机
    MacOS系统下VirtualBox开机自启动软件和虚拟机
    Maven命令,添加忽略SSL证书校验
    三层架构之业务层逻辑层
    Web网站开发中,Cookie是什么?
    三层架构之数据访问层
    三层架构之模型层
    ASP.NET与.NET Framework和C#的关系
    三层架构之表现层
  • 原文地址:https://www.cnblogs.com/yunlion/p/7844510.html
Copyright © 2020-2023  润新知