读书笔记 - Time, Clocks and the Ordering of Events in a Distributed System

前言

本文是读完Paper(本文中Paper特指《Time, Clocks and the Ordering of Events in a Distributed System》,下同)后的一些感想,不是译文(推荐阅读原文),感想也纯属一家之言,欢迎指正。
本文按照以下结构组织:首先简单总结下本次阅读的Paper的背景、主要内容和影响;其后介绍下本人读完paper后的一些感想。感想部分主要包含了

  1. 分布式系统中的因果序和相依相对论中因果序的异同
  2. Spanner中的True Time和本文的Physical Clocks的差别,以及Spanner的一个理论缺陷
  3. Logical Clocks和Physical Clocks的本质区别

读过paper的可以直接跳到感想部分。

总结

本Paper是Leslie Lamport老爷子在1978年的时候写的,虽然已经是41年前的Paper了,但是Paper挖掘了分布式系统中的时间的本质,并结合狭义相对论进行深入的分析,给人一种醍醐灌顶的感觉。Paper中提出的"happened before",Logical Clocks,The Partial Ordering,Replicated State Machine等是目前整个分布式理论的基础。本Paper对于现代分布式理论的意义不亚于狭义相对论之于现代物理学。

本Paper在Google Scholar中的引用数为11231,最早发表于“Communication of ACM”,后分别获得了“2000 PODC Influential Paper Award”以及“ACM SIGOPS Hall of Fame Award in 2007” [1]

本Paper的几项重要贡献

  1. 指出了分布式系统中时间的本质,探索了分布式理论的本质
  2. 提出了Logical Clock算法,是后续Vector Clock,HLC等的基础
  3. 提出了Replicated State Machine的理念,是后续Paxos及其应用的基础
  4. 设计了无中心的分布式临界资源算法,是后续多种无中心分布式算法的鼻祖
  5. 设计了时间同步的雏形算法,后续NTP等的基础

本Paper大致分为如下几部分:

1. Happened Before & Partial Ordering

这部分提出了分布式系统中的时间问题。我们生活中感知的事件(Event)发生的先后是依赖于时钟的,而分布式系统 “A distributed system consists of a collection of distinct processes which are spatially separated, and which communicate with one another by exchanging messages.” 中很难包含一个实际的时钟(Wall Clock),同时在多个不同process中的时钟往往不够精确,因此在分布式系统中必须有一套独立的算法来解决时间问题。

分布式系统中如果没有实际的时钟,那么我们能依赖的就只有Happened Before了,即在某些条件下,我们可以确定event A一定在event B之前发生。这里有一个非常重要的理念:在分布式系统中,我们能依赖的只有这种部分事件之间的Happened Before关系,也就是Partial Ordering。在分布式系统中有2种情况是可以建立起Happened Before关系的:

  • 同一个process先后发生的event A和event B
  • 同一个message从event A发送,由event B接收


    分布式系统的时空图

Figure 1中由下往上是时间的流逝,自左往右是不同的空间中的process。Figure 1中的有些event之间是有直接(p1 -> q2)或者间接(p1 -> r3)的happened before关系的;而有些event之间是没有的(p3和q3),因此我们无法确定p3和q3之间的顺序,所以我们说p3和q3是并发的。

Happened Before的理论和狭义相对论中的物理世界中的观念十分的类似,即event的先后是相对的,在实际世界中的不同惯性坐标系下,2个event的先后关系可能发生变化。不过Paper中没有深入的对比,我会在感想部分中深入讨论下

2. Logical Clocks

其实对Happened Before和Partial Ordering的理解才是最重要和最难的,有了Partial Ordering的概念,我们很容易理解Logical Clocks。即我们指定一个全局的逻辑的时钟规则C(x),以保证

Clock Condition. For any events a, b: if a -> b then C(a) < C(b).

这个时钟的规则也相对比较简单

IR1. 同一个process的前后2个event的时间+1
IR2. 当一个process收到另外一个process的message的时候,将本地时钟设置为本地时钟当前值和发送message时间+1的max值

以上规则分别体现了2个Happened Before关系。

3. Total Ordering & Case Study

既然知道了我们唯一能确定的就是Happened Before关系,但是我们在解决现实问题的时候,往往会用到全局序(Total Ordering)。那么我们可以预定义一个process之间的顺序,假设当event的逻辑时间相等时,process1的event永远先于process2的,那么我们就可以确定一个全局序。这里要强调的是Partial Ordering是唯一的,而Total Ordering是不唯一的。
本章举了一个在没有Coordinator的情况下的,分布式临界资源算法。注意这里的分布式临界资源是指没有统一协调者,没有统一等待队列的,需要多个process互相协商的算法。这个算法非常重要,因为这是一个无中心的分布式算法(2PC是有中心的,才有block问题)。几乎所有的无中心分布式算法都是从这个算法演化而来的。同时我们可以通过状态机(State Machine)的思想,将该算法演变成一个完整的分布式系统。Lamport在这里提出的State Machine方案是一个被后人忽视的,但是却十分重要的贡献,甚至在很长时间内大家都没意识到paper中有这方面的贡献,老爷子后来的自述中也提到:

This is my most often cited paper. Many computer scientists claim to have read it. But I have rarely encountered anyone who was aware that the paper said anything about state machines. People seem to think that it is about either the causality relation on events in a distributed system, or the distributed mutual exclusion problem. People have insisted that there is nothing about state machines in the paper. I’ve even had to go back and reread it to convince myself that I really did remember what I had written.

篇幅原因,这个分布式临界资源算法的细节大家参考原文的,有问题可以讨论。

4. Physical Clocks

上面定义的Logical Clocks有一些反常的行为,例如我们定义的Total Ordering是process 1 < process 2的,那么event a(from process 1)和event b(from process 2)的逻辑时间虽然相等,但是在Total Ordering中是C(a) < C(b)。但是现实生活中event a和event b可能是人操作产生的,而event b的操作员操作完成后打电话给event a的操作员操作的。那么Logical Clocks就显著违背了事实。其主要原因是b happened before a这个关系是在非本系统的外部系统中产生的,本系统不掌握这个情况,所以导致了反常。
为避免这种反常,有2中解法:

  • 将外部的happened before关系手动的引入到系统内(event b产生是强调依赖 event a)
  • 引入实际物理时钟

Paper中基于Logical Clock的整体理论,将逻辑时钟的产生替换为了物理时钟,并处理了2个主要时钟误差和其矫正方法:

  • 同一个process的clock在不同时间的流逝误差
  • 不同process的clock的流逝误差
    上文中的Logical Clock的规则变为以下变形:

IR1' . 如果某一时刻t,process没有收到消息,那么它的本地时钟是可微分的,并且其微分值>0 (即时钟正向流逝)
IR2'. 当一个process收到另外一个process的message的时候,将本地时钟设置为略大于本地时钟当前值和发送message时间+最小传输时间的max值

感想

1. 关于偏序(因果序)和狭义相对论

从Lamport总结的分布式系统的时空观和狭义相对论中物理世界的时空观有着惊人的相似。

狭义相对论中关于因果关系的一些结论
  1. 在任何惯性坐标系中,有因果关系的2个事件的顺序都不会颠倒
  2. 如果2个事件在空间上的距离大到光不可能在2个事件的空间位置上发生一次传播,那么这两个事件没有因果序(也就说这种情况下不同的观察者可能看到2个事件不通的先后顺序,这种情况等价于分布式系统的并发事件)
  • 直观的理解就是说2个事件发生的距离大到光不可能发生一次通信,那么这两个事件没有因果关系

以上理论在所有的洛伦兹变换的惯性坐标系中都是成立的,我们可以以一下的方式直观的理解下:

  • 只要event2在发生的时候,已经看到event1发生了,那么他们之间就有因果序
  • 如果event2在发生的时候,event1发生的光还没有射到event2的地点,那么他们就没有因果序
  • 也就是说因为光传播的比较慢,那么只要event1和event2发生的绝对时间间隔(假设存在)小于光在2地传播的时间,那么离event1近的就会看到event1先发生,event2后发生,反之亦然。
  • 但是如果event1和event2发生的绝对时间间隔大于光在2地传播的时间,那么在任何地方肯定是先看到event1
分布式系统中的logic clock和狭义相对论的对应关系
  1. 光是时时刻刻在传播的,而分布式系统中的消息则不是,所以分布式系统更容易出现并发问题。
  • 如果每个process都时时刻刻在向所有其他process发送消息的话,那么分布式系统就是狭义相对论的时空了
  1. 没有happened before关系的2个event,可以认为是并发的,因为就和相依相对论一样,event1和event2(假设在不同的process,如果是在相同的process那就是dx为0,一定存在因果关系)event2在发生之前,看不到event1(没有任何直接/间接的从event1所在的process发出的消息到达event2所在的process),那么event1和event2没有因果关系,他们是并发的。
  • paper中定义了一种任意的两个process的happened before关系来产生一种total order,但是这种total order是不确定的
  • paper最后还是借助了物理时钟(Wall Clock)来强化关系,但是Wall Clock也需要遵循狭义相对论,所以本质上也是偏序,只是在伽利略变换中近似于全局序
  1. 因此整个宇宙只有偏序(因果序/partial ordering)没有全序(total ordering/invariant total ordering of events)
  • 如果要获得全序,那么要保证整个系统在有限的物理空间范围内(例如地球上),同时每个process的2个event保证有足够的时间间隔,以保证整个系统的物理空间范围内都先看到了前面的event(产生了因果序),而这种全序本质上也是因果序

2. 关于Spanner中的True Time和本文的Physical Clocks

Spanner中的True Time和本Paper中最后的Physical Clocks非常的相似。但是本文中的Physical Clocks是有一些限制的例如时钟不能倒退,同时通过系统内的message进行时钟修正,这也是在当时的硬件条件下的理想方案,而True Time通过系统外的消息进行修正(GPS),同时优化了协议。

  1. True Time引入了物理硬件(原子钟和GPS)来限制最大误差(Paper
    中的微分误差k和process间误差e)
  2. True Time引入了Commit Wait来解决没有系统内消息同步以后,带来的process间误差。

同时根据狭义相对论,因为物理的时钟也是偏序的,只有可能在限制物理范围,并且保证event间间隔的情况下才有可能变成全局。因此完整的True Time理论严格来说应该有这部分的论证。

由此想到的很多经典论文中的方案,可能当时来看是难以实现的,但是随着硬件的发展,稍加优化以后,可能会带来系统性的突破。

3. Paper中Logical Clocks和Physical Clocks的本质

从本质上来说文章的Logical Clocks和Physical Clocks本质上是一样的都是通过消息来产生Happened Before的偏序,再依赖这个偏序确定整个系统的因果序/全序。虽然我们从狭义相对论中知道,“当2个事件只要在光可到达的时间差外先后发生,那么它们就有因果关系”,但是2个物理时钟并不能因此产生同步,还是需要有外部机制来产生同步,例如:NTP,GPS。可惜的是在1978年 NTP(1988年)和GPS(1989年商用)都还没发用,所以Lamport设计了这个时钟同步的雏形算法。
2者的不同是:

  • Logical Clocks是通过系统内的消息建立因果序,并且其时间戳是逻辑的
  • Physical Clocks是通过系统内外的消息建立全序(本质也是因果序),并且其时间戳是物理的

说到这里必须要提HLC了,HLC本质上是Logical Clocks而非Physical Clocks,这个下篇文章详细说吧

参考

  1. Time, Clocks and the Ordering of Events in a Distributed System
  2. https://www.microsoft.com/en-us/research/publication/time-clocks-ordering-events-distributed-system/
  3. https://en.wikipedia.org/wiki/Special_relativity
  4. Spanner: Google’s Globally Distributed Database
  5. Logical physical clocks

你可能感兴趣的:(读书笔记 - Time, Clocks and the Ordering of Events in a Distributed System)