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

本贴最后更新于 3336 天前,其中的信息可能已经物是人非
论文在此: "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为消息的不可预测的 延迟部分。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    215 引用 • 358 回帖
  • Sym

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

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

    524 引用 • 4602 回帖 • 731 关注
  • 电影

    这是一个不能说的秘密。

    125 引用 • 610 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    695 引用 • 538 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 693 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 633 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 152 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 443 关注
  • 开源中国

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

    7 引用 • 86 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 702 关注
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 646 关注
  • 博客

    记录并分享人生的经历。

    274 引用 • 2393 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 494 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 436 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖 • 1 关注
  • 又拍云

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

    20 引用 • 37 回帖 • 577 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 46 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 838 关注
  • Tomcat

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

    162 引用 • 529 回帖 • 3 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    950 引用 • 1460 回帖 • 2 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 768 关注
  • 脑图

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

    40 引用 • 157 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 3 关注