分布式经典论文之一分布式系统中的时钟时间以及事件时序.docx
- 文档编号:28001451
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:18
- 大小:30.57KB
分布式经典论文之一分布式系统中的时钟时间以及事件时序.docx
《分布式经典论文之一分布式系统中的时钟时间以及事件时序.docx》由会员分享,可在线阅读,更多相关《分布式经典论文之一分布式系统中的时钟时间以及事件时序.docx(18页珍藏版)》请在冰豆网上搜索。
分布式经典论文之一分布式系统中的时钟时间以及事件时序
分布式经典论文之一:
分布式系统中的时钟、时间以及事件时序
[
序:
时间是一个很抽象的概念,爱因斯坦说时间是幻觉,马赫(ErnstMach)说:
我们根本沒有能力以时间來测量事物的变化,相反的,我们是透过事物的变化因而产生时间流动的抽象概念。
那么在分布式系统中是如何定义时序的呢?
这篇论文进行了讨论,该论文首先通过定义一整套逻辑时钟系统对所有事件进行ordering,然后通过解决一个资源互斥访问问题说明了如何将此应用到分布式系统中,并引入了状态机复制的方法。
之后又由逻辑时钟所存在的一个问题引出了物理时钟的使用,由于物理时钟本身会存在偏差,又给出了一个物理时钟同步算法,并给出了一个关于物理时钟同步的定理。
该论文于1978年7月发表在”CommunicationofACM”上,并于2000年获得了首届PODC最具影响力论文奖,于2007年获得了ACMSIGOPSHallofFameAward。
关于该论文的贡献是这样描述的:
本文包含了两个重要的想法,每个都成为了主导分布式计算领域研究十多年甚至更长时间的重要课题。
1.关于分布式系统中事件发生的先后关系(又称为clockcondition)的精确定义和用来对分布式系统中的事件时序进行定义和确定的框架。
用于实现clockcondition的最简单方式,就是由Lamport在本文中提出的”logicalclocks”,这一概念在该领域产生了深远的影响,这也是该论文被引用地如此之多的原因。
同时它也开启了人们关于vector和matrixclock,consistentcuts概念(解决了如何定义分布式系统中的状态这一问题),stableandnonstablepredicatedetection,认识逻辑(比如用于描述分布式协议的一些知识,常识和定理)的语义基础等方面的研究。
最后,最重要的是它非常早地指出了分布式系统与其他系统的本质不同,同时它也是第一篇给出了可以用来描述这些不同的数学理论基础(“happenbefore”relation)。
2.状态机方法作为n-模块冗余的一种通用化实现,无论是对于分布式计算的理论还是实践来说,其非凡的影响力都已经被证明了。
该论文还给出了一个分布式互斥协议,以保证对于互斥区的访问权限是按照请求的先后顺序获取的。
更重要的是,该论文还解释了如何将该协议用来作为管理replication的通用方法。
从该方法还引出了如下问题:
a)Byzantineagreement,那些用来保证所有的状态机即使在出错情况下也能够得到相同输入的协议。
很多工作都是源于这个问题,包括fastprotocols,impossibilityresults,failuremodelhierarchies等等。
b)Byzantineclocksynchronization和orderedmulticastprotocols。
这些协议是用来对并发请求进行排序并保证得到相同的排序结果,通过与agreement协议结合可以保证所有状态机都具有相同的状态。
关于这篇论文,作者LeslieLamport自己有这样的描述:
“JimGray曾经告诉我他听到的关于该论文的两种观点,一种是觉得该论文太普通了,另一种则认为该论文太绝妙了。
对此,我并不想争辩什么。
这篇论文的灵感实际上是源自于PaulJohnson和BobThomas写的一篇名为”TheMaintenanceofDuplicateDatabases”的文章。
他们在这篇文章中提出了在分布式系统中为消息使用时间戳的想法。
只是因为我本身恰巧对狭义相对论有比较深刻的理解,这使我敏锐地察觉到他们所做的工作的本质。
狭义相对论告诉我们时空中的事件并不存在一个始终如一的全序关系;不同的观察者对两个事件谁先发生可能具有不同的看法。
当且仅当事件e2是由事件e1引起的时候,事件e1和e2之间才存在一个先后关系。
我意识到PaulJohnson和BobThomas采用的算法的本质是通过时间戳来提供一个事件的全序关系,而这本质上与事件间的因果关系是一致的。
这个想法实在是太绝妙了,意识到这点后,其他的都显得很简单了。
由于PaulJohnson和BobThomas并没有理解他们真正所在做的事情,因此他们的算法并不完全正确,那个算法允许一些会打乱因果关系的异常行为的发生。
我赶紧记录下了关于这个问题的这些想法,并修正了他们的算法。
之后,我很快就意识到该定义事件全序关系的算法可以用来实现任意的分布式系统。
一个分布式系统可以描述为一个特殊的具有多个由网络互联的处理器的串行状态机。
如果能够对输入请求进行全排序,就能够实现任何由网络互联的处理器组成的状态机,因此也就可以实现任意的分布式系统。
为了表明这一点,论文采用了一个我能想到的最简单的分布式系统实例—分布式互斥算法作为例子。
该论文也是我的论文中被引用最多的。
很多计算机科学家都声称读过。
但是我碰到的人中,很少有人意识到该论文在说状态机相关的东西。
看起来他们认为该论文是在讲分布式系统中事件的时序关系,或者是分布式互斥算法。
有些人还坚持声称该论文根本跟状态机无关,搞得我甚至重新回头读下这篇文章来确定我确实记得我写了什么。
该论文中描述了逻辑时钟的同步方法。
之后我又开始思考另一个问题,即真实时钟的同步问题,并由此引入了一个关于真实时钟同步的理论。
同时我也惊奇地发现要提供证明太困难了,当然这也为后面的Byzantineclocksynchronization{!
即论文Byzantineclocksynchronization}提供了一些基础,只是那已经是另一个故事了。
”
另外在一次采访中,当提问者问到“你认为你的哪个贡献对现代计算机科学与产业具有最大的影响力?
”,LeslieLamport是这样回答的“我的引用量最多的文章是“Time,Clock,andOrderingofEventsinaDistributedSystem”,我不知道这和你说的影响是不是一回事,因为我并不能从该文章直接指导出许多工作,但可能它影响了人们思考分布式系统的方法。
我认为我在工业界还没有太多影响,虽然我期望Paxos和状态机方法将在分布式系统设计上有重要影响。
在微软内部已经可以看到这一点(Lamport目前在微软研究院工作)”。
这个回答还是很谦虚的,随着海量数据处理需求的增加,在各种分布式系统大行其道的今天,Paxos及各种分布式算法已经发挥着越来越重要的作用,感觉也该给Lamport一个图灵奖了,只是不知道还要等几年。
除了这篇,LeslieLamport还发表了其他一些关于time,clock在分布式系统中应用的文章,”TheImplementationofReliableDistributedMultiprocessSystems”(1978),”UsingTimeInsteadofTimeoutforFault-TolerantDistributedSystems”(1984),“Byzantineclocksynchronization”(1984),“SynchronizingClocksinthePresenceofFaults”(1985)等。
另外看时钟同步这个问题,在该论文中也涉及了时钟同步技术的原理,方法及应用。
在该论文发表后的1981年,人们提出了InternetClockProtocol(RFC778),这是最早提出的Internet时间同步协议;1983年提出了TimeProtocol(RFC868),该协议可以精确到1s;1988年提出了NTP协议(NetworkTimeProtocolRFC1059),在广域网内使用NTP协议进行同步,可以达到几十毫秒的精度,在局域网内精度可以达到0.1毫秒;1996年,又提出了NTP协议的简化版SNTP(RFC2030),它可以用于对时间精度要求比较低的场景。
2000年11月,IEEE成立网络精密时钟同步委员会,2002年9月通过了IEEE1588标准,IEEE1588PTP协议借鉴了NTP技术,具有容易配置·、快速收敛以及对网络带宽和资源消耗少等特点。
IEEE1588标准的全称是“网络测量和控制系统的精密时钟同步协议标准(IEEE1588PrecisionClockSynchronizationProtocol)”,简称PTP(PrecisionTimingProtocol),基本构思是通过硬件和软件将网络设备(客户机)的内时钟与主控机的主时钟实现同步,提供同步建立时间小于10μs的运用(应该是单链路内的),与未执行IEEE1588协议的以太网延迟时间1000μs相比,整个网络的定时同步指标有显著的改善。
近来Google发表的Spanner中提到的TrueTimeAPI,这也是实现该系统各重要feature的基础。
要真正理解TrueTimeAPI在这篇论文中的重要意义,就得了解为何要得到事件的一个全序关系,得到这样的关系可以做什么,以及如何得到这样的一个关系。
读完这篇论文,就能发现其实早在30多年前LeslieLamport就开始考虑这些问题,而且当时的思考已经非常深刻,即使是在今天看来,这些思考依然是如此深刻和富有远见。
而关于时钟同步这个问题,实际上历史要更为悠久,即使是在LeslieLamport发表这篇论文时,人们已经进行了非常多的研究。
]
摘要
在本文中我们审视了分布式系统中,某事件发生在另一事件之前这一概念,并展示了如何用它来定义事件间的偏序关系(partialorder)。
给出了一个可以对具有逻辑时钟的系统进行同步的算法,通过逻辑时钟可以得到事件的全序关系(totalordering)。
通过作为解决同步(synchronizing)问题的一种方法,我们展示了totalordering的使用方法。
进一步地,该算法还可以被特化用来解决物理时钟的同步问题,同时我们推导出了时钟可能达到的不同步的一个误差范围。
关键词:
分布式系统计算机网络时钟同步多进程系统
导引
对于我们的思维来说,时间是一个非常基础的概念。
它实际上源于更基础的概念--事件发生的顺序。
如果某件事情在我们的时钟指示在3:
15且还未指示3:
16之前,我们就是这件事发生在3:
15。
事件的时序概念遍布在我们对系统的思考中。
比如,在一个航线预订系统中,我们会这样表述,如果预订请求是在该航线被分配出去之前发出的,那么该请求应该得到授权。
但是,我们将看到对于分布式系统中的事件来说,需要对这个概念重新仔细地进行审视。
一个分布式系统由一系列在空间上分离的多个进程组成,这些进程相互之间通过交换消息进行通信。
一个由互联的计算机组成的网络系统,比如APRA网,就是一个分布式系统。
单个计算机也可以看做是由中央处理单元,内存单元,IO通道这些独立处理单元组成的分布式系统。
如果消息传输延迟与单个处理单元内部事件时间间隔相比差别明显,那么该系统就可以认为是分布式的。
本文中我们主要关注由空间上分离的多个独立计算机组成的系统。
但是,我们的很多观点都可以应用在更普遍的情况。
特别地,一个单个计算机上的多进程系统所涉及的问题实际上也非常类似于分布式系统所涉及的那些,因为在这样的系统上某些事件也可能是以不可预测的顺序发生的。
在分布式系统中,有时候很难去说两个事件谁先发生。
而”发生在前(happenbefore)”这一关系只是定义了分布式系统中的事件的一个偏序关系(partialordering)。
我们发现人们经常由于没有意识到这一点及其所代表的含义,而导致一些问题的发生。
在本文中,我们讨论了由”发生在前(happenbefore)”这一关系所定义的事件的偏序关系(partialordering),同时给出了一个分布式算法,该算法可以将其扩展以得到一个所有事件的全序关系。
该算法提供了一个实现分布式系统的非常有用的机制。
我们通过使用它来实现一种解决同步问题的简单方法来展示它的使用方法。
不幸的是,如果通过该算法得到的事件排序与用户感知到的不同,可能会发生一些异常行为。
该问题可以通过引入实际的物理时钟来避免。
我们提出了一种对这些时钟进行同步的简单方法,同时推导出了时钟偏差可能达到的一个误差范围。
ThePartialOrdering
绝大多数人都会这样想,如果事件a发生的时间比b早就说事件a发生在事件b之前。
同时他们可能还会声明这里的时间是指物理上的时间。
但是如果要真的得到一个正确的描述,还得加个限定,这里的事件是指在系统内所观察到的。
如果描述中的时间是指物理时间,那么系统中还需要包含真实的时钟。
即使系统中包含了真实的时钟,仍然存在问题,因为这些时钟并不是完全精确的,也就无法保持精确的物理时间。
因此我们会在不引入物理时钟的情况下定义”发生在前(happenbefore)”关系。
首先,我们把系统定义地更精确些。
我们假设系统由一系列进程组成。
每个进程包含一系列事件。
事件的定义取决于应用程序,比如计算机上的一个子程序的执行可以看做是一个事件,而单个计算指令的执行也可以看做是一个事件。
我们假设进程中的事件形成了一个序列,如果a”happenbefore”b那么在序列中a就会出现在b之前。
换句话说,在组成单个进程的事件集合是全序的,这也比较符合单个进程的实际情况。
(注:
关于事件组成的定义可能会影响到进程内对事件的排序。
比如消息的接收可能只是设置了计算机中的一个中断位,然后再由子程序处理这个中断,由于中断的处理并不一定按照它们产生的顺序,这样这个设定就会影响到进程的消息接收事件的顺序)。
当然我们也可以对我们的定义进行扩展,从而将单个进程划分为多个子程序,但是我们并没有必要搞这样麻烦。
我们假设消息的发送和接收也是进程中的一个事件。
下面我们就可以定义”happenbefore”关系,简写为”->”,如下所示:
Definition.在系统中的事件集合上的”->”关系,是满足如下三个条件的最小关系:
(1)如果a和b是同一个进程中的事件,并且a在b前面发生,那么a->b。
(2)如果a代表了某个进程的消息发送事件,b代表另一进程中针对这同一个消息的接收事件,那么a->b。
(3)如何a->b且b->c,那么a->c。
{!
这里的关系实际上就是离散数学中的关系,通常一个关系具有的性质有自反性,传递性,反自反性,对称性,反对称性,(3)说明”->”关系具有传递性,此外下文还会指出该关系不具有自反性}。
如果两个不同的事件a,b满足a(!
->)b且b(!
->)a,我们就说a与b是并行发生(concurrent)的。
我们假设对于任意事件a,a(!
->)a{!
一个事件本身可以发生在其自身之前的系统本身也没有什么物理意义}。
这意味着”->”是一个在系统的所有事件集合上的不具备自反性的偏序关系。
通过在如图1那样的时空图上来理解下这个定义会比较有帮助。
在图中,横轴代表了空间,纵轴代表了时间—坐标值越大时间越靠后。
点代表了事件,垂直线代表了进程,曲线代表了消息(注:
从图中可以看出消息可能会被乱序地收到。
虽然我们允许将多个消息的发送看做是一个事件,但是为了方便起见,我们还是假设单个消息的接收不会与其他消息的接收和发送重合)。
很容易看出,a->b意味着可以在图中沿着进程线和时间线从a到达b。
比如,图1中,p1->r4。
也可以换一种方式来理解该定义,比如可以认为a->b意味着是事件a导致了事件b的发生。
如果两个事件相互之间没有因果关系,我们就认为它们是并行发生(concurrent)的。
比如图1中的p3和q3就是concurrent的。
尽管图画地让人觉得q3比p3发生的物理时间要早,但是进程P在p4那一点收到消息之前是根本不知道进程Q何时执行了q3的。
(在事件p4之前,P进程最多能知道计划要在q3做的事情)。
这个定义对于那些熟悉狭义相对论时空观的人应该会显得比较自然。
在相对论中,事件间的顺序是通过可能被发送的(couldbesent)消息来定义的。
但是,我们采用了更实用的方法,只考虑那些实际中真的被发送的(actuallyaresent)消息。
{!
在狭义相对论中,如果事件a是事件b的原因的话,那么在任何坐标系中,事件a都是b的原因,那么看到的都会是a先发生然后b发生。
当然事件间存在因果关系也是有条件的,需要事件间的时空距离,足以让光速可达,比如如果两个事件的空间距离非常大,而时间距离非常小,以至于光速无法在这个时间内到达,那么这两个事件就不可能存在因果关系,参考狭义相对论基础教程}。
当然如果知道了那些实际发生的事件,我们就可以判断系统是否工作正常,而不需要知道那些可能会发生的事件。
LogicalClocks
现在我们将clocks引入到系统中。
首先我们从一个抽象的方式开始,只将clock作为为事件分配编号的方式,在这里编号就被看做是事件发生的时间。
更准确地说,我们将每个进程的clockCi定义为一个为进程中的任意事件a分配编号Ci(a)的函数。
那么整个时钟系统就可以通过一个为事件b分配编号C(b)的函数C来表示,如果b是进程Pj中的一个事件,那么C(b)=Cj(b)。
目前为止,我们没有因为编号方面的事情引入任何关于物理时钟的假设,因此时钟Ci可以看成是一个逻辑时钟而不是物理时钟。
它们可能是通过某些没有使用任何计时机制的计数器实现的。
我们现在来考虑对于这样一个时钟系统的正确性的涵义。
我们不能将定义的正确性基于物理时间之上,因为这需要引入持有物理时间的时钟。
我们的定义必须基于事件发生的顺序。
最强的合理的条件是,如果事件a发生在另一个事件b之前,那么a发生的时间应该早于b。
将该条件更形式化地表述如下:
ClockCondition.对于任意事件a,b:
如果a->b,那么C(a)<C(b)。
需要注意的是,我们不能期望该条件的逆命题{!
即如果C(a)<C(b),那么a->b}也成立,因为这将意味着任意两个concurrent的事件必须发生在同一时间。
比如在图1中,p2和p3都与q3是concurrent的,如果逆命题也成立,那么这就意味着它们两个都与q3发生在同一个时间,而这将与ClockCondition矛盾,因为p2->p3。
通过定义可以很容易看出关系”->”定义如果要满足ClockCondition需要满足如下两个条件:
C1.如果a和b都是进程Pi里的事件,并且a在b之前,那么Ci(a)<Ci(b)
C2.如果a是进程Pi里关于某消息的发送事件,b是另一进程Pj里关于该消息的接收事件,那么Ci(a)<Cj(b)
现在我们再在时空图中考虑下该时钟。
假设进程的时钟”ticks”(滴答)会穿过所有数字,同时滴答发生在进程的事件之间。
比如,如果a和b是进程Pi中相继发生的两个事件,同时Ci(a)=4且Ci(b)=7,那么在这两个事件之间时钟会滴答过5,6,7。
如果我们划出一条滴答虚线使它可以连接所有进程滴答发生的点,那么图1的时空图就会变成图2。
条件C1意味着在同一进程线上任意两个事件之间都至少存在着一条滴答线,与此同时条件C2意味着每条消息线一定会跨越至少一条滴答线,容易看出这两个条件意味着ClockCondition的成立。
我们可以将时钟滴答线作为在时空上的Cartesian坐标系的时间轴。
这样我们就可以重绘图2中,将滴答线拉直就得到了图3。
图3是对图2所描述事件的另一种合法的描述方式。
如果不把物理时间引入到系统中(这需要引入物理时钟),是没有办法去判断这些图中的哪个更好地表示了系统的情况。
读者可能会发现如果将这些进程可视化为一个二维空间网络,这样呈现出来的就是一个三维的时空图。
进程和消息仍然使用线来表示,那么滴答线就变成了一个二维平面。
{!
可以这样理解,三维空间的三个坐标轴:
x,y,z,xy代表了空间坐标,代表了进程所在的平面空间坐标位置,z轴代表了时间,进程线是一个垂直于xy平面与z轴平行的直线,该线上的点代表了进程在该点对应的z轴坐标即时间点上的事件,消息线则是连接进程线上的事件点的直线,这些线上的点,代表了对应时间,消息在平面空间上所处的位置。
}
现在我们假设进程就是代表了它们执行过程中特定行为的算法和事件。
下面我们展示如何为进程引入满足ClockCondition的时钟。
进程Pi的时钟是由一个寄存器Ci来表示,那么Ci(a)就代表了在事件a发生时所得到的Ci的值。
Ci的值会在事件之间发生变化,因此Ci的改变本身并不包含任何事件。
为保证系统时钟可以满足ClockCondition,我们需要确保它满足条件C1和C2。
条件C1很简单,进程只需要遵守如下的实现规则即可:
IR1.每个进程Pi在任意连续的两个事件之间会增加Ci的值
为满足条件C2,我们要求每个消息m都包含一个时间戳Tm,Tm等于该消息发送时的时间。
在接收到包含时间戳Tm的消息后,进程必须调整它的时钟使得它必须晚于Tm。
更准确地说,我们需要如下规则:
IR2.(a)如果事件a代表了进程Pi发送消息m的事件,那么消息m包含的时间戳Tm=Ci(a).(b)在收到消息m后,进程Pj会设置Cj的值使得它大于等于它的当前值并大于Tm.
在条件IR2(b)中,我们认为代表消息m被接收的事件发生在Cj被设置之后{!
?
原文是:
“InIR2(b)weconsidertheeventwhichrepresentsthereceiptofthemessagemtooccurafterthesettingofCj.(Thisisjustanotationalnuisance,andisirrelevantinanyactualimplementation.”这一段如何理解,经whisper提醒,感觉这一段应该这样理解,消息m被接收与Cj被设置是两个独立的事件,这里只是在概念上定义消息接收事件发生在进程设置Cj值之后,这样就肯定能保证消息接收事件的Cj(b)>Ci(a)即Tm,因为设置Cj时确保当前值大于Tm,而消息接收事件发生在设置之后,更应该大于等于Tm}。
很明显,IR2保证了条件C2的满足。
因此,IR1和IR2保证了ClockCondition的满足,这样它们就保证了得到的是一个正确的逻辑时钟系统。
OrderingTheEventsTotally
我们可以使用一个满足ClockCondition的时钟系统来获取系统中所有事件的一个全序关系。
我们只是简单地根据事件发生的时间来对它们进行排序。
为了打破平局的情况,我们使用了进程间的任意的一个全序关系“<”。
具体来说,我们定义一个新的关系“=>”如下:
假设a是进程Pi中事件,b是进程Pj中的事件,那么当且仅当满足如下条件之一时:
(1)Ci(a)<Cj(b);
(2)Ci(a)=Cj(b)且Pi<Pj,那么我们就认为“a=>b”。
容易看出这样就定义了一个全序关系,同时ClockCondition意味着:
如果a->b那么a=>b。
换句话说,关系“=>”是将”happenbefore”偏序关系扩展成全序关系的一种方式。
“=>”所依赖的时钟系统并不是唯一的。
不同的满足ClockCondition的时钟系统选择将会产生不同的关系“=>”。
给定任意一个全序关系“=>”,都会有一个满足ClockCondition的时钟系统可以用来产生该关系
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分布式 经典 论文 之一 系统 中的 时钟 时间 以及 事件 时序