Paxos

定义2.1  票:即弱化形式的锁。它具备下面几个性质:

  • 可重新发布:服务器可以重新发布新票,即使前面发布的票没有释放。
  • 票可以过期:客户端用一张票来给服务器发送命令请求时,只有当这张票是最新的票才会被服务器接受。

从票的性质中我们可以得出如下结论:

  • 客户端崩溃导致死锁的问题得到解决,因为服务器可以发布新票,从而不影响其他客户端。
  • 票可以避免死锁的问题,那么如何实现票,可以使用计数器来实现,客户端向服务器获取票的请求时,我们给计算器加1. 当客户端下次再拿服务器端分配的票时发送命令请求,服务器端可以根据该票与服务器端的票(计数器)比对来判断其是否过期,

算法2.1   朴素的基于票的协议。

  阶段1

1: 客户端向所有的服务器请求一张票

  阶段2

2:  if 收到过半数服务器的回复  then

3:        客户端将获得的票和命令一起发送每个服务器

4:      服务器检查票的状态,如果票仍然有效,则存储命令并给客户端一个正反馈信息

5:else

6:         客户端等待,并重新进入阶段1

7:    end if

    阶段3

8:    if 客户端从过半数服务器处得到了正反馈  then

9:              客户端告诉所有的服务器执行之前存储的命令

10:   else

11:          客户端等待,然后重新进入阶段1

12:   end if

该算法是有问题的:

  • 假设客户端  u1 是第一个获得大多数服务器正反馈的客户端。但是u1很慢,在告知所有服务器执行先前存储的命令(c1)(算法第9行命令)之前,这时u2更新了部分服务器的票以及存储了c2命令,这时,执行第9行命令时会导致数据不一致的状态,部分服务器执行了命令c1,部分服务器执行了命令c2。
  • 如何解决以上的问题呢?如果在阶段1中服务器不但发布票还发布服务器存储的命令,当u2更新票时,发现服务器端已经存储了命令c1,这时,客户端u2可以不要求服务器存储命令c2,而是继续存储命令c1,这样两个客户端都尝试执行相同的命令c1,谁先谁后则不在重要。
  • 其次不同的服务器可能存放不同的命令。在阶段1中。客户端需要支持哪一个命令?1.对于获得大多数服务器端都支持的命令,则支持改命令,否则,选择存储票据最新的命令。票可以使用计数器变量来代替,最新的票,则计数器值最大。
  • 每个服务端都自己生产票号的话,则最新的票号不一定是最大的。服务器端的票号会存在重复的情况。如果由客户端自己来生成票号,这个问题可以得到解决。
  • 我们需要全局一致的票号,因此不能由每个服务器自己维护一个本地的计数器来产生票号。一个巧妙的办法是让客户端自己来生成票号t,然后向所有的服务器请求编号为t的票。服务器在收到请求后,先将t和它本地的计数器进行比较,只有t大于本地的计数器时,服务器才会发布票(编号为t),同时将其本地计数器的值更新为t。这样就可以得到全局一致的产生票号的方法。这就是下面paxos算法所使用的方案。

算法 2.2  Paxos

客户端(提案者)                                                                                    服务器(接收者)

初始化………………………………………………………………………………………………………………………………………………………………

c ——等待执行的命令                                                                                T(max) = 0  —— 当前已发布的最大票号

t = 0  —— 当前尝试的票号                                                                         C = NULL   ——  当前存储的命令

               T(store) = 0  ——  用来存储命令C的票

阶段1……………………………………………………………………………………………………………………………………………………………………

1:t = t + 1

2: 向所有服务器发消息,请求得到编号为t的票

3:  if t > T(max)   then

4:         T(max) = t

5:          回复ok(T(store),C)

6: endif

阶段2………………………………………………………………………………………………………………

7: if 过半服务器回复ok  then

8:     选择T(store)值最大的(T(store),C)

9:     if  T(store) > 0  then

10:             c = C

11:    endif

12:    向这些回复了 ok的服务器发送消息:propose(t,c)

13:    endif

14:  if  t = T(max).   then

                                    15:         C = c

                                                         16:         T(store) = t

                                                         17:          回复:success

                                                         18:  endif

阶段3 ………………………………………………………………………………………………………………

19:  if  过半服务器回复  success  then

20:     向每个服务器发送消息:execute(c)

21: endif

  • 与前面算法不同的是,这个算法没有明确客户端从哪个位置可以跳转到阶段1并开始新的尝试。实际上客户端可以在算法的任何位置取消当前尝试并开始新的一轮的尝试。
  • 在阶段1 与阶段2 中如果票已经过期,可以让服务器发送负的反馈,这样可以提高性能,不必等到过半服务器发送正反馈超时而重新尝试。
  • 连续两次尝试之间的等待时间可以随机函数确定,可以缓和不同结点之间的竞争。

paxos算法—今生的更多相关文章

  1. paxos算法——今生

    Paxos 定义2.1  票:即弱化形式的锁.它具备下面几个性质: 可重新发布:服务器可以重新发布新票,即使前面发布的票没有释放. 票可以过期:客户端用一张票来给服务器发送命令请求时,只有当这张票是最 ...

  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. nginx常规扩展功能

    功能 语法 配置位置 配置举例 结果验证 备注 文件读取 sendfile on|off ===>(提高读取静态文件效率.直接通过系统内核将文件放入socket,不必再打开一遍) http.se ...

  2. Linux 中find命令

    1.在当前目录下找以txt结尾的文件 find . -name '*.txt' 2.在当前目录下找以所有字母开头的文件 find . -name '[a-z]*' 3.在/etc 目录下找以host开 ...

  3. 【西北师大-2108Java】第二次作业成绩汇总

    2[西北师大-2108Java]第二次作业成绩汇总 以命令行方式或在Eclipse集成开发环境中编辑.编译.运行第3章示例程序3-1-3-5,结合程序运行结果理解程序代码,每个示例程序从语法.算法两个 ...

  4. Mybatis全局配置文件详解(三)

    每个基于Mybatis应用都是以一个SqlSessionFactory实例为中心.SqlSessionFactory实例可以由SqlSessionFactoryBuild获得,而SqlSessionF ...

  5. JDOJ1178:铺地板II

    JDOJ1178:铺地板II https://neooj.com/oldoj/problem.php?id=1178 题目描述 用1 x 1和2 x 2的磁砖不重叠地铺满N x 3的地板,共有多少种方 ...

  6. php 学习笔记之日期时间操作一箩筐

    格式化日期时间 date : 格式化日期时间 场景 将当前日期时间或者特定日期时间格式化输出为特定格式的字符串,常用于人性化展示信息. 说明 返回给定时间戳格式化后所产生的日期时间字符串,如果没有给出 ...

  7. C++ 回调函数的多种用法

    什么是回调函数, 就是以函数指针做参数传递给另一个函数称之为回调函数, 字面意思很简单, 但就这几个字想理解回调函数, 那又很难.因此别就这这字面意思, 只要知道怎么用, 在什么情况下用就行了 什么场 ...

  8. 第01组 Beta版本演示

    目录 1.1 本组成员 1.2 工作流程.组员分工.组员工作量比例 1.3 GitHub 项目链接 1.4 本组 Beta 冲刺站立会议博客链接汇总 1.5 燃尽图 1.6 原计划.达成情况及原因分析 ...

  9. HTML连载18-id选择器与class区别&class选择器使用思路&后代选择器

    一.id选择器和classable选择器的区别 选择器 CSS中的开头 HTML标签可以绑定几个 是否可重复 用途 id选择器 # 仅能一个 不可以重复(一个标签里仅有一个) 一般情况下是给JS用的, ...

  10. PCL学习之:将超声数据按照PCL点云方式发布出去

    前言:基于2D激光雷达的机器人,想让它跑自动导航,众所周知有2个比较明显的缺陷,1,那就是普通的激光雷达无法对玻璃或是镜面物体有反映; 2,机器人避障时只能对某一个平面的物体有反映,超过或者低于这个平 ...