理解Paxos Made Practical
Paxos Made Practical
当一个组中一台机器提出一个值时,其它成员机器通过PAXOS算法在这个值上达成一致。
Paxos分三个阶段。
第一阶段:
提出者会选出一个提议编号n(n>0,n的低位应当包括提出者的唯一标识。这样两台机器就不会产生同样的编号),然后会向组内其它成员发送信息PREPARE(n)。成员假设已经见到过PREPARE信息大于n,就会拒绝它;假设已经见到的PREPARE信息n‘ < n(这个提议n’的值假设为v‘),就会回复信息PREPARE-RESULT(n’, v’)。假设这个成员还没有见过不论什么提议。就会回复信息PREPARE-RESULT(0, nil)。假设组内大多数成员(majority)都接受了这个PREPARE(n)信息,就进入PAXOS算法的第二阶段。
第二阶段:
It sets v to the value in the highest-numbered prepare-result it received. If v is nil, it selects any value it wishes for v.(没看懂)
接下来提议者会向其它成员广播消息PROPOSE(n。v)。相同,假设成员已经见过的PREPARE(n‘’)(确定是PREPARE而不是PROPOSE)。n‘’ > n。就会拒绝这个消息;否则,就会接受这个消息,并给提议者一个回复。
假设组内多数(包含提议者自己)都接受了这个PROPOSE消息,提议者会广播消息DECIDE(n,v),这就表示这个组在提议的值v上已经达成一致了。
第三阶段哪里去了?
以下是PAXOS算法在实际中是怎样实现的。
先来了解一下什么是状态机(state machine):是一个能接收请求产生回复的可确定性服务(deterministic service),可确定性服务意思是假设两个状态机拥有同样的初始状态。那么当它们接收到同样序列的请求时会产生同样的回复。
首先。我们要清楚一个复制系统(replication system),如Columbia University的M-SMR。会提供两套库,服务器端(server-side)库和client(client-side)库。前者负责状态机的实现,后者是让client发送请求给状态机然后得到回复。
让我们详细看看服务器端(server-side)库提供的三个函数:

这里说一下run函数的第三个參数
buf execute (buf request);
这是状态机里一个非常重要的组成函数。它负责将请求带给状态机并返回回复。
之前我们说过client库负责用户请求的提交和得到回复(这怎么和server端函数run的參数execute函数的功能一致呢?),假如这时有多个用户请求同一时候到来。client库就须要对这些请求达成一个统一的运行顺序让组内成员去运行,来保证一致性。这里就涉及与组内成员的通信问题。client库是怎样来联系组内各个成员的?也许是RPC。
不幸的是并非全部的RPCserver都是确定性的(deterministic)。举个样例,一个文件server会在一个文件发生写操作后将改动时间记录在文件的inode中。这样即使两个成员机器运行同样的文件server程序并运行同样的写请求,可是它们在运行写操作的时间却无法保证同样,比方都是2014/11/14 23:06。
这样就会在成员之间出现分歧状态。为什么你记录的改动时间比我早十分钟?解决方法是让一个机器记录下自己的改动时间,然后广播给大家。告诉大家都来记录这个时间。
事实上这里改动时间就是一个不确定性值(non-deterministic
value)。还是那个问题client库是通过什么手段来联系组内各个成员的?
看来这个问题是无法解答了。解析来切入正题: Normal-case operation
Normal-case Operation
在一个组里,有一个primary。其它的称作backups,这里有一个术语:view,表示一个拥有primary机器的处于活动状态的机器集合。每个view会有一个view-id来唯一标识,并且view-id是单调递增的,随着每一次view的改变。

上图展示了在正常情况(没有机器增加,没有机器故障)下信息的流动。
这里再引入一个术语:viewstamp,由view-id和timestamp结合而来,primary会给每个到来的请求一个timestamp。这个timestamp就指明了请求被运行的顺序。
相同加强版的viewstamp也表示请求的运行顺序。
理解Paxos Made Practical的更多相关文章
- 理解 Paxos
Paxos是前段时间刚获得图灵奖的大神Leslie Lamport所提出的,是用来解决分布式系统中的一致性问题的算法.该算法对于分布式系统的重要性,在这里不再赘言.了解过Paxos的朋友应该都知道,要 ...
- 一步一步理解Paxos算法
一步一步理解Paxos算法 背景 Paxos 算法是Lamport于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后重新发表到 TOCS ...
- 【分布式协调】之理解paxos
感叹一下 不得不说近几年国内软件行业发生了巨大的变化,之前几乎所有应用都围绕桌面展开,而近几年很多让人神魂颠倒的关键词一个接一个的映入眼帘:web2.0.移动应用.云计算.大数据.互联网的浪潮一波接着 ...
- 通过实例来理解paxos算法
背景 Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有 ...
- 分布式系统(Distributed System)资料
这个资料关于分布式系统资料,作者写的太好了.拿过来以备用 网址:https://github.com/ty4z2008/Qix/blob/master/ds.md 希望转载的朋友,你可以不用联系我.但 ...
- 想从事分布式系统,计算,hadoop等方面,需要哪些基础,推荐哪些书籍?--转自知乎
作者:廖君链接:https://www.zhihu.com/question/19868791/answer/88873783来源:知乎 分布式系统(Distributed System)资料 < ...
- 从事分布式系统,计算,hadoop
作者:廖君链接:https://www.zhihu.com/question/19868791/answer/88873783来源:知乎 分布式系统(Distributed System)资料 < ...
- 分布式理论之一:Paxos算法的通俗理解
维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...
- 四:分布式事务一致性协议paxos通俗理解
转载地址:http://www.lxway.com/4618606.htm 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La" ...
随机推荐
- 牛客noip前集训营(第一场)提高T1
链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个 ...
- LCIS 最长上升公共子序列问题
首先点名一个串叫 L1,另一个叫L2. 明显的是一个DP,那么我们来探讨下如何求得答案. 朴素的算法 首先我们定义状态$dp[ i ][ j ]$表示L1中前i个与L2中前j个的最长公共上升子序列. ...
- TCP socket编程记录(C语言)
最近使用到TCP的socket编程,记录一下思路. TCP Socket 服务器编程思路 0.初始化套接字库 1.创建套接字----------2个(服务器本身需要一个套接字,客户端要返回一个套接字) ...
- Ahoi2014&Jsoi2014 支线剧情
题目描述 题解: 每条边至少经过一次,说明经过下界为$1$. 然后套有源汇上下界最小费用可行流板子. 口胡一下. 此类问题的建图通式为: 1.假设原来的边流量上下界为$[l,r]$,那么在新图中建流量 ...
- 5 SQL 复杂查询
5 复杂查询 5-1 视图 究竟视图是什么呢?如果用一句话概述的话,就是“从SQL的角度来看视图就是一张表”.实际上,在SQL语句中并不需要区分哪些是表,哪些是视图. 那么视图和表到底右什么不同呢?区 ...
- cobbler 无人值守-介绍
cobbler 介绍 快速网络安装linux操作系统的服务,支持众多的Linux版本,也支持网络安装windows系统 PXE的二次封装,将多种安装参数封装到一个菜单 它是由Python编写的 还可以 ...
- redis:安装配置主从
1.安装依赖包 yum install gcc gcc-c++ -y 2.下载安装包,解压 cd /usr/local/src/wget http://download.redis.io/releas ...
- 剑指Offer(书):数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 分析: * 要注意以下几点:* 1.幂为负数时,base不能为0,不然求的时候是对 ...
- Spring Boot 返回Html界面
@Controller public class HelloController { @RequestMapping("/") public String index(){ ret ...
- Uva 11212 编辑书稿(迭代加深搜索)
题意: 给定N个数的序列, 希望将它排列成1~N, 可以用剪切.粘贴来完成任务, 每次可以剪切一段连续的自然段, 粘贴时按照顺序粘贴. #include <bits/stdc++.h> # ...