分布式系列:True Time

e乐博官方网站

  千锋JAVA开发学院3天前我要分享

物理时钟的无奈

当组件改变时,频率也可能改变(计算机以全速运行for循环时的时钟速度与空闲时间不同),因此计算机时钟不能以恒定速度前进。

跳上线和下线。

对于分布式系统,时钟不一致的问题是什么?假设在实时100,在节点A发生操作X=200,节点记录时间为101,然后在节点B发生实时101 Y=50的操作,并且节点记录时间为98。外部观察者的观点,Y=50发生在X=200之前。

简单而粗鲁的“等待”

如何处理上述情况,最简单的方法是单词等等!

要使用“相等”字,您需要知道节点时钟和实际时钟之间的最大误差值。假设系统中节点时钟和实际时钟的最大误差为e,这意味着在实际时间,节点的时钟应该在[t-e,t + e]范围内。在完成操作之后,无论三七二十一,在执行下一操作之前等待一段时间,从而确保后一操作的时钟大于前一操作的时钟。你需要等多久?万无一失的操作是每次等待2e。

谷歌的“等待”

GoogleSpanner使用“等”解决分布式系统的时钟问题。根据该论文,Spanner是Google的“可扩展,多版本,全局分布,同步复制的数据库”,它实现了外部的

一致性的一致性模型(根据论文,线性化),方法是使用TrueTime和“etc”(官方术语称为“CommitWait”)。 TrueTime有两个功能:

让e非常小

不要每次都等待e,但最多等待e

TrueTime实施

Google未披露TrueTime的实施细节。本文仅介绍了GPS和原子钟的同时使用,因为GPS和原子钟具有不同的故障模型。他们在数据中心部署了一组时间管理器。大多数大师都有GPS接收器,其余的大师都配备了原子钟(这些大师被称为世界末日大师.),并且大师们根据特定的规则进行相互通信。在其他服务器上,有时间段,从站定期与主站同步时间。因此,服务器上的时钟错误总是在变化。同步完成时,错误最小,并且错误在同步之前是最大的。

如下图所示,TrueTime在外部提供三个API。

在一般时间库中,时间在一个时间点获得,而TT.now返回一个区间[最早,最新]。 TrueTime保证调用TT.now的实时时间必须在它返回的范围内。

TT.after和TT.before在论文中被“TheTT.afterandTT.beforemethodsareconveniencewrappersaroundTT.now”引入论文,根据常识,TT.after(t)是TT.now.earliestt,而TT.before(t)是TT。 Now.latestt。

然而,TT.after和TT.before的描述中的“绝对”有点不那么严谨。

理所当然地,TT.now同时在不同的节点上被调用,并且返回的间隔应该是不同的。然后一些节点认为TT.after(t)是真的,有些人认为它是假的?也就是说,有些服务器上“t必须已经通过”,而有些服务器却没有。

由于时钟误差不断变化,TT.now的间隔宽度也在变化。那么有可能在服务器上,TT.after(t)在某一时刻为真,而TT.after(t)在以后变为假?在服务器上,在某些时候,我认为“必须已经过去了”,但过了一段时间,它不确定,总是感觉到一种逆转的感觉。

TrueTime应用程序

Spanner有四个操作。这里我们使用简化版“Read-WriteTransaction”作为例子来说明TrueTime的使用。

在“Read-WriteTransaction”操作中,Spanner想要完成的一致性模型是:如果在提交事务T1之后发生事务T2的开始,则T2的提交时间必须大于T1的提交时间。这里,我们假设事件e的实时是标签(e),事务i的开始事件是eistart,事务i的提交事件是eicommit,事务i的提交请求到达服务器的事件是eiserver,事务的提交时间是si,那么要达到的要求是:if tabs(e1commit)tabs(e2start),然后是s1s2。

规则:

开始:在事务i的eiserver事件发生之后,它生成一个时间si,询问si=TT.now.latest,所以si=tabs(eiserver),这个时间si将是事务Ti的提交时间。

CommitWait:生成si之后,它等待直到TT.after(si)返回true然后提交。因此si小于实际提交时间,即sitabs(eicommit)。

很容易证明如果标签(e1commit)标签(e2start),那么s1s2:

由“CommitWait”知道,s1tabs(e1commit),所以s1tabs(e2start)

显然是制表符(e2start)标签(e2server)

正如您从“开始”中看到的那样,标签(e2server)=s2

所以s1s2

这平均每个等待错误的平均值,而不是每次等待最大值。

当然,如下图所示,Spanner实际上会有更复杂的步骤,这里不会进行深入扩展。

收集报告投诉

物理时钟的无奈

当组件改变时,频率也可能改变(计算机以全速运行for循环时的时钟速度与空闲时间不同),因此计算机时钟不能以恒定速度前进。

跳上线和下线。

对于分布式系统,时钟不一致的问题是什么?假设在实时100,在节点A发生操作X=200,节点记录时间为101,然后在节点B发生实时101 Y=50的操作,并且节点记录时间为98。外部观察者的观点,Y=50发生在X=200之前。

简单而粗鲁的“等待”

如何处理上述情况,最简单的方法是单词等等!

要使用“相等”字,您需要知道节点时钟和实际时钟之间的最大误差值。假设系统中节点时钟和实际时钟的最大误差为e,这意味着在实际时间,节点的时钟应该在[t-e,t + e]范围内。在完成操作之后,无论三七二十一,在执行下一操作之前等待一段时间,从而确保后一操作的时钟大于前一操作的时钟。你需要等多久?万无一失的操作是每次等待2e。

谷歌的“等待”

GoogleSpanner使用“等”解决分布式系统的时钟问题。根据该论文,Spanner是Google的“可扩展,多版本,全局分布,同步复制的数据库”,它实现了外部的

一致性的一致性模型(根据论文,线性化),方法是使用TrueTime和“etc”(官方术语称为“CommitWait”)。 TrueTime有两个功能:

让e非常小

不要每次都等待e,但最多等待e

TrueTime实施

Google未披露TrueTime的实施细节。本文仅介绍了GPS和原子钟的同时使用,因为GPS和原子钟具有不同的故障模型。他们在数据中心部署了一组时间管理器。大多数大师都有GPS接收器,其余的大师都配备了原子钟(这些大师被称为世界末日大师.),并且大师们根据特定的规则进行相互通信。在其他服务器上,有时间段,从站定期与主站同步时间。因此,服务器上的时钟错误总是在变化。同步完成时,错误最小,并且错误在同步之前是最大的。

如下图所示,TrueTime在外部提供三个API。

在一般时间库中,时间在一个时间点获得,而TT.now返回一个区间[最早,最新]。 TrueTime保证调用TT.now的实时时间必须在它返回的范围内。

TT.after和TT.before在论文中被“TheTT.afterandTT.beforemethodsareconveniencewrappersaroundTT.now”引入论文,根据常识,TT.after(t)是TT.now.earliestt,而TT.before(t)是TT。 Now.latestt。

然而,TT.after和TT.before的描述中的“绝对”有点不那么严谨。

理所当然地,TT.now同时在不同的节点上被调用,并且返回的间隔应该是不同的。然后一些节点认为TT.after(t)是真的,有些人认为它是假的?也就是说,有些服务器上“t必须已经通过”,而有些服务器却没有。

由于时钟误差不断变化,TT.now的间隔宽度也在变化。那么有可能在服务器上,TT.after(t)在某一时刻为真,而TT.after(t)在以后变为假?在服务器上,在某些时候,我认为“必须已经过去了”,但过了一段时间,它不确定,总是感觉到一种逆转的感觉。

TrueTime应用程序

Spanner有四个操作。这里我们使用简化版“Read-WriteTransaction”作为例子来说明TrueTime的使用。

在“Read-WriteTransaction”操作中,Spanner想要完成的一致性模型是:如果在提交事务T1之后发生事务T2的开始,则T2的提交时间必须大于T1的提交时间。这里,我们假设事件e的实时是标签(e),事务i的开始事件是eistart,事务i的提交事件是eicommit,事务i的提交请求到达服务器的事件是eiserver,事务的提交时间是si,那么要达到的要求是:if tabs(e1commit)tabs(e2start),然后是s1s2。

规则:

开始:在事务i的eiserver事件发生之后,它生成一个时间si,询问si=TT.now.latest,所以si=tabs(eiserver),这个时间si将是事务Ti的提交时间。

CommitWait:生成si之后,它等待直到TT.after(si)返回true然后提交。因此si小于实际提交时间,即sitabs(eicommit)。

很容易证明如果标签(e1commit)标签(e2start),那么s1s2:

由“CommitWait”知道,s1tabs(e1commit),所以s1tabs(e2start)

显然是制表符(e2start)标签(e2server)

正如您从“开始”中看到的那样,标签(e2server)=s2

所以s1s2

这平均每个等待错误的平均值,而不是每次等待最大值。

当然,如下图所示,Spanner实际上会有更复杂的步骤,这里不会进行深入扩展。