本文来自论文:Paxos Made Practical

Paxos在实现上有三步:

1)proposer S1 选择一个提案编号n,这个编号要包含提议者机器的唯一标识,这样两个不同的机器就不会有相同的提案编号。proposer将信息PREPARE(n)广播出去。收到这个信息的机器会要么拒绝(已经收到大于n的PREPARE信息),要么回复PREPARE-RESULT(n', v')(已经收到的信息最大编号n' < n,且value为v'),要么回复PREPARE-RESULT(0, nil)(该机器在收到这个信息之前没有收到任何提议)。如果多数派接受这个PREPARE信息,提案者进入第二步。

2)如果回复的是PREPARE-RESULT(n', v'),S1将提案的value设置成v';如果回复的是PREPARE-RESULT(0, nil),那么value可以随便定。然后提案者S1会广播信息PROPOSE(n, v),跟第一步一样,收到这个信息的机器要么拒绝(已经收到信息PREPARE(n''),其中n'' > n),要么接受。

3)如果多数派(包括提案者)接受这个PROPOSE信息,提案者S1会广播DECIDE(n, v)来表示group已经在这个提议上达成一致。

其实这里有个问题,在fault-tolerant系统里,新机器来旧机器去。这样我们之前所提的多数派是指旧的机器集,还是新的机器集,还是两者都包含? 新的集合是如何保证安全的? 如果机器出错了,并且没有新的机器收到DECIDE信息该怎么办?

在介绍使用Paxos算法的论文中,有一篇是Viewstamped Replication,但是它有两个问题:1)很难搞懂如何去复制一个简单的系统:2)它假设机器集是固定的,未考虑动态的加入和退出。接下来我们的论文就是要详细阐述如何使用Paoxs,并去解决Viewstamoed Replication的局限。

首先我们来看一下状态机,在这里它是确定性的(deterministic),所以如果有两个相同的状态机从一个相同的初始状态开始,并接受相同的请求序列,那么他们就会生成相同的回复。一个复制系统要有两套库,服务端的和客户端的。在服务端提供三个函数:

id_t  newgroup (char *path);

id_t  joingroup (id_t group, char *path);

int  run (char *path, sockaddr *other_cohort, buf (*execute) (buf));

newgroup函数用来创建状态机。如果想加入一个组,就调用joingroup。run的第三个参数execute就是状态机的实现。

在客户端会有一个与execute相对应的函数invoke:

buf  invoke (id_t group, sockaddr *cohort, buf request);

一般借助RPC来实现execute。不幸的是,并不是所有的RPC服务器都是确定性的。例如,当文件服务器收到写文件请求,它就会设置文件节点的修改时间,这样即使两台机器运行同样的文件服务器代码,并实行同样的写请求,然而最终它们在这个相同的写操作上却具有不同的时间值,于是就出现了分歧状态。我们可以这样来解决:让一台机器去定下这个不确定的时间值,然后再让其他机器按照这台机器的标准去执行。为此我们引进一个新的函数choose:

buf choose (buf request);

它联合新的execute函数:

buf  execute (buf request, buf extra);

在我们这个文件服务例子中,首先让一台机器执行choose,选出一个修改时间,放入buffer中,choose函数返回这个buffer,之后执行execute,它的第二个参数extra就是buffer中的内容(即修改时间)。也就是说,对一个请求,先调用choose,在一台机器上选出那些会引起分歧的值作为结果返回,之后便将这个结果广播给其他机器作为execute的参数去执行,这样便做到了一致性。

►Normal-case operation

在服务器组中有一台机器是primary,而其它的都标记为backup,术语view用来表示一个有着指定primary的处于活动中的cohort的集合(cohort是指机器组中的一台机器),我们的系统为每一个view分配一个独一无二的view-id,每当发生view changes(即生成新的view),view-id都会自动增加。先来看一个流程图:

Client发送请求给primary,primary会记录请求,并将请求广播给其它的backups,backups记录操作OP并给primary返回一个确认信息。如果primary知道多数派(包括它自己)都已经记录了操作OP,它会执行操作OP,并将结果返回给client。下面详细谈一下:

在开始发送请求前,client一定要知道服务器组当前的primary和view-id,要知道这些信息需要client知道服务器组中每一个cohort的身份,这里不做讨论。下面是client发送给primary的请求:

这里看一看vid,它是当前cohort集的view-id,它的存在是为了当发生view changes时,避免新的primary重新执行该请求。Primary在接受到请求后,会给每个请求附一个时间戳,到时在一个view中的请求序列就按时间的先后依次执行。如果将view-id和时间戳结合成viewstamp就能给所有请求(不论是否在一个view)标记执行顺序。在primary发给backups的信息replicate_arg中,会存在这个viewstamp用来标识这个请求的执行顺序,此外还有一个viewstamp叫committed,比它小的viewstamp,都已经执行完请求并返回给clients,这样当primary返回给client的信息丢失或primary突然出故障时,只需从committed之后开始重新执行。

Backups会记录下primary发过来的请求,而之前我们提到的时间戳会帮助backups避免遗漏掉操作,当请求被记录下后,backups才会发送确认信息。之后当primary接受到多数派的确认信息后,就会去执行请求,并将结果返回给client。但这里有一个疑问:backups不用执行请求吗?

►View-change protocol

因故障进行view changes创建新view的过程类似Paxos,都是首先提出一个新的view-id,然后提出新的view。下面的Figure 4就是这个view-change协议的过程:

当view manager(提出view-id的cohort)选出新的view-id时,它会给其它的cohorts发送一个view_change_arg信息,之后就是通过你发我回来选出新的view和primary。

►Optimizations

文章提出模型的一个优化是:协议要求所有的请求都要广播给backups,其中包括只读操作,不过本文采取的优化是如果backups中的多数派承诺60秒不形成新的view,primary会暂时答复只读请求,而不用再广播给backups。另一个优化是:如果要检测出一个故障,至少需要三台replicas,我们可以减少到两台replicas,而让第三台机器充当一个观察者的角色,即正常情况不会参与执行请求,只有当出现故障或network partition时再加入一致性协议来跟其他两台机器形成一个view。

Paxos Made Practical相关推荐

  1. 实战案例丨分布式系统中如何用python实现Paxos

    本文分享自华为云社区<实战分布式系统-python实现Paxos>,原文作者:Leo Xiao . 一致性算法背景:Paxos 一致性算法解决的问题:分布式系统中数据不能存在单个节点(主机 ...

  2. 关于Paxos的历史

    感谢phylips@bmy ---------------------------- 关于Paxos的历史 作者:phylips@bmy 出处:http://duanple.blog.163.com/ ...

  3. 想从事分布式系统,计算,hadoop等方面,需要哪些基础,推荐哪些书籍?--转自知乎...

    作者:廖君 链接:https://www.zhihu.com/question/19868791/answer/88873783 来源:知乎 分布式系统(Distributed System)资料 & ...

  4. Raft 一致性算法论文译文

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...

  5. 分布式共识算法丨Raft丨Raft-Extended 论文翻译

    Raft-Extended 翻译 原文:https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf 辨析 consensus vs consis ...

  6. Raft 一致性算法论文

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...

  7. 分布式(技术栈、关键技术、PaaS平台、资料推荐、相关论文)

    2019独角兽企业重金招聘Python工程师标准>>> 分布式系统架构的冰与火 首先,我们需要阐述一下为什么需要分布式系统,而不是传统的单体架构.也许这对你来说已经不是什么问题了,但 ...

  8. In Search of an Understandable Consensus Algorithm(寻找可理解的共识算法)

    原文见 Raft Consensus Protocol 题目:In Search of an Understandable Consensus Algorithm 作者:Diego Ongaro an ...

  9. 分布式系统(Distributed System)资料

    分布式系统(Distributed System)资料 <Reconfigurable Distributed Storage for Dynamic Networks> 介绍:这是一篇介 ...

最新文章

  1. python培训出来的有公司要吗-参加Python培训后真的能找到工作吗?上海Python培训...
  2. 机器人学习--University of Alberta自主机器人导航课
  3. 计算机应用基础随堂,《计算机应用基础》随堂题库
  4. 留言条.html .js来完成
  5. 夏门大学的计算机专业排第几,2019厦门大学专业排名
  6. 微型计算机相关的英文文献,微型计算机控制系统--------外文文献翻译
  7. 灰色关联法 —— python
  8. 【API进阶之路6】一个技术盲点,差点让整个项目翻车
  9. 2019年上海地区最新JAVAEE开发面试与笔试题
  10. Delphi2007下cxComboBox乱码.
  11. nmap扫描服务器端口不稳定,端口扫描命令nmap
  12. 微博上看到的,小白兔系列
  13. Linux下QtCreator不能使用搜狗输入法输入中文
  14. 机器学习笔记1-What is Machine Learning
  15. Android读出Excel报表数据然后导出写入到SQLite数据库
  16. 简单猜年龄游戏Python代码
  17. 以盒马生鲜为例,如何玩转线上线下电商门店经营模式?
  18. MATLAB中同一路径下同文件的末尾继续写入数据
  19. IDEA查看jks文件
  20. afn访问本地html,请求接口AFN报错1016,failed:unacceptablecontent-type:text/html解决办法...

热门文章

  1. 传统基本图像处理方法:图像增强(灰度变换、直方图增强、空间域滤波、频率域滤波)、图像分割、图像配准等
  2. dagger2系列之Scope
  3. 湖北公安机关出台10条措施服务民营经济发展
  4. java 计算性能,性能计算公式
  5. Vue 计算时间差,几分钟之前、几小时前、几天之前、几个月前
  6. FP-Tree的Python实现
  7. 培训计算机心得体会800字,职业技能培训心得体会800字(精选5篇)
  8. 机器学习第四篇:详解决策树算法
  9. 第69节:Java中数据库的多表操作
  10. Linux 查看CPU信息,机器型号,内存等信息