Time,Clocks,and the Ordering of Events in a Distributed System 读书笔记及个人见解

本贴最后更新于 2732 天前,其中的信息可能已经物是人非
论文在此: "Time, Clocks and the Ordering of Events in a Distributed System" 
 
1、分布式环境中 事件的 偏序关系 happens before 的介绍
 
实际上 时间 是一件难以把握的事情,不知道 你们有没有感觉,在引入业务时间约束的分布式系统里,处理时间是一件特别头疼的事情,因为不同机器的时间是不一定一致的。
而且,我们根本无法精确衡量时间,我们制作出来的钟表,必然在行进过程中存在误差,因此我们定义 happens before 关系的时候,应该要排除掉物理的时钟。
 
happens before 关系本质上是 因果关系,在lamport的设定里,happens before关系具现化如下:
 
happens before 用符号 → 表示,其代表 
1、如果事件a,b都在同一个进程内,如果 代码执行顺序中 a 在 b 之前,那么 a →b
2、进程间可以通过收发信息进行通讯,进程x发信息事件为a,进程y收信息事件为b,那么a->b
3、如果a→b,b→c那么a→c
 
如果 a,b是两个不同的事件,且 a !→ b,b !→ a,那么我们就称a,b是并发的。(超级赞的定义!!!)
 
 
2、一个逻辑时钟算法
时钟可以抽象成 为发生的事件 进行编码的工具,编码 代表 该时间发生的时间。
我们定义C为全局逻辑时钟,一个合理的逻辑时钟产生的 编码 符合以下条件即可:
if a->b then  C(a)<C(b)
 
约束条件很简单,那么对于两个并发的事件a,b,可以设定成 C(a)>C(b),也可以设定成C(b)<C(a),并没有关系,开心就好
 
既然约束条件简单,那么看一下lamport设定的 happens before 关系,可以推出一个逻辑时钟算法如下:
 
我们定义 Ci 为 进程Pi 的时钟,Ci(a)表示 Ci 为事件 a 进行的编码
1.每个进程Pi在任意连续的两个事件之间会增加Ci的值
2.(a)如果事件a代表了进程Pi发送消息m的事件,那么消息m包含的时间戳Tm=Ci(a).
  (b)在收到消息m后,进程Pj会设置Cj的值使得它大于等于它的当前值并大于Tm.
 
 
3、事件严格全序排列算法
有了上述的逻辑时钟算法,我们就可以为所有的事件进行编码,从而得到关于逻辑时间的全序关系
但是上述的算法有可能为不同的进程的并发事件分配同一个时间编码,为了去除这种情况,得到一个关于逻辑事件 的严格的全序关系,lamport给出了以下的算法设定
 
define a relation => as follows: 
if a is an event in process Pi and b is an event in process Pj, then a => b if and only if either (1) Ci(a) < Cj(b) or (2) Ci(a) = Cj(b) and Pi 《 Pj.      (“《”指代啊 进程间任意定义的一个全序关系,例如 进程的编号 )
 
这样 =>就是一个 进程的事件间 严格全序关系。因为逻辑时钟的实现不唯一,因此 这种全序关系 也可以有很多个,只有偏序关系是唯一的。(PAXOS算法也用了这中全序编码算法)
 
那得到这么一个全序关系有什么用?Lamport给我们举了个栗子
 
假设需要一个分布式锁的服务,满足以下需求,
(I) A process which has been granted the resource must release it before it can be granted to another process.拿到锁的进程,在释放锁之前,其他进程都不能获得锁
(II) Different requests for the resource must be granted in the order in which they are made. 获得锁的顺序必须跟锁请求发起的顺序一致。(*而不是接收到请求的顺序)
(III) If every process which is granted the resource eventually releases it, then every request is eventually granted. 如果获得锁的进程最终都都会释放锁的话,那么每一个 锁请求 最终都会请求成功
 
lamport给出了这么一个依赖于 事件全序关系 的算法(这个算法中默认 发送的消息是 按发送的顺序接收到的,且最终一定会接收到的,但这个实现并没在算法中体现,要实现的话,发送序号+ACK就能实现),满足上述需求:
1. To request the resource, process Pi sends the message Tm:Pi requests resource to every other process, and puts that message on its request queue, where Tm is the timestamp of the message. 
2. When process Pj receives the message Tm:Pi requests resource, it places it on its request queue and sends a (timestamped) acknowledgment message to Pi. 
3. To release the resource, process Pi removes any Tm:Pi requests resource message from its request queue and sends a (timestamped) Pi releases resource message to every other process. 
4. When process Pj receives a Pi releases resource message, it removes any Tm:Pi requests resource message from its request queue. . Process Pi is granted the resource when the following two conditions are satisfied: 
   (i) There is a Tm:Pi requests resource message in its request queue which is ordered before any other request in its queue by the relation =>. (To define the relation "=>" for messages, we identify a message with the event of sending it.)
   (ii) Pi has received a message from every other process timestamped later than Tm. 
 Note that conditions (i) and (ii) of rule 5 are tested locally by Pi. 
 
一大串鸡肠,表达的意思实际上是,
1、每个 进程都会保存一个队列,这个队列用于存储自己或者其他进程的锁获取请求,这些请求是按照 全序关系=>排列的。
2、一个进程 Pi 如果他自己的 获取锁请求,Tm:Pi排在最前面,且接收到了其他所有进程的大于 Tm的消息后,那么 进程自身就能认为 自己获得了锁。因为 收到消息的顺序跟发送消息的顺序是一致的,因此收到了其他所有进程大于Tm的消息后,Pi已经收集齐了所有时间小于 Tm的 事件,发现自己的请求Tm:Pi资源请求依然是最小的话,那么,自己必然是 锁 的拥有者。显然,这就满足了 需求(II)
3、释放锁的请求由 资源获得者 Pi发起,发起之后,其余进程才能将各自队列中Pi对应的锁请求消除,因此必然能保证需求(I)
4、因为锁释放的消息最终都传到各个进程中,因此(III)也能满足
 
因此本算法是可以达到指定目标的,但本算法在某个进程宕机时,就无法跑下去了╭(╯^╰)╮
 
 
4、关于逻辑时钟算法的一些异常
 
假设存在一个用上述逻辑时钟保证报名顺序的报名系统中,张三 在系统中报名了后,打电话给 李四,让李四也去系统中报名 这样的话,李四的报名是有可能早于张三的。
因为 打电话这个行为 是在逻辑时钟的系统之外,系统没办法获得   张三报名->打电话,打电话->李四报名 这个信息,因此张三报名和李四报名 在报名系统中,是并发的。
 
要怎么解决这个问题?有两种方法:
1、将打电话这个操作的信息保存到系统中,就是说建立 上面提到的->关系
2、实现一个 强逻辑时钟算法,满足以下条件:在软件系统中的两个事件 a,b,如果 a,b在真实时钟里存在 happens before关系(用-->表示),那么C(a)<C(b)
 
然后Lamport说:
One of the mysteries of the universe is that it is possible to construct a system of physical clocks which, running quite independently of one another, will satisfy the Strong Clock Condition. 
(我们可以构造 多个相互独立运行的物理时钟系统,并让他们协调合作构成一个整体的 符合 强逻辑时钟 的 分布式时钟算法系统)
 
 
5、物理时钟(以下为直接摘抄译文,自己看文章理解的不太好)
 
有效的物理时钟应该有以下特性:
PC1、对于所有的t,dCi(t)/dt≈1,也就是说 存在一个常数k,对于所有的i:| dCi(t)/dt -1|<k
PC2、对于所有的i,j:| Ci(t)-Cj(t)|<e.   e为一个足够小的常数。
 
两个不同的时钟永远都不会以相同的速率走动,这意味着它们之间的偏差会越来越大。因此我们必须要设计一种算法来保证PC2总是成立。但是,首先我们来看一下k和e要多小才能避免异常行为。
 
令u表示满足如下条件的值:如果事件a发生在物理时间t,同时b是发生在另一个进程中的满足a->b事件,那么b肯定发生在物理时间t+u之后。
换句话说,u需要小于进程间消息传输的最短时间。我们可以用进程间的距离除以光速的值作为u的值。(信息传播最快的速度为光速,视乎信息传播形式,传播速度可能远慢于光速)
 
为避免异常行为,我们必须保证对于任意i,j,t:Ci(t+u)-Cj(t)>0
 
现在由上述三条公式推导出 e,k,u的关系:
由 Ci(t+u)-Cj(t)>0 得  Ci(t+u) -Ci(t) + Ci(t)  - Cj(t) > 0 ,  Ci(t+u) -Ci(t)  > -Ci(t)  + Cj(t) .
由 | Ci(t)-Cj(t)|<e 得,-Ci(t)  + Cj(t) 的最大值为 e,因此  Ci(t+u) -Ci(t)  >= e
由| dCi(t)/dt -1|<k, 因此 1+k > dCi(t)/dt > 1-k,--》 Ci(t+u) -Ci(t) > (1-k)(t+u-t)   -->  Ci(t+u) -Ci(t) > (1-k)u 
由 Ci(t+u) -Ci(t) > (1-k)u,说明Ci(t+u) -Ci(t)的最小值可能为(1-k)u, 为了保证Ci(t+u) -Ci(t)  >= e成立, (1-k)u >=e 即可
 
推导的这个公式(1-k)u >=e 可以理解为,最小的信息传达的时间,要大于误差时间。
 
PC1这个条件由我们物理时钟的实现技术保证,典型的由晶体控制的时钟来说,k<=10^-6
 
我们来看看保证PC2实现的算法,即一个物理时钟同步算法
 
证明实在看不下去了,以后有空再回顾一下,说一下结论:
THEOREM.假设一个半径为d的由多个进程组成的强连通图始终满足规则IR1’和IR2’。同时对于任意消息 m,Um<=某常数U,以及任意时刻t>=t0来说:(a)PC1成立.(b)存在常数τ和ε,每τ秒都会有一个消息在不可预测的延迟部分小 于ε的情况下在每条边上传送。那么PC2就能被满足,同时对于所有的t>t0+τd,e≈d(2kτ+ε),这里我们假设 U+ε<<τ。
 
IR1’.对于每个i,如果Pi在物理时间t未收到消息,那么Ci是在时间t就是可微分的并且dCi(t)/dt>0.

IR2’. (a)如果Pi在物理时间t发送了一个消息m,那么m将包含一个时间戳Tm=Ci(t).(b)当在时间t’接收到消息m时,进程Pj将设置Cj(t’) 等于max(Cj(t’-0),Tm+Um).(注:Cj(t’-0)=[limCj(t’-|&|),&->0])

 
m表示一个在物理时间t发送和时间t’被接收的消息。我们定义Vm=t’-t来表示消息m的总延迟。当然,接收消息m 的进程并不知道该延迟。但是我们假设接收进程知道某个最小延迟取值Um>=0,并且Um<=Vm。我们称Em=Vm-Um为消息的不可预测的 延迟部分。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 229 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 549 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 221 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 41 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 345 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 643 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 690 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 4 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 470 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 512 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 2 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 40 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 589 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 374 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 315 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 3 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 25 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 23 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    185 引用 • 318 回帖 • 344 关注