Paxos算法—前世
Paxos算法是基于消息传递且具有高度容错特性的一致性算法。我们将从一个简单的问题开始,逐步的改进我们的设计方案,最终得到Paxos,一个可以在逆境下工作的协议。
一、客户端-服务器模型
我们从最小的分布式系统开始,在这个系统中,只有两个结点,客户端结点与服务端结点,客户端结点能够操作(存储或更新)远程服务器结点上的数据。
算法1.1 朴素的客户端/服务器算法:客户端每次向服务器发送一条命令。
在存在消息丢失的消息传递模型中,该算法却不能很好的工作,客户端不能确认消息是否正确的被服务器所接受。因此我们需要对其进行一些小的改进。
算法1.2 待确认的客户端/服务器算法
1.客户端向服务端发送一条请求命令消息。
2.服务端接受请求并回复确认信息。
3.客户端在一定的时间范围内,没有收到服务器端发送的请求确认信息的回复,则重新发送命令请求信息。
- 该算法描述了,客户端在发送一条请求命令后,在收到服务端的确认回复前,是不会发送下一条请求命令。
- 客户端在发送的过程中消息可能丢失,服务端在回复的确认消息时,消息也可能丢失,对于服务端确认消息的丢失情况,在到达一定超时时间后,客户端未收到确认回复,会重新发送消息,此时该消息已经被服务器端处理,所以我们需要有一种机制能够保证消息的幂等性。例如给消息加上序列号。
- 该算法可以很容易的扩展到多服务器端的场景,客户端发送命令请求给每一个服务器端,当收到所有服务器的确认消息,就可以认为这条命令执行成功。
- 如何处理多个客户端的场景?
定理1.1 如果算法在多个客户端与服务端运行,服务器收到的命令顺序可能是不同的,这会导致不一致的状态。
假设在如下的场景中,存在客户端c1,c2 ,服务端 s1,s2. 服务端s1,s2存在相同的值x = 0。 如果此时 c1,向服务器s1,s2 发送 x = x + 1. 在同一时刻 c2 向服务器 s1,s2 发送 x = 2*x. 假设c1 先于 c2 到达 s1 ,则此时s1的状态值x为 2, 而 c2 先于 c1 到达 s2 , 则此时 s2 的状态值x为 1. 导致集群的状态不一致。
定义1.1 (状态复制)对于一组结点,如果所有结点都以相同的顺序执行命令序列 c1,c2,c3,c4……,则这组结点实现了状态复制
- 状态复制是分布式系统的基本特征
- 因为单个系统天然实现状态复制,可以令单个服务器系统实现序列化器,自动对请求进行排序来分发命令,从而实现状态复制。
算法1.3 借助单一的串行化器实现状态复制
1. 所有的客户端将请求命令发送到串行化器
2.串行化器逐个处理客户端请求,并将客户端请求逐个发送给所有服务器
3.当串行化器接受到所有服务器的确认消息时,它将返回给对应客户端命令执行成功的消息。
- 这个想法有时也被成为主从复制。
- 改算法存在单点故障。串行化器
- 我们是否可以构造一个更分布式的方法来解决状态复制的问题。去掉串行化器。任何时刻最多只有一个结点可以发送请求命令,是否可以采用互斥或各自加锁的思想?
算法 1.4 两阶段锁
阶段 1 :
客户端向所有服务器请求获取锁
阶段 2:
if 客户端获得所有服务器的加锁请求
客户端以可靠的方式向所有服务器发送命令请求,释放锁
else
客户端释放已经获取的锁,休眠一段时间,进入阶段 1
- 算法 1.4 是否能够很好的应对结点崩溃呢?在该算法中要求所有的服务器结点都必须能够正常的工作
- 如果仅获取部分服务器的锁能否工作,获得过半数服务器的锁是否就足够了?
- 如果超过两个以上的客户端试图获取超过半数服务器的锁,怎么应对死锁的问题,是否需要释放已经获取的服务器锁,如果客户端在释放锁之前就发生了故障,怎么办,是否需要一个与锁不同的概念。
下一节中我们将从弱化的锁机制来引出paxos算法 。
Paxos算法—前世的更多相关文章
- Paxos算法——前世
Paxos算法是基于消息传递且具有高度容错特性的一致性算法.我们将从一个简单的问题开始,逐步的改进我们的设计方案,最终得到Paxos,一个可以在逆境下工作的协议. 一.客户端-服务器模型 我们从最小的 ...
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
- 分布式理论之一:Paxos算法的通俗理解
维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...
- Zookeeper学习之:paxos算法
paxos算法的重要性众所周知,它给如今的分布式一致性提供了迄今为止最好的解决方案.无论是Lamport自己的论文描述,还是网上的诸多资料,对paxos的描述都是及其简洁的,给人的感觉是paxos看似 ...
- 分布式数据库中的Paxos 算法
分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...
- [译] Paxos算法详解
1. 概述 Paxos算法被用来实现一个容错的分布式系统,一直以来以晦涩难懂著称.这可能是因为该算法最开始使用希腊文表述的.事实上,它是所有分布式算法中最简单易懂的.Paxos算法的本质其实就是一个共 ...
- Paxos算法与Zookeeper分析
1 Paxos算法 1.1 基本定义 算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色: ⑴proposer 提出提案,提案信息包括提案编号和提议的value; ⑵acceptor 收到 ...
- Ceph剖析:Paxos算法实现
作者:吴香伟 发表于 2014/10/8 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Recovery阶段 在Leader选举成功后,Leader和Peon都 ...
- Paxos算法细节详解(一)--通过现实世界描述算法
Paxos分析 最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bit ...
随机推荐
- nginx配置中root和alias的区别
例:访问http://127.0.0.1/download/*这个目录时候让他去/opt/app/code这个目录找. 方法一(使用root关键字): location / { root /usr/s ...
- 利用Git生成本机SSH Key并添加到GitHub中
本地仓库和github之间是通过SSH加密传输的,所以需要先到github中添加你本机的SSH Key 进行认证. 1.在桌面打开git命令窗口 2.输入“ssh-keygen -t rsa -C ...
- Monkey小白入门篇
一.monkey简介 中文名:猴子 职业:压力测试小工具 用途:对待测Android应用程序进行压力测试,测试app是否会crash Android官方描述: The Monkey is a prog ...
- angular设置全局变量,修改监听变量
创建service.module.ts import { NgModule, ModuleWithProviders } from '@angular/core'; import { SomeShar ...
- LinkCutTree学习笔记
LinkCutTree 学习笔记 参考来源 https://www.zybuluo.com/xzyxzy/note/1027479 https://www.cnblogs.com/zhoushuyu/ ...
- rabbitmq 添加用户
参考博客 https://www.rabbitmq.com/access-control.html rabbitmqctl add_user admin admin rabbitmqctl set_p ...
- 用Node.js给邮箱发送邮件
首先我们需要做的是下载发送邮件的包 cnpm install nodemailer --save 然后写发送邮件的代码,代码如下: 实现原理是:用你的邮箱给其他邮箱发送邮件,所以这里需要填写你的邮箱和 ...
- .net core session部分浏览器或移动客户端不可用
.net core session使用有很多文章,这里不再赘述. 问题现象为大部分浏览器或者移动客户端(例如微信.支付宝.钉钉)等都可以正常使用.但部分支付宝用户及钉钉用户确无法使用. 写入后读取不到 ...
- Elasticsearch搜索调优权威指南 (2/3)
本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/AAkVdzmkgdBisuQZldsnvg 英文原文:https://qbox.io/blog/el ...
- Vue.js 源码分析(二十三) 指令篇 v-show指令详解
v-show的作用是将表达式值转换为布尔值,根据该布尔值的真假来显示/隐藏切换元素,它是通过切换元素的display这个css属性值来实现的,例如: <!DOCTYPE html> < ...