在分布式系 统中,如果物理时钟精度不够或者误差太大,就会使用逻辑时钟( Log ic alClock) 来控制系统不同组件、进程之间事件的时间先后顺序。
3.3.1 逻辑时钟技术
业界逻 辑时钟的典型实 现有软件序号器 的兰伯特时间戳 ( LamportTimestamp)、时间偏序 ( PartialOrdering) 的向量时钟 ( VectorClock)、副本顺序 ( OrderReplicas) 的版本向量(VersionVector ) 等。
1. . 逻辑时钟
1978年,图灵奖获得者 LeslieLamport在其发表的论文 Time, clocks, andtheorderingof
eventsinadistributedsystem中 详细描述了逻辑时钟实现,核心点是先后顺序 ( HappenedBefore) 和序号计数 ( SoftwareCounter)。
先后顺序按照数学理论偏序的定义如下。
· 相同进程内,如果事件 a先千事件 b发生,就表示为 a->b。
· 不同进程内,如果事件 X是进程 A发送消息 ,事件 Y是进程 B接收该消息 ,那么事件 X一定先千事件 Y发生,就表示为 X->Y。
事件发生的先后顺序,可以很方 便地用软件计 数 ( SoftwareCounter) 实现序号,而序号的大小可以判断先后顺序。如图 3-12所示,如果没有逻辑时 钟技术 ,第 3步发生时可能第l步因为网络问题还没 有完成数据写入 磁盘的操作,从而导致第 3步议到磁盘 的历史数据。但是引入逻辑时钟后,可以通过序号值确定先后 顺序,保证系统设计正确性。
图3-12 逻辑时钟示例
基于逻辑时钟非常容易实现两台服务器或两个进程间的事件先后顺序裁决,但是如果 在多台服务器 或多个进程的情况下继续使用 就需要选出 唯一的序号生成器,众多服务器都向该序号生成器申请序号以判断先后顺序,此时会导致序号生成器成为系统瓶颈。
向垦时钟通过组合多 个本地计数器来判断事件的先后顺序,不需要唯一 的序号生成器就可以实现关联事件的先后顺序裁决。如图3-13所示,事件 1-1到事件 1-10具有先后顺序,每个事件都由一个或多个本地计数器组成。例如,事件1-5(由[A:2, B:2, C:l]三个本地逻辑时钟组成)和事件1-6(由[A:2, B:4, C:l]三个本地逻辑时钟组成)之间存在先后顺序,而事件2-1(由[B:3, C:l]两个本地逻辑时钟组成)和事件1-5(由[A:2, B:2, C: l]三个本地逻辑时钟组成)之间就无法判断先后顺序,是独立的两个事件。
图3-13向量时钟示例
在分布式对象存储服务中,读/写不同 的对象就是独立的事件,而先写对象、再读取对象就存在先后顺序,特别是大规模客户端并发读/写相同对象时就需要控制先后顺序。
1. 版本向量
不管是逻辑时 钟还是向 量时钟,它们都集中解决事件的先后顺序问题。而版本向量可以在分布式系统中跟踪数据的变 化,特别是多个客户端在不同 的时间更新数据的变 化。
客户端 l和客户端 2在不同时间更新数据存储 Rl上的对象X。每次更新记录版本时 ,Rl按时间 顺序记录数据更新有3个,组合起来就是[X:l=AAA, X:2=BBB, X:3=CCC] ,从而形成版本 向晕,如图 3-14( a) 所示。针对分布式系 统,数据会保存为多个副本 ,每个副本都会有版本向量,将多个副本的版本向量组合起来就形成了版本矩阵 ( Version Matrix),如图所示。
图3-14 版本向屋示例
由千系统的更新有依赖关系,每次更新只有在确认上次版本写入成功后才能覆盖,此时就会存在历史 版本的清理问题,因此需要在数据 存储侧对版本向量进行合并删减 。而在分布式冗余存储中 ,还需要结合多个副 本的一致性进行处理,这些都是分布式系统的挑战点。
1. 多版本并 发控制
数据库领域中广泛 使用的多版本并发控制 ( Multi-Version ConcurrencyControl, MVCC),就是与版本向量非常类似的一种技术。它是数据库管理系统常用的并发控制技术,其目标是优化读/写 锁造成的多个长时间的读操作饿死 写操作问题 。它的核心机制是每次事务读到 的数据项都是历史快照,而每次事务的写操作不覆盖已有数据项,而是创建新的版本。
MVCC使用系 统时间戳( TS) 或逻辑时 钟序号,在写入数据时将其作为版本标识符( ID) ,
读/写时采取如下规则。
· 基千 MVCC的读操作 。事务 T,读取对象时,将选择比事务 T,时间更早,且最接近事务 T,的有效版本 返回。
· 基于MVCC 的写操作。若事务T,和T) 要以先后顺序写入相同对象,则必须保证T,先 千 T丿 发生,也就是T,<T丿 ,因此写入时需要做更多的版本时间检查 ,才能保证数据一致性。
在保证一致性的前提下,MVCC 通过类似于乐观锁的机制提供并发控制 ,在写冲突较少的情况下可以大幅提升系统性能。