[Paper Reading] Logical Physical Clocks and Consistent Snapshots in Globally Distributed Databases

Date: 202103

目录

===== 1. Introduction

===== 1.1 Brief history of time

===== 1.2 Contributions of this work

===== 2. Preliminaries

===== 3. HLC: Hybrid Logical Clocks

===== 3.1 Problem statement

===== 3.2 Deacription of the Naive Algorithm

===== 3.3 HLC Algorithm

===== 3.4 Properties of HLC

===== 4. Resilience of HLC

===== 4.1 Self-stabilization

===== 4.2 Masking of synchronization errors

===== 5. Experiments

===== 6. Discussion

===== 6.1 Snapshots

===== 6.2 Compact Timestamping using l and c

===== 7. Conclusion


文章立意在解决分布式系统中的时间戳问题,实践中我们经常需要基于某个物理时间来拿到一个一致性的快照状态,而目前的时间戳算法都不能很好的满足。

  • 物理时间基于NTP同步,而NTP同步存在跳变,不能确定因果关系
  • 逻辑时间脱离了与物理时间
  • TrueTime 对硬件&协议又有着强依赖

所以本文提出HLC,可以做到通用性,同时能像LC一样确定因果关系,同时又与PT相关联。随之将目标细化:

  • 要求1:e hb f --> l.e < l.f // 能像LC一样确定因果关系
  • 要求2:Space requirement for l.e is O(1) // 时钟的空间复杂度是O(1),不能像向量时钟那样是o(n)的(n是系统中节点个数)
  • 要求3:l.e is represented with bounded space // 单个时钟是有界的,不能无限增大。LC是无限增大的
  • 要求4:l.e is close to pt.e, i.e. , |l.e - pt.e| is bound // 接近物理时钟(与物理时钟的差保持在一定的界限内)。
    • PT的时钟同步有不确定性,所以没法支持用户在指定时间点进行快照。而HLC接近PT(在PT跳变时间容忍内),同时又可以确定因果关系,所以HLC可以支持指定时间点快照

随后提出了确定的HLC算法,如Figure 5中,并给出了相关的证明逻辑。Section 4.1 中提出给 l - pt & c 均设置一个边界值,来更好的保护算法。并在Section 5中提供了一些基础的实际验证,来证明 l -pt & c 是可控的

最后在 6.2 中也提出了 l&c 的compact方式(为了兼容NTP),l使用前48bit来提供ms级别支持,c使用后16bit提供上限65536的事件并发能力

【Vector Clock[7]  J. Fidge. Timestamps in message-passing systems that preserve the partial ordering. Proceedings of the 11th Australian Computer Science Conference, 10(1):56–66, Feb 1988.

【Logical Clock[12] L.Lamport.Time,clocks,andtheorderingofevents in a distributed system. Communications of the ACM, 21(7):558–565, July 1978.

【Vector Clock[19] F. Mattern. Virtual time and global states of dis- tributed systems. Parallel and Distributed Algo- rithms, pages 215–226, 1989.

【Spanner、TrueTime】[2] J. Corbett, J. Dean, et al. Spanner: Google’s [15] globally-distributed database. Proceedings of OSDI,
2012.

===== 1. Introduction

===== 1.1 Brief history of time

Logical clock (LC). 逻辑时钟 是1978年Lamport提出的一种分布式系统中时间排序方式[12]LC从物理时间中分离出来,节点没有权限访问时钟,对消息延迟&节点处理速率也没有限制

while being beneficial for the theory of distributed systems, LC is impractical for today’s distributed systems

LC虽然有利于分布式理论的发展,但是在当今的分布式系统中是不现实的:

  1. 使用LC无法查询与物理时间相关的时间
  2. LC假设所有的通信都发生在当前系统中,并且没有反向通道(没有反向通道什么意思?

 

Vector clock (VC). 向量时钟在1988年被提出[7,19],是一个向量版本的LC。

VC maintains a vector at each node which tracks the knowledge this node has about the logical clocks of other nodes.

VC在每个节点上维护一个向量,其跟踪该节点已知其他节点逻辑时钟的信息。

While LC finds one consistent snapshot (that with same LC values at all nodes involved), VC finds all possible consistent snapshots, which is useful for debugging applications.

LC可以找到一个一致性的快照,VC可以找到所有可能的一致性快照,这对debug很有用

LC只会认为(a,w)是一个一致性快照,但是VS会认为(b,w) & (c,w)也是一个一致性的快照

但是VC对于存储空间的要求是十分高的(与节点数强相关)

 

Physical Time(PT). 物理时间基于NTP[20]进行时钟同步。但是时钟同步是不完美的,可能存在跳变。所以和LC相比,PT可以使用物理时间,但是也存在一些问题:

  1. 因为不确定时间的重叠,不能确认事件顺序关系。// NTP在公网可能会有几十毫秒的延迟,理想情况下在局域网可以保持1ms的精度,但是受到网络影响,可能会导致100ms延迟甚至更大
  2. PT可能会有时钟跳变[13,14] 或者 非单调的更新[8]。可能会导致时钟go back

 

True Time(TT). 真实时间是Google最近提出用于部署Spanner[2]使用的。其依赖精心设计的紧密时钟同步,并且每个集群都提供了GPS时钟&原子钟。TT规避了LC/VC/PT的一些问题,但是:

  1. 强依赖硬件&自定义构建的时钟同步协议
  2. 如果TT用来确定事件顺序关系,由于TT基于时钟同步来完成,所以为了满足这个要求,需要进行等待

 

HybirdTime(HT). 混合时间结合了VC&PT[10],用来解决稳定因果顺序合并问题(?)。HT在每个节点上维护了一个VC,包含其一直的其他节点的PT。利用PT时钟同步假设来较少VC的entry,并减少因果追踪的额外消耗(?)。实践中HT使用的空间与ε 相关,ε 表示时钟同步不确定性。

最近,Demirbas and Kulkarni [3]提出,HT可以被使用来解决Spanner的一致性快照问题

===== 1.2 Contributions of this work

In this paper we aim to bridge the gap between the theory (LC) and practice (PT) of timekeeping and timestamping in distributed systems and to provide guarantees that generalize and improve that of TT.

本文目标是解决理论(LC)实践(PT)在分布式系统中关于时间的一些问题,并且相比于TT具有通用性与性能提升

我们提出了一个逻辑时钟版本的HT,称其为 Hybrid Logical Clock (HLC)。HLC改进了物理时钟&逻辑时钟:

  • 接近NTP时钟,所以一定程度可以替代物理时钟。 比如 快照读取
  • 保留了逻辑时钟维系的 happen-before(hb) 的关系,所以可以提供一个一致性全局快照,并且不需要等待

兼容NTP:HLC使用 64bit 的NTP时间戳。HLC叠加在NTP协议上(只读取物理时钟,不对其进行更新),所以HLC与使用NTP的程序并行运行,并且不会发生干扰

通用性:不要求 server-client 架构,支持基于WAN的对等节点传输,支持节点使用不同的NTP server

异常容忍:HLC可以容忍常见的NTP异常,同步异常也可以确定因果关系,并且HLC 是自我稳定的,并且对破坏也能弹性容忍。

在各种部署场景及压测场景,HLC都是bounded(有界)的。

广泛使用:使用场景广泛,distributed database / causal message logging in distributed systems [1], Byzantine fault-tolerance protocols [9], distributed debugging [21], distributed filesystems [18], and distributed transactions [25].

===== 2. Preliminaries

  1. 分布式系统中每个节点执行三种类型的action之一:send action , receive action , local action .
  2. Timestamping算法目标是为每个event分配一个时间戳。文中使用全大写表示这个 Timestamping算法,使用全小写表示该算法分配的时间戳。 LC 表示 逻辑时钟算法,lc.e 表示event e具有的LC时间戳
  3. happened before(hb) 表示系统中事件的因果关系,e happened before f 表述为 e hb f。e和f是并发的表述为 e || f

已有的资料已经证明,如下推论是正确的:

  • e hb f --> lc.e < lc.f
  • lc.e = lc.f --> e || f
  • e hb f --> vc.e < vc.f

反向推论不一定正确

===== 3. HLC: Hybrid Logical Clocks

===== 3.1 Problem statement

这里有2个目标:向LC一样可以确定因果顺序;时钟接近PT。细化一些需求:

  • 要求1:e hb f --> l.e < l.f // 能像LC一样确定因果关系
  • 要求2:Space requirement for l.e is O(1) // 时钟的空间复杂度是O(1),不能像向量时钟那样是o(n)的(n是系统中节点个数)
  • 要求3:l.e is represented with bounded space // 单个时钟是有界的,不能无限增大。LC是无限增大的
  • 要求4:l.e is close to pt.e, i.e. , |l.e - pt.e| is bound // 接近物理时钟(与物理时钟的差保持在一定的界限内)。
    • PT的时钟同步有不确定性,所以没法支持用户在指定时间点进行快照。而HLC接近PT(在PT跳变时间容忍内),同时又可以确定因果关系,所以HLC可以支持指定时间点快照

 

===== 3.2 Deacription of the Naive Algorithm

初始算法如图3,该算法与LC比较相似,初始lc设置为0.

  • 发送事件f node j 上创建 l.j = max(l.e + 1, pt.j), e 是 node j 上 f 的前一个事件。那么这样就可以保证 l.e < l.f ,并且 l.f >= pt.j
  • 接收事件f 在 node j 上创建 l.j = max(l.e + 1, l.m + 1, pt.j), e 是 node j 上 f 的前一个事件,m是接收的消息的时间戳。那么可以保证 l.f > l.e && l.f > l.m

这个初始的算法满足了前面要求1&要求2,但是违反了要求4,进而违反了要求3

如图四中是一个反例。消息在节点1、2、3中循环传递,那么 |l.e - pt.e| 是无限增长的。

The root of the unbounded drift problem is due to the naive algorithm using l to maintain both the maximum of pt values seen so far and the logical clock increments from new events (local, send, receive).

问题在于 初始算法 使用l 来同时维护 已知pt的最大值 以及 逻辑时钟(counter)的增加

这样我们就无法确定 l 是来自 pt 还是来自 因果关系。没有合适的位置来 reset l(以保证l.e-pt.e有界),因为 reset l 会丢失 hb 关系,进而违反 要求1.

 

// 另外,即使我们要求 pt 在2个本地事件之间最少增加1 也不能解决这个问题。图4反例中也证明了这一点。

// 而如果我们要求 pt 在send event & receive event 之间最少增加一,那么是可以保证 l.e-pt.e 是有界的。// 但这有些过于严苛了

 

===== 3.3 HLC Algorithm

All problems in computer science can be solved by another level of indirection. –David Wheeler

计算机科学中的任何问题都可以用另外一种间接的方法来解决

我们将初始算法中的 l.j 扩展成了 l.j & c.j :

  • l.j 用来维护当前已知 pt 的最大值
  • c.j 用确定因果关系,当 l 相同时

HLC算法如图3,初始l & c设置为0.

  • 发送事件f node j 上创建 l.j = max(l.e, pt.j), e 是 node j 上 f 的前一个事件。这里和初始算法比较相似(保证了 l.j >= pt.j),但是我们移除了 "+1" 那么 l.e 可能等于 l.j。这时我们就会增加 c.j 来保证 (l.e, c.e) < (l.f, c.f)
  • 接收事件f 在 node j 上创建 l.j = max(l.e, l.m, pt.j), e 是 node j 上 f 的前一个事件,m是接收的消息的时间戳。c.j 的值取决于 l.j 与 l.e|l.m 是否相等,来进行+1或者reset操作

 

对于Figure 4中的反例,我们重新使用HLC进行标记。当pt > 10 是 c就会被重置为0了。

 

证明:

首先,我们从算法中 l&c 的更新方式,可以很容易的得出:

Theorem 1. For any two events e and f, e hb f --> (l.e, c.e) < (l.f, c.f )

接着,我们来证明HLC满足要求4:HLC的值接近PT。从 l 的更新方式,我们可以很容易得出:

Theorem 2. For any event f, l.f ≥ pt.f

Theorem 3. l.f denotes the maximum clock value that f is aware of. In other words,

l.f > pt.f --> (g : g hb f ∧ pt.g = l.f)

对于 Theorem 3 的证明使用了归纳法,步骤略。// l.f > pt.f 说明 存在一个事件g,g hb f 并且 pt.g = l.f

基于 Theorem 3,我们来证明 |l-pt|是有界的

Corollary 1. For any event f, |l.f − pt.f| ≤ ε

我们不能找出2个event e&f, e hb f && pt.e > pt.f + ε,因为时钟跳变是有界的(为ε)。所以该推论成立

最后,我们来证明 要求3:c 的值是有界的。

Theorem 4. For any event f, c.f = k ∧ k > 0 --> (∃g1,g2,··· ,gk :(∀j:1≤j<k:gi hbgi+1) ∧ (∀j:1≤j≤k:l.(gi)=l.f) ∧ gk hb f)

从 Theorem 4中我们可以看出 c.f 表示的是在 l.f 创建的event总数。

具体证明略。

===== 3.4 Properties of HLC

  • HLC 适用于任何的分布式架构,也可以应用在其他环境,比如 client-server 模型
  • HLC 在 NTP 基础上叠加完成,其只读取物理时钟,但是不会更新它,而是通过修改自身的 l&c 来完成。其他服务使用 NTP 彼此之间不受影响。
  • 避免了时钟跳变引入的潜在问题
  • 不依赖 NTP 其他任何的时钟同步算法都可以

 

===== 4. Resilience of HLC

===== 4.1 Self-stabilization

HLC是叠加在NTP之上运行的,所以NTP保持问题,HLC就可以因此而稳定。

  1. 前面结论证明 l - pt 是有界的,其最大值为 c。在极端情况下其可能会超过 界限值。这种情况下,我们以 pt 为准 l&c 重置为 pt&0
  2. 为了保证系统不受 bad HLC 值影响,我们设置了一个 ignore 的边界值。当 l - pt 的值大于边界值时,我们 忽视收到的请求
  3. 对于 c 无限增长的情况,我们也给c设置了一个边界值。这样 c 只会在 最坏的值处翻滚,或者因为l被分配一个新值而重新设置。
  4. 上述边界值都是本地校正操作,同时如果HLC触发上述异常,我们还会打印log 方便报警

 

===== 4.2 Masking of synchronization errors

为了保证HLC足以应对NTP同步异常,我们给 l-pt 的漂移空间分配一个较大值以满足大多数NTP异常。

l-pt保持在ε以内(该值通常为时钟漂移的两倍),我们设置一个保守的∆ 值,超过该值就会触发前面提到的 reset correction 或者 ignore

这种方式对落后的节点具有鲁棒性。落后的节点通过和其他节点交互来更新 l & c。同样的,对于时间超前的节点也十分有效。

===== 5. Experiments

该部分主要是作者在AWS场景下部署一些仿真场景,来验证HLC算法。

局域网环境。4节点的测试情况下,可以看到c值很低。随着节点数增多(比如8节点),可以明显的看到提升NTP同步级别,可以极大的降低c值

广域网环境测试中,c值很低。因为通信延迟远大于ε,导致消息被接收时 l 已经小于 pt了。

===== 6. Discussion

===== 6.1 Snapshots

这部分主要介绍了 一致性快照 的应用场景。同时做了一些证明,证明的目的是为了说明用户指定的t,可以在系统中有一个对应的事件(HLC)。这样系统基于该HLC进行比较来拿到一个一致性快照。

另外,用户指定的时间t的快照实际上是对应[ t-ε, t] 之间的一个一致性状态

===== 6.2 Compact Timestamping using l and c

这部分介绍 如何将 l&c 进行compact,使其能兼容 NTP 时间戳。

NTP使用 64bit 时间戳,前32bit表示秒数,后32位表示秒以后的单位。前32位 能支持大约 136年, 后32位可以支持 233 picoseconds

这里提出的compact 方式是 l 使用 48 bit,这样可以保持ms级别精度。 c 使用剩余的16bit,这样c可以支持到65536,在Section 5中证明了这是足够的

 

===== 7. Conclusion

总结下:HLC结合了LC&PT的优势,并克服了他们的缺点。可以捕获因果顺序,并能提供在时钟飘逸范围内的逻辑时间,同时HLC是单调递增的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值