分布式算法2 -- Paxos算法

来源:互联网 发布:java enum的创建 编辑:程序博客网 时间:2024/06/05 21:18
  • 问题描述
    当Client向分布式服务端发送一系列消息时,各个节点之间是相互通信的,但是由于网络等问题,各个服务器收到的消息顺序有可能不一致。
    eg:
    这里写图片描述
    发送的指令顺序是A1、A2、A3。网络问题等,最后变成A2、A1、A3.那么这个时候就造成数据混乱,在分布式环境下很难像单机处理同步问题这么简单。Paxos就是解决这个难点。
  • 原理
    在分布式环境前加入一个FIFO的队列来接收所有的指令。然后所有的服务器节点全部按照这个队列里的序号进行执行,那么问题来了。如果这个队列down掉或者不堪重负怎么办?允许各个client互不影响的情况下,向服务器发送指令。
    大家全部按照选举的方式达成一致, 选举一般是得票者最多的获胜。

  • Paxos选举算法
    1) 当尝试提交指令者被拒绝时(说明它的指令占有序列不是最高的),它会重新以一个更好的序列参与选举。通过各个提交者不断的参加选举,达到大家公认的一个序列。那么这个序列就是胜出者。
    优点:允许各个角色在各个队列中的失败和重复执行,保证在错误发生时仍然得到一致的结果。

  • 场景
    只要是多个过程要达成某种一直的都可以使用Paxos。
    1) 一台机器中多个线程或者进程达成一致
    2) 分布式文件系统或分布式数据,多个客户端并发读写数据
    3)分布式存储中多个副本响应读写请求的一致性。

    eg:执法者在讨论大厅通过法律表达,并通过服务员传递纸条方式交流,每个执法者将通过的法律记录在自己账目上,服务员或者执行者有可能会离开大厅,也不会影响到正常进行的。
    大厅-》分布式系统
    执法者-》节点或进程
    服务员传递纸条-》消息传递
    法律-》保证一致性的值
    执法者和服务员的进出-》节点或进程的加入或失败
    执法者的账目-》节点中的持久化存储设置
    原理:
    每次投票的一群执法人(进程客户端)为法定人数,当法定人数中的所有执法人都咋成这个投票成功就通过。
    投票编号:大小代表选举发起的先后顺序。

  • Paxos 实现
    最有名的就是google chubby,libpaxos,zookeeper。
    可以查看书: Paxos在大型系统中常见的应用场景
    naming service 是paxos最广泛的领域,可参考zookeeper。

下面以客户端调用服务器为场景

http://iunknown.iteye.com/blog/2246484
  • 背景介绍

  • 两个客户端先后调用

    当Client1想执行A,clientB想执行B。顺序是A->B。没有外部因素。
    这里写图片描述

0 0
原创粉丝点击