随着数据量的上升,传统单机架构存在的瓶颈已不能满足对性能和容量的要求,从而分布式系统变得越来越火热,但另一方面, 分布式也带来了很多相对于单机架构不同的问题。其中一个问题就是多节点的时间同步问题:不同节点上的物理时钟难以同步,导致无法区分在分布式系统中多个节点的事件顺序。
早在1978年,Lamport在《Time, Clocks and the Ordering of Events in a Distributed System》中,就提出了逻辑时钟的概念,就是用来解决分布式系统中事件发生的顺序问题。
事件的因果
“Time is an illusion.”爱因斯坦如是说。
逻辑时钟是Lamport在1978年提出的一种在分布式系统中对事件进行时间戳排序的方法,在其中定义了因果关系,称为before。
例如,before在航班满员,航班可预订。这里“事件预订”before“航班满员”,预订和满员就形成了因果关系。
现实世界中,确定事件预订发生在事件满员之前,需要预订发生在比满员更早的时间。 因果关系是一个事件(因)和第二个事件(果)之间的作用关系, 其中后一个事件被认为是前一个事件的结果。 一般来说,一个事件是很多原因综合产生的结果, 而且原因都发生在较早的时间点。
而在分布式系统中,有时不可能说两个事件中的一个首先发生。 关系“happened before”只是系统中事件的部分排序。
部分排序
在分布式系统中,事件A发生在事件B之前,如果A发生在比B更早的时间,需要系统正确的满足规范。 如果分布式系统以物理时间为单位,可能存在时钟不完全准确,没办法保持精确的物理时间的问题。 因此,在逻辑时钟论文里,定义了“before”关系,而不使用物理时钟。
“before”标记为=>,需要满足三个条件:
如果a和b是同一进程中发生的事件,且a先于b,则a->b
如果a是一个进程中的发送消息,b是另一个进程中接收此消息,那么a->b
如果a->b并且b->c,那么a->c。两个事件是并发的,如果a≠>b和b≠>a
对于任意事件a&#