分布式事务中时间戳是非常关键的点,来解决版本控制和事务顺序。整理几种常见的时间戳机制。
Hybrid Logical Clock (HLC)
HLC 将时间戳分成物理(高位)和逻辑(低位)两部分,物理部分对应 UNIX 时间戳,逻辑部分对应 Lamport 时钟。在同一毫秒以内,物理时钟不变,而逻辑时钟就和 Lamport 时钟一样处理——每当发生信息交换(RPC)就需要更新时间戳,从而确保操作与操作之间能够形成一个偏序关系;当下一个毫秒到来时,逻辑时钟部分归零。
HLC 的正确性其实是由 Logical Clock 来保证的:它相比 Logical Clock 只是在每个毫秒引入了一个额外的增量,显然这不会破坏 Logical Clock 的正确性。但是,物理部分的存在将原本无意义的时间戳赋予了物理意义,提高了实用性。
缺陷:
可以保证同一个进程内部事件的时钟顺序,但是解决不了系统外事件发生的逻辑前后顺序与物理时间前后顺序的一致性,因此做不到Linearizability,也就做不到外部一致性。
行业公司:
YugabyteDB,Cockroach
TrueTime
可以做到外部一致性,同时能做到全球化部署。
可线性化:支持原子读取和写入操作的并发对象。
每个数据中心有若干个time master机器。大部分time master机器安装了GPS天线和接收器。剩下的time master机器安装了原子钟。time master之间会相互校验时间,如果某个time master发现自己的本地时间和其他time master相比差异很大,会把自己设置为离线,停止工作。客户端向多个time master查询,防止某个time master出现故障影响结果
行业公司
Google
TSO
全局集中式授时服务,对网络要求比较高,不能跨地域,理论上可以做到外部一致性;
TSO的全局版本号由 physical time + logical time 两个部分组成。
physical time :真实的时间戳,毫秒级
logical time:毫秒之外的逻辑时间
整体的方案是跟HLC差不多的。
TSO节点是位于PD模块,通过raft来保障可用性。
行业公司:
TIDB