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算法——前世的更多相关文章

  1. Paxos算法—前世

    Paxos算法是基于消息传递且具有高度容错特性的一致性算法.我们将从一个简单的问题开始,逐步的改进我们的设计方案,最终得到Paxos,一个可以在逆境下工作的协议. 一.客户端-服务器模型 我们从最小的 ...

  2. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  3. 分布式理论之一:Paxos算法的通俗理解

    维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...

  4. Zookeeper学习之:paxos算法

    paxos算法的重要性众所周知,它给如今的分布式一致性提供了迄今为止最好的解决方案.无论是Lamport自己的论文描述,还是网上的诸多资料,对paxos的描述都是及其简洁的,给人的感觉是paxos看似 ...

  5. 分布式数据库中的Paxos 算法

    分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...

  6. [译] Paxos算法详解

    1. 概述 Paxos算法被用来实现一个容错的分布式系统,一直以来以晦涩难懂著称.这可能是因为该算法最开始使用希腊文表述的.事实上,它是所有分布式算法中最简单易懂的.Paxos算法的本质其实就是一个共 ...

  7. Paxos算法与Zookeeper分析

    1 Paxos算法 1.1 基本定义 算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色: ⑴proposer 提出提案,提案信息包括提案编号和提议的value; ⑵acceptor 收到 ...

  8. Ceph剖析:Paxos算法实现

    作者:吴香伟 发表于 2014/10/8 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Recovery阶段 在Leader选举成功后,Leader和Peon都 ...

  9. Paxos算法细节详解(一)--通过现实世界描述算法

    Paxos分析 最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bit ...

随机推荐

  1. Leetcode 238 Product of Array Except Self 递推

    给出一个数组 nums[i](i = 0,1,...,n-1)  输出数组output[i]满足 output[i] = nums[0] * num[1] * num[2] *..*num[i-1] ...

  2. VC6下深入理解new[]和delete[](在多线程下new和delete的时候,必须选择上多线程库,不然可能造成进程崩溃)

    多少年了,一直处于C与C++混用的状态,申请空间一直用malloc,释放空间一直用free,为什么?因为他们好理解易操作,就如同输出一直用printf而不用<<,输入一直用scanf而不用 ...

  3. easyui Full Layout

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  4. Java 知识笔记 - 类、集合、多线程、IO、JVM(最后一次更新,2019年02月17日)

    目录 Class 内部类.静态内部类.匿名内部类.局部内部类 Collection Java Collection Set Queue Map Collections Arrays System Co ...

  5. sql count(1)不要和查询数据混用 非常耗时

    count(1)不要和查询数据混用 非常耗时 例子: SELECT w.[PKID], COUNT(1) OVER() AS TotalCount FROM w WITH(NOLOCK) INNER ...

  6. 所有语言的Awesome(2)

    Curated list of awesome lists https://awesomeweekly.co https://github.com/sindresorhus/awesome ✨ Pre ...

  7. Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法

    原文:Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法 今天同事在做安装包的时候,有一个读取注册表路径的需求,需要根据 ...

  8. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项。

    “/”应用程序中的服务器错误. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项. 说明: 执行当 ...

  9. 反射:获取枚举类型的Name,Value,Description

    [Obsolete("请使用新的方法XXX")] //使用Obsolete特性来告诉使用者这是一个过期的方法 private static void Test() { Type t ...

  10. spring.net的简单使用(三)创建对象

    这篇主要说对象的创建方式. spring.net提供了三种创建对象的方式,分别是构造器创建,静态工厂创建,实例工厂创建. 多数的情况下,容器会根据对象定义中type属性值去直接调用相应类型的某个构造器 ...