Paxos协议笔记
对Paxos协议的介绍,可以通过Leslie Lamport的《Paxos Made Simple》展开学习和了解。Paxos算法在允许失败的分布式系统环境下,实现系统一致性。失败的情况有很多,譬如由于网络问题导致的通信数据丢失,参与Paxos算法的机器宕机等情况。Paxos算法将分布式系统一致性问题进行抽象,用以解决以下问题:
假设有一群进程,这些进程可提出一些value。使用一种一致性算法,从这些被提出的value中选出唯一一个值value。如果这些进程没有提出过value,那么就说明没有value需要被选出。反之,如果一个value被选出,那么这些进程就需要接受这个value。在此问题上,需要有几个要求需要被满足:
- 仅当一个value被提出之后才有可能选中该value。
- 在整个算法过程中,仅有一个value会被选中。
- 除非一个value被选中,否则任何一个进程都不会知道会选中哪个value。
这里的value可能是任何的消息数据。譬如在分布式系统中选举leader的过程中,value就可以是标记leader的身份标识;譬如在分布式数据库中,value可能是一次操作日志(实际上Paxos算法的整个过程只能选举出唯一一个value,像数据库操作日志这样随时间迁移而变化的值,应该在Paxos算法基础之上加以修改,才能满足需求,譬如multi-Paxos)
参与Paxos算法过程中共有三种角色,这三种角色可以在一个进程中同时存在:
- 提议者(Proposer) 该角色的职能为提出value。
- 投票者(Acceptor) 该角色的职能为参与选择value的过程。
- 学习者(Learner) 该角色的职能为接受value。
Paxos算法证明
一个提议者(Proposer)将会发送一个提议(Proposal)给一群投票者(Acceptors)。当一个投票者(Acceptor)获取到一个提议(Proposal)后,可能接受(accept)该提议(Proposal),也可能拒绝该提议。当一个提议获取了大多数投票者的接受(accept)之后,则认为该提议(Proposal)被选中。
在不保证数据可靠传输的网络环境下,为保证Paxos能够实现一致性需求,因此设定一个要求:
\(P1.\) 一个投票者(Proposer)必须接受(accept)他收到的第一个提议(Proposal)。
但是该要求隐含了一个问题,当多个提议者(Proposers)同时提出多个提议(Proposal)后,每个投票者(Acceptor)都会收到一个提议(Proposal),但可能极有不存在一个“大多数”的投票者(Acceptor)具备相同的提议(Proposal)。因此无法选择其中一个被“大多数”投票者(Acceptors)接受(access)的值。因此一个投票者(Acceptor)必须允许接受(accept)多于一个的提议(Proposal)。为了区分不同的提议(Proposal),因此一个提议(Proposal)应包含一个序号和一个value。不同的提议(Proposal)具有不同的序号。
我们应允许多个提议(Proposal)被选中,但是必须保证这些提议(Proposal)具有相同的value。可通过提议(Proposal)中的序号来保证这个需求的实现:
\(P2\) 如果一个提议(Proposal)的value \(v\)被选中,那么算法后续执行过程中大于这个提议(Proposal)序号的提议(Proposal)若被选中,那么这个后续被选中的提议(Proposal)的value也为 \(v\)
在此条件下,保证了只有单一的value会被选中。要求提议(Proposal)的序号必须是有序的。为了一致性,提议(Proposal)必须至少被一个投票者(Acceptor)接受(accept),因此满足\(P2\)的要求需要满足:
\(P2^a\) 如果一个提议(Proposal)的value \(v\)被选中,那么在算法后续执行过程中,任何一个投票者(Acceptor)所接受的高于当前提议(Proposal)序号的提议(Proposal)中,value的值也为\(v\)
由于一个提议(Proposal)可能被一些没有接受过任何提议(Proposal)的投票者(Acceptor)所接受(accept)。根据\(P1\)的要求,这个投票者(Acceptor)需要接受这个提议(Proposal),但是却违背了\(P2^a\),因此需要对\(P2^a\)进行加强:
\(P2^b\) 如果一个提议(Proposal)的value \(v\)被选中,那么之后每一个提议者(Proposer)发出的高于当前提议(Proposal)序号的提议(Proposal)中,value都为\(v\)。
假设有一些提议(Proposal)已经被选中,证明任何序号n > m的提议(Proposal)的value都为\(v\):
假设每个发出序号在 \([m, n-1]\)之间的提议(Proposal)都具有value \(v\)。既然序号为m的提议(Proposal)被选中了,那么必然有一个集合C,它由“大多数”接受(accept)\(v\)的投票者(Acceptor)组成,可以推出:C中每个投票者(Acceptor)都接受(accept)了序号在\([m,n-1]\)中的一个提议(Proposal),被C中任意一个投票者(Acceptor)所接收(accept)的序号在\([m, n-1]\)中的提议(Proposal)的value都是\(v\)。 因为任何由“大多数”投票者(Acceptor)组成的集合S必然和C存在公共元素。可以通过满足以下条件来确保序号为n的提议(Proposal)的value为\(v\)。
\(P2^c\) 对于任意的n和v,如果一个由n和v组成的提议(Proposal)被发出。存在一个由“大多数”投票者(Acceptor)组成的集合S,要么(a)S中没有一个投票者(Acceptor)接受(accept)序号小于n的提议(Proposal);要么(b)S中的投票者(Acceptor)接受(accept)与当前提议(Proposal)中value相同的提议(Proposal),并且这些已经接受过的提议(Proposal)的最大序号都小于n。
获取已经被接受(accept)的提议(Proposal)非常简单,但是对未来的接受(accept)情况的预测非常困难。为了避免对未来进行预测,提议者(Proposer)通过承诺(Prepare)的方式来实现控制。换句话说,提议者(Proposer)通过预案(Prepare)和承诺(Promise)的方式来与投票者(Acceptor)达成共识:不要接受任何小于n的提议(Proposal)。
Paxos流程说明
Paxos算法执行过程将分为两个阶段。
在第一个阶段过程中,可称为算法的预备阶段:
- 提议者(Proposer)向投票者发起预案(Prepare),预案携带\(K\)值,\(K\)值及预案提出的提议(Proposal)的序号,序号递增并且不能重复,提议者(Proposer)通过预案(Prepare)告知投票者,不要接受(accept)小于\(K\)的提议(Proposal)。
- 投票者(Acceptor)获取到预案(Prepare)后,根据自身已经获取到的提议(Proposal)执行相关操作。
a) 如果投票者(Acceptor)尚未接受(accept)过任何提议(Proposal),则向提议者(Proposer)反馈承诺,承诺该投票者(Acceptor)不再接受小于K的提议(Proposal);
b) 如果投票者(Acceptor)接受过提议(Proposal),取接受过的提议(Proposal)中序号\(K_{Max}\)最大的提议进行进一步分析,如果\(K_{Max} > K\),那么投票者(Acceptor)将告知该提议者(Proposal)拒绝该预案(Prepare); 如果\(K_{Max} < K\) 那么投票者将\(K_{Max}\)的值设置为 \(K\),并将已经接受(accept)过的最大序号的提议(Proposal)封装成为承诺(Promise)返回给投票者(Proposer)。
第二个阶段可称为算法的选举阶段:
- 提议者(Proposer)收到了投票者(Acceptor)发来的响应,如果响应有超过半数的承诺(Promise),则进一步分析:如果回复的承诺(Promise)中全部没有包含之前的提议(Proposal),则将value和预案(Prepare)中的序号K打包成为提议(Proposal)发送给投票者(Acceptor);如果回复的承诺(Promise)中存在之前的提议(Proposal),则将这些之前的提议(Proposal)中最大序号的提议(Proposal)中的value与序号K打包成为提议(Proposal)发送给投票者(Acceptor)。如果回复的承诺(Promise)没有超过半数,则递增序号K,重新执行算法的预备阶段。
- 投票者(Acceptor)若收到提议者(Proposer)发来的提议(Proposal)。首先进行判断发来的提议(Proposal)中序号\(K\)与自身之前接受的提议(Proposal)中最大序号\(K_{Max}\)进行比较:如果\(K < K_{Max}\) 则发回拒绝响应;如果 \(K >= K_{Max}\) 则将\(K_{Max}\)的值设置为\(K\),将\(V_{Max}\) 设置为 \(V\) 并返回接受(accept)响应告知提议者(Proposer)。
- 若提议者(Acceptor)获取到超过半数的接受(accept),则将\(V\)告知所有的学习者(Learner);若提议者(Acceptor)没有获取到超过半数的接受(accept),则重新发起预备阶段。
Paxos协议笔记的更多相关文章
- SRE学习笔记:分布式共识系统、Paxos协议
最近阅读了<SRE Google运维解密>的第23章,有一些感触,记录一下. 日常工作中,我们经常需要一些服务分布式的运行.跨区域如跨城.跨洲部署运行分布式系统往往是容易的,但是如何保证各 ...
- Paxos 学习笔记2 - Multi-Paxos
Paxos 学习笔记2 - Multi-Paxos 图片来自 John Ousterhout 的 Raft user study 系列课程 Multi-Paxos 论文里对很多问题并没有描述清楚,所以 ...
- Paxos协议超级详细解释+简单实例
转载自: https://blog.csdn.net/cnh294141800/article/details/53768464 Paxos协议超级详细解释+简单实例 Basic-Paxos算法 ...
- 11张PPT介绍Paxos协议
之前翻译了<The Part-Time Parliament>一文,论文非常经常,强烈推荐读一读原文.翻译完论文后,希望自己能用简单的描述来整理自己的理解,所以花了一些时间通过PPT的形式 ...
- 蓝牙HID协议笔记【转】
蓝牙HID协议笔记 转自:http://blog.sina.com.cn/s/blog_69b5d2a50101emll.html 1.概述 The Human Interface Devic ...
- LLDP协议、STP协议 笔记
参考: 数据链路层学习之LLDP 生成树协议 LLDP协议.STP协议 笔记 LLDP 提出背景: 随着网络技术的发展,接入网络的设备的种类越来越多,配置越来越复杂,来自不同设备厂商的设备也往往会增加 ...
- paxos协议更新日志
基于Paxos协议的数据同步与传统主备方式最大的区别在与Paxos只需任意超过半数的副本在线且相互通信正常,就可以保证服务的持续可用,且数据不丢失. Basic paxos协议更新日志 我们将数据持久 ...
- MQTT协议笔记之订阅
前言 记忆不太好的时候,只能翻看以前的文章/笔记重新温习一遍,但找不到MQTT协议有关订阅部分的描述,好不容易从Evernote中找到贴出来,这样整个MQTT协议笔记,就比较齐全了. SUBSCRIB ...
- MQTT协议笔记之发布流程
MQTT协议笔记之发布流程 前言 这次要讲到客户端/服务器的发布消息行为,与PUBLISH相关的消息类型,会在这里看到. PUBLISH 客户端发布消息经由服务器分发到所有对应的订阅者那里.一个订阅者 ...
随机推荐
- 一眼看穿flatMap和map的区别
背景 map和flatmap,从字面意思或者官网介绍,可能会给一些人在理解上造成困扰[包括本人],所以今天专门花时间来分析,现整理如下: 首先做一下名词解释---------------------- ...
- ASP.NET Core 1.0 Configuration 配置管理
documentation: https://docs.asp.net/en/latest/fundamentals/configuration.html github: https://github ...
- Android H5调起原生微信或支付宝支付
Android H5调起原生微信或支付宝支付 WebView调用原生微信或支付宝回调:其原理就是在shouldOverrideUrlLoading(final WebView view, String ...
- Vue + Element UI 实现权限管理系统 前端篇(三):工具模块封装
封装 axios 模块 封装背景 使用axios发起一个请求是比较简单的事情,但是axios没有进行封装复用,项目越来越大,会引起越来越多的代码冗余,让代码变得越来越难维护.所以我们在这里先对 axi ...
- Spring Boot(三):Spring Boot 中 Redis 的使用
Spring Boot 对常用的数据库支持外,对 Nosql 数据库也进行了封装自动化. Redis 介绍 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更 ...
- WIN32控件使用系统样式
定义如下即可: #ifdef _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Mi ...
- JS中for循环变量作用域--解决for循环异步执行的问题
被这个问题困惑了很久,终于在网上找到了答案,感谢~ 现在分享给大家~ js中如何让一个for循环走完之后,再去执行下面的语句? 这涉及for循环变量作用域的问题,js中作用域只有函数作用域和全局作用域 ...
- [转]RSReportServer 配置文件
本文转自:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2005/ms157273(v=sql.90) 更新日期: ...
- JWT操作(.net)
1.JWT定义 JWT(Json Web Token)是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的方 ...
- Oracle XE快捷版(速成版)的限制
1.CPU上限:无论把数据库安装在多少核的服务器上,都只会提供一个CPU核心的运算能力 2.安装和执行限制:只能安装一个实例且只能运行一个实例 3.用户数据上限:最大11G的用户数据 4.内存使用上限 ...