Java教程

分布式基础:入门理解分布式共识算法paxos

本文主要是介绍分布式基础:入门理解分布式共识算法paxos,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

问题:什么是分布式共识?

  • 理解:分布式共识就是多个应用在某一项决策上达成共识并通过决策,然后将决策应用到每一个应用上。
  • 应用:区块链、redis的哨兵选举机制

问题:如何实现分布式共识?

目前有三种算法:

  • paxos算法:Chubby分布式锁
  • Raft算法:redis哨兵选举机制
  • BTF算法:区块链的应用

问题:paxos的背景理解

  • paxos是由Leslie Lamport 用古希腊Paxos岛的故事模型进行描述的,那个小岛上十分富有,人人都做生意,没有全职的议员,议员不是经常在仪会,面对需要决策的议题时,议员人数每次都不同(分布式节点的加入与离开)。从分布式角度理解:
    • 提议(ID+内容)
    • 议会(集群)
    • 议员(节点)
    • 账簿(持久化结构)
    • 相同ID的提议通过议会选举,最终只有一个能记录下来(达成分布式共识)
  • 主要流程是:针对一个法案,议员(提议者)提出决策,其他议员(投票者)进行投票,投票成功就记录法案。
    • Client(客户端)
    • Leader/Proposer(提议节点):leader可通过Basic Paxos进行选举,leader可以使用优化版的paxos。
    • Acceptor(投票节点)
    • Learner(记录节点)

问题:paxos的局限

  • paxos无法解决拜占庭将军问题,也就是叛徒的问题。就是paxos只能运用在所有节点都是可靠的场景下。
  • 拜占庭将军问题,wiki描述:一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。系统的问题在于,可能将军中出现叛徒,他们不仅可能向较为糟糕的策略投票,还可能选择性地发送投票信息。

问题:paxos算法解决了什么问题?

问题:

  • 分布式节点的数量不稳定(随时离开与加入)。
  • 同一个key不同值并行通过了,或同一个key不同值通过了多次被覆盖。
  • 每个节点(提议者)看到的节点数(投票者)都可能不一样。

解决:

  • 每个投票有唯一的编号(时间戳+节点号)
  • 两次投票的投票者中必须有一个投票者是共同的。
  • 每次投票提议者要通过法案需要他看到的投票者过半进行了投票。
  • 投票者中有人投了其他,那么就会拒绝这个法案,这个法案就应该等于最近一次被成功通过的法案。

问题:paxos的流程是怎样的?

  • 基础版本paxos的流程如下,图片来源于wiki:
    • Client将提议给proposer节点
    • proposer将1号提议发给所有的acceptor节点
    • 如果acceptor节点没有投过其他提议,acceptor就会给proposer一个promise回应并记录下1号提议的信息
    • 当proposer收集齐所有promise确认已经通过了1号提议后,就通知所有的acceptor进行1号提议的写入。
    • 然后learner进行1号提议的记录,然后将提议返回给Client
      在这里插入图片描述

参考:

https://www.cnblogs.com/dennyzhangdd/p/6781688.html
https://blog.csdn.net/u012414189/article/details/90646228
https://www.cnblogs.com/f-zhao/p/6118391.html
https://zh.wikipedia.org/wiki/Paxos%E7%AE%97%E6%B3%95

这篇关于分布式基础:入门理解分布式共识算法paxos的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!