【时钟】分布式时钟HLC|Logical Time|Vector Clock|True Time

目录

简略

详细

附录

1 分布式系统不能使用NTP的原因


简略

分布式系统中不同于单机系统不能使用NTP(网络时间协议(Network Time Protocol))来获取时间,所以我们需要一个特别的方式来获取分布式系统中的时间,mvcc也是使用time保证读写相互不影响

Logical Time

      使用 接收到的消息内的时间和自己的时间中最新的那个。

      各个节点发送消息时附带自己的时间Ci,对方收到之后和自己的时间Cj 比对,选择大的时间更新为自己的时间Cj = max{Cj,Ci}.

Vector Clock

      接收到的消息有所有节点的“时间戳”集合,每个时间戳都比本地的集合对应节点的大,就用对方的,都比本地的节点小就用自己的,不是全部都大或者都小就裁决。

        VectorClock一个集合内包含所有节点的“时间戳”:{Node1:0,Node2:2,Node3:3.......}(这个时间戳并不是物理意义上的时间而是由程序赋予的逻辑计数(count)),收发消息时比对和更新自身VectorClock:

a本机:{0,0,1}  消息:{0,1,2}。消息的每个节点的count都大于等于本机的,那么舍弃本机,同步消息

b:本机:{0,1,2}  消息:{0,1,1}。消息的每个节点的count都小于等于本机的,那么舍弃消息,保留本机

c:本机:{0,3,1}  消息:{0,1,2}。出现冲突,有的大,有的小,无法判断出来到底谁是最新版本。就要进行冲突仲裁。

True Time

需要专用硬件支持

Google Spanner里面,通过引入True Time来解决了分布式时间问题。Spanner通过使用GPS + Atomic Clock来对集群的机器进行校时,精度误差范围能控制在ms级别. 需要专用硬件支持

Hybrid Logic Clock(HLC/混合逻辑时钟)

HLC存储两部分信息:本地时钟(物理部分)l,计数器(逻辑部分)c

本地时钟部分l=集群节点的本地时钟的最大值(每次进行事务通信时更新这部分信息)

计数器部分c=每次事件或者消息通信时++(累加),类似逻辑时钟里每次事件都++(累加)。

HLC比较大小时,先用比较l部分,如果l相等再看c是否为零。

详细

摘抄自:分布式系统中的时间 - https://www.jianshu.com/p/18f063573aae

Logical Time

本质是通过事件发生的顺序,通过相互通信更新自己的时间,即通过a->b 根据通信得到C(a) > C(b);

每个进程Pi维护一个本地计数器Ci,相当于logical clocks,按照以下的规则更新Ci

1 每次执行一个事件(例如通过网络发送消息,或者将消息交给应用层,或者其它的一些内部事件)之前,将Ci加1

2 当Pi发送消息m给Pj的时候,在消息m上附着上Ci

3 当接收进程Pj接收到Pi的发送的消息时,更新自己的Cj = max{Cj,Ci}

未解决问题:我们不能通过C(a) > C(b) 得出a->b,不能使用真实时间进行事务查询

Vector Clock

VectorClock是一种用向量来表示偏序关系的逻辑时钟,从数据结构上可以理解为一个集合内包含所有节点的“时间戳”,当然这个时间戳并不是物理意义上的时间(也有些实践会同时加入timestamps以解决冲突问题),而是由程序赋予的逻辑计数(count),{Node1:0,Node2:2,Node3:3.......},如果我们已经统一了向量内的位置对应的node,那么时钟可以直接用一个{0,2,3}来表示。

对于每一个分布式存储的对象副本都有这样一个时间戳,那么存在一下几种关系:

a本机:{0,0,1}  消息:{0,1,2}。消息的每个节点的count都大于等于本机的,那么舍弃本机,同步消息

b:本机:{0,1,2}  消息:{0,1,1}。消息的每个节点的count都小于等于本机的,那么舍弃消息,保留本机

c:本机:{0,3,1}  消息:{0,1,2}。出现冲突,有的大,有的小,无法判断出来到底谁是最新版本。就要进行冲突仲裁。

ps:vector clock类似于quorum协议,更新的时候将本机vector clock与事务vector clock进行对比,根据规则进行更新

未解决问题:不能使用真实时间进行事务查询

True Time

前面我们说了,NTP是有误差的,而且NTP还可能出现时间回退的情况,所以我们不能直接依赖NTP来确定一个事件发生的时间。在Google Spanner里面,通过引入True Time来解决了分布式时间问题。Spanner通过使用GPS + Atomic Clock来对集群的机器进行校时,精度误差范围能控制在ms级别,通过提供一套TrueTime API给外面使用。

TrueTime API很简单,只有三个函数:

MethodReturn

TT.now()TTinterval: [earliest, latest]

TT.after(t)true if t has definitely passed

TT.before(t)true if t has definitely not arrived

首先now得到当前的一个时间区间,spanner不能得到精确的一个时间点,只能得到一段区间,但这个区间误差范围很小,也就是ms级别,我们用ε来表示,也就是[t - ε, t + ε]这个范围,

假设事件a发生绝对时间为tt.a,那么我们只能知道tt.a.earliest <= tt.a <= tt.a.latest, 所以对于另一个事件b,只要tt.b.earliest > tt.a.latest,我们就能确定b一定是在a之后发生的,也就是说,我们需要等待大概2ε的事件才能去提交b,这个就是spanner里面说的commit wait time,保证误差时间消除掉。

未解决问题:需要专用硬件支持

Hybrid Logic Clock

      混合逻辑时钟HLC存储两部分信息,一部分取值来源于本地时钟(物理部分)l,另一部分取值来自于计数器(逻辑部分)c。

    来源于物理的部分,里面保存的其实是当前所有参与节点的本地时钟的最大值(每次进行事务通信时更新这部分信息),另一部分则是每次事件或者消息通信时++(累加),类似逻辑时钟里每次事件都++(累加)。

    HLC将这两部分称为l和c。混合逻辑时钟比较大小时,先用比较l部分,如果相等再看c是否为零。

 混合逻辑时钟HLC的算法描述如下:

本地事件或者发送消息时:

如果本地时钟(pt)大于当前的混合逻辑时钟的l,则将l更新成本地时钟,将c清零。

否则,l保持不变,将c加1。

if pt.j  >  l.j {

    l.j = pt.j

   c.j = 0

} else {

      l.j = l.j

      c.j := c.j

}

return l.j c.j

收到消息时,l 等于(当前的逻辑时钟的l、机器的本地时钟pt、收到消息里面带的l)三者中的最大值。

如果l部分是更新为本地时钟了,则将c清零。(保证HLC最大,如果本地时钟最大则重置HLC.c=0)

否则,c取较大的那个l对应到的c加1。

l'.j = l.j;

l.j = max(l'.j, l.m, pt.j);

if l.j = l'.j = m.j then c.j = max(c.j, c.m) + 1

else if l.j = l'.j then c.j = c.j + 1

else if l.j = l.m then c.j = c.m + 1

else c.j = 0

return l.j c.j

        各节点相互通信的最终结果是,节点的“本地时钟”的物理部分,最终记录的是所有参与者中最大的本地时钟。这里有一个问题是由于HLC是一个 相对的时间所以当集群中有一台机器时间快了的话,所有时间都提前了,另外这个时间不是一个True Time,这样 导致snapshot读的时间和整体系统运行时间不一致

       那么HLC怎么实现snapshot 读呢?我们将HLC作为数据的version,假设e和f事件发生成同一节点上,l.e < l.f ,我们引入一个虚拟事件g,l.e+1 <= l.g <= l.f ,并且 c.g = 0,这样的虚拟事件肯定是能找到的,并且引入一个虚构事件并不影响真实事件发生的先后关系。注意了!这个虚拟事件的时钟其实是可以跟全局的节点比较时序的(l.g, 0) ! 也就意味着,我们可以拿一个本地时钟去确定一个快照了!我们读取HLC<=HLC.g的数据即可

  快照是只要happens before我的,我一定能够看到。混合逻辑时钟通过保留了物理时钟部分,使得拿到'全局'的时间戳成为可能,而逻辑时钟里面happens before的因果关系仍然可以保留。

Timestamp Oracle(与Tidb 使用raft来实现时间一致,保证性能呢最够好,保证能读到数据即可,使用raft同步一写多读的话性能上会更好点)

       无论上面的Ture Time还是Hybrid Logic Time,都是为了在分布式情况下获取全局唯一时间,如果我们整个系统不复杂,而且没有spanner那种跨全球的需求,有时候一台中心授时服务没准就可以了。

在GooglePercolator系统这,他们就提到使用了一个timestamp oracle(TSO)的服务来提供统一的授时服务,为啥叫oracle,我猜想可能底层用的就是oracle数据库。。。

使用TSO的好处在于因为只有一个中心授时,所以我们一定能确定所有时间的时间,但TSO需要关注几个问题:

网络延时,因为所有的事件都需要从TSO获取时间,所以TSO的场景通常都是小集群,不能是那种全球级别的数据库。

性能,TSO是一个非常高频的操作,但鉴于它只干一件事情,就是授时,通常一个TSO每秒都能支持1m+ 以上的QPS,而这个对很多应用来说是绰绰有余的。

容错,TSO是一个单点,所以不得不考虑容错,而这个现在基于zookeeper,etcd也不是特别困难的事情。

所以,如果我们没法实现TrueTime,同时又觉得HLC太复杂,但又想获取全局时间,TSO没准是一个很好的选择,因为它足够简单高效。

TSO方案

作者:羊吃白菜

链接:https://www.jianshu.com/p/18f063573aae

Hybrid Logical Clock (HLC) (sergeiturukin.com)

References

  • http://www.cse.buffalo.edu/tech-reports/2014-04.pdf
  • Distributed systems for fun and profit
  • CS 417 Documents
  • pt, for physical time
  • l, logical, holds maximumptheard so far
  • c, captures causality

附录

1 分布式系统不能使用NTP的原因

NTP是网络时间协议(Network Time Protocol)的缩写,这是一种网络协议,用于同步计算机的时钟与世界统一的时间。通常,单个计算机或网络内的多台计算机可以使用NTP服务器来校准其系统时钟,保持与统一时间(例如,UTC,协调世界时)的一致性,减少时间误差。

但是,在分布式系统中,仅仅依赖NTP来同步时间可能不足够,因为:

1. 分布式系统跨越广泛的地理位置,网络延迟和变化可以造成同步的不精确。

2. NTP无法确保绝对的时钟同步一致性,通常会有毫秒级别的误差,这对于需要高精度时钟同步的分布式系统可能是不可接受的。

3. 分布式系统中的某些算法和应用可能需要比NTP更强的时间协调机制,比如逻辑时钟或向量时钟,它们能够提供系统事件的顺序一致性而不仅仅是时间同步。

因此,虽然NTP可以在分布式系统中提供基本的时钟同步,但它可能不足以满足所有分布式系统所需的精确时间同步要求。复杂的分布式系统可能会采用额外的协议和技术,如真实时间时钟(RTCs)、时钟同步算法(比如Google的TrueTime API),以及各种容错机制来更准确地同步各个节点的时钟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283205.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024最全面且有知识深度的web3开发工具、web3学习项目资源平台

在Web3技术迅速发展的时代&#xff0c;寻找一个综合且深入的Web3开发工具和学习项目资源平台变得至关重要。今天&#xff0c;我将向大家介绍一个非常有价值的网站&#xff0c;它就是https://web3x.world 。 Web3X是一个全面而深入的Web3开发者社区&#xff0c;为开发者们提供了…

最优化方法Python计算:无约束优化应用——神经网络回归模型

人类大脑有数百亿个相互连接的神经元&#xff08;如下图(a)所示&#xff09;&#xff0c;这些神经元通过树突从其他神经元接收信息&#xff0c;在细胞体内综合、并变换信息&#xff0c;通过轴突上的突触向其他神经元传递信息。我们在博文《最优化方法Python计算&#xff1a;无约…

跳跃表原理及实现

一、跳表数据结构 跳表是有序表的一种&#xff0c;其底层是通过链表实现的。链表的特点是插入删除效率高&#xff0c;但是查找节点效率很低&#xff0c;最坏的时间复杂度是O(N)&#xff0c;那么跳表就是解决这一痛点而生的。 为了提高查询效率&#xff0c;我们可以给链表加上索…

打破成本壁垒,免费SSL证书为中小企业保驾护航

HTTPS&#xff0c;这个曾经看似遥远的技术词汇&#xff0c;如今已与我们每个人的网络生活息息相关。而实现HTTPS加密传输的关键一环——SSL证书&#xff0c;正以其独特的安全性能&#xff0c;为网站筑起一道坚实的防护墙。更令人惊喜的是&#xff0c;免费SSL证书服务已经到来&a…

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)三

第二部分、线性表详解&#xff1a;数据结构线性表10分钟入门 线性表&#xff0c;数据结构中最简单的一种存储结构&#xff0c;专门用于存储逻辑关系为"一对一"的数据。 线性表&#xff0c;基于数据在实际物理空间中的存储状态&#xff0c;又可细分为顺序表&#xff…

自动化网络故障修复管理

什么是故障管理 故障管理是网络管理的组成部分&#xff0c;涉及检测、隔离和解决问题。如果实施得当&#xff0c;网络故障管理可以使连接、应用程序和服务保持在最佳水平&#xff0c;提供容错能力并最大限度地减少停机时间。专门为此目的设计的平台或工具称为故障管理系统。 …

JavaScript setTimeout和setInterval的用法与区别详解

目录 I. 总述 II. setTimeout()函数 III. setInterval()函数 IV. 新年倒计时案例 Javascript的setTimeOut和setInterval函数应用非常广泛&#xff0c;它们都用来处理延时和定时任务&#xff0c;下面这篇文章主要给大家介绍了关于JavaScript setTimeout和setInterval的用法与…

解决 Nginx 反向代理中的 DNS 解析问题:从挑战到突破20231228

引言 在使用 Nginx 作为反向代理服务器时&#xff0c;我们可能会遇到各种配置和网络问题。最近&#xff0c;我遇到了一个有趣的挑战&#xff1a;Nginx 在反向代理配置中无法解析特定的域名&#xff0c;导致 502 错误。这个问题的解决过程不仅揭示了 Nginx 的一个不太为人知的功…

分布式【雪花算法】

雪花算法 背景&#xff1a;在分布式系统中&#xff0c;需要使用全局唯一ID&#xff0c;期待ID能够按照时间有序生成。 **原理&#xff1a;**雪花算法是 64 位 的二进制&#xff0c;一共包含了四部分&#xff1a; 1位是符号位&#xff0c;也就是最高位&#xff0c;始终是0&am…

MySQL存储过程、创建、调用、查看、删除、存储过程与函数的额区别、缺陷等、存储过程写分页等

MySQL存储过程 1、存储过程的定义2、存储过程使用的意义3、存储过程的创建4、存储过程的调用5、存储过程的查看6、存储过程的删除7、存储及过程与函数的区别8、存储过程的缺陷9、存储过程写分页 1、存储过程的定义 存储过程&#xff1a;存储过程&#xff08;Stored Procedure&…

redis 从0到1完整学习 (十二):RedisObject 之 List 类型

文章目录 1. 引言2. redis 源码下载3. redisObject 管理 List 类型的数据结构3.1 redisObject 管理 List 类型3.2 List PUSH 源码 4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1…

pytest --collectonly 收集测试案例

pytest --collectonly 是一条命令行指令&#xff0c;用于在运行 pytest 测试时仅收集测试项而不执行它们。它会显示出所有可用的测试项列表&#xff0c;包括测试模块、测试类和测试函数&#xff0c;但不会执行任何实际的测试代码。 这个命令对于查看项目中的测试结构和确保所有…

千里马2023年终总结-android framework实战

背景&#xff1a; hi粉丝朋友们&#xff1a; 2023年马上就过去了&#xff0c;很多学员朋友也都希望马哥这边写个年终总结&#xff0c;因为这几个月时间都忙于新课程halsystracesurfaceflinger专题的开发&#xff0c;差点都忘记了这个事情了&#xff0c;今天特别花时间来写个bl…

思维链COT原理探究

要进行因果分析&#xff0c;需要把思维链中的不同元素拆解开来&#xff0c;然后通过控制变量实验&#xff0c;来研究不同元素对COT效果的影响。以下两篇论文的核心差异就在于: COT的变量拆解&#xff0c;以及控制变量的实验方式。 结合两篇论文的实验结论&#xff0c;可能导致…

【深度学习:Convolutional Neural Networks】卷积神经网络入门指南

卷积神经网络&#xff08;CNN&#xff09;是深度学习领域最引人注目的成就之一。自从LeCun等人在20世纪90年代初引入以来&#xff0c;CNN在图像处理、视频分析和自然语言处理等领域取得了显著的成就。在这篇博客中&#xff0c;我们将探讨CNN的基本原理、结构和一些实际应用案例…

实验3 vTPM相关

一、实验目的 1.了解vTPM原理和相关知识&#xff1b;2.创建具备vTPM的虚拟机&#xff1b;3.加深对可信计算技术的理解。 二、实验内容 安装seabios&#xff0c;libtpms&#xff0c;swtpm&#xff0c;qemu‐tpm&#xff1b;启动vTPM&#xff1b;安装虚拟机。 三、实验环境 …

2013年第二届数学建模国际赛小美赛B题寄居蟹进化出人类的就业模式解题全过程文档及程序

2013年第二届数学建模国际赛小美赛 B题 寄居蟹进化出人类的就业模式 原题再现&#xff1a; 寄居蟹是美国最受欢迎的宠物品种&#xff0c;依靠其他动物的壳来保护。剥去寄居蟹的壳&#xff0c;你会看到它柔软、粉红色的腹部卷曲在头状的蕨类叶子后面。大多数寄居蟹喜欢蜗牛壳&…

Unity Window安装包制作

Unity Window安装包制作 介绍一、RAR自解压方式1、找到Unity打包的可执行程序2.创建自解压文件3.配置设置4、最后点击确定等待压缩完成即可&#xff08;默认生成位置为你选中文件右键点击添加到压缩文件时的路径&#xff09; 二、Setup Factory工具安装制作Window安装包相关常用…

2023年成都市中等职业学校学生技能大赛“网络搭建及应用”赛项竞赛样卷

2023年成都市中等职业学校学生技能大赛 “网络搭建及应用”赛项竞赛样卷 &#xff08;总分1000分&#xff09; 目录 2023年成都市中等职业学校学生技能大赛 “网络搭建及应用”赛项竞赛样卷 网络建设与调试项目&#xff08;500分&#xff09; 服务器搭建与运维项目&#xff08;…

每日一题----删除指定数字

大家好今天是1月1号&#xff0c;我在这里祝大家元旦快乐&#xff0c;感谢大家的支持&#xff0c;新的一年我会更加努力。谢谢大家。&#xff01;&#xff01;&#xff01; 文章目录 目录 文章目录 题目演示 题⽬描述&#xff1a; 先输⼊10个整数存放在数组中&#xff0c;再输⼊…