分布式系统的时间问题

高级分布式系统-第7讲 分布式系统的时钟同步 在分布式系统中, 顺序关系主要分为以下三类:时间顺序: 事件在时间轴上发生的先后关系。 无限时刻集组成有向时间轴, 时间顺序是通过时刻的顺序体现的。 因果顺序: 如果事件e1是事件e2发生的原因, 那么e1的微小变化( 一个标记) 就会引起e2的微小变化, 但e2的微小变化不一定与e1的微小变化有关, 则称e1和e2存在因果顺序。 传递顺序: 由协议约定的一种弱顺序关系。 传递顺序不一定与时间发生的时序有关, 也不一定与事件之间的因果顺序关系有关。 如分布式系统的原子广播算法。 阅读详情

序

一些技术点仿佛俯拾皆是,但很少有时间有精力把他们串起来形成体系,进而系统性地理解它们。象多人共著《深入分布式缓存》那样多角度认识缓存技术并不多见,“临渊羡鱼,不如退而结网”,石头兄弟的这篇关于时间的文字成于去年,历久反而弥新。

目录

1 什么是时间?
2 物理时间:墙上时钟
3 逻辑时钟:为事件定序
4 Turetime:物理时钟回归
5 区块链:重新定义时间
6 其他影响
  6.1 NTP的时间同步
  6.2 有限时间内的不可能性
  6.3 延迟
  6.4 租约
7 总结
8 参考文献

1 什么是时间?

时间是困扰了无数哲人的一个很抽象的概念。

伟人牛顿的绝对时空原理,可能代表了多数人的观点——时间在整个宇宙中是一个不变常量: 

  • 在牛顿的时空观念中,时间和空间是各自独立的,没有关联的两个事物。

  • 绝对空间就像一间空房子,它区分物理事件发生的地点,用3维坐标来描述。 

  • 绝对时间就像一个滴答作响的秒表,它区别物理事件发生的先后次序,用不可逆转的1维坐标来描述。

“牛顿以为他知道时间是什么”——有人调侃说。在牛顿的绝对时空里,时间的概念是恒定的,在整个宇宙中是一致的,时间是度量事件先后的依据。这非常像我们的一个单一计算机或者紧耦合的计算机集群里,时间是明确的,事件进行的顺序也是明确的。在计算机科学最初的几十年里,我们从来没有想过计算机之间的时间问题。

另一位科学巨匠爱因斯坦,在他的狭义相对论中,主要有两点:

• 物理定律,包括时间,对所有的观察者来说是相同的。

• 光速不变。

而广义相对论说,整个时空都是一个引力场,时间和空间都不是连续的。

狭义相对论的主要意义是没有概念上的同时性,同时的概念相对于观察者,时间的推移也相对于观察者。同时,这一理论也说明了当事情发生在遥远的地方,我们需要时间去发现事情是否真的发生了。这个等待的时间可能很长。

分布式系统可能比爱因斯坦的宇宙还要糟糕。在分布式系统中,信息传播所需要的时间范围是不可预知的,可能远超过了阳光到达地球的8分钟。在这段时间内,无法知道网络另一端的计算机发生了什么。就算你可以通过发送消息来询问或探测,消息的投递和反馈总是要花费时间的。因此,系统延迟时间和超时值的设置是分布式系统的重要设计点之一。

“一切抽象都是数学,一切结论都是概率”,我们可以获得一个信息传播的统计结果,但无法知道每一次消息投递的准确时间。从这个角度上理解,分布式系统的正确运行都是运气很好的概率上,概率小到我们认为是高可靠的。

关于时间的本质,马赫(Ernst Mach)说:我们根本沒有能力以时间來测量事物的变化,相反的,我们是透过事物的变化因而产生时间流动的抽象概念。

在《七堂极简物理课》中,作者指出:只有存在热量的时候,过去和未来才有区别。能将过去和未来区分开来的基本现象就是热量总是从热的物体跑到冷的物体上。

所以,爱因斯坦说时间是幻像。从文学意义上说,不是时间定义了我们的生命,而是我们的生命定义了时间。

或许,这就是我们放弃物理时钟,使用逻辑时钟的背景吧!

2 物理时间:墙上时钟

物理时间,在英文文献中也称为wall clock。wall time,也称为真实世界的时间或挂钟时间,是指由钟表或挂钟等计时器确定的经过时间。(“wall”一词最初得名于对挂钟的引用。)

在计算机的世界里,中心化系统的时间是明确的。例如进程A和B分别在t1,t2时刻向系统的内核发起获得时间的系统调用,得到时间必然是t1<t2。这个简单的机制既是人类常规是时间思维,也是系统中各种功能正常运行所依赖的基础,可以说是常识或者共识。

单机系统中的时间依赖于石英钟,并且具有极小的时钟漂移。

3 逻辑时钟:为事件定序

分布式系统中的同步和异步都是对物理时间做的假设,但是,逻辑时钟第一次摆脱了物理时钟的限制。

逻辑时钟认为分布式系统中的机器可以无法对时间达成一致,但是对时间发生顺序是一致认同的。一个消息不能在被发送之前收到,这样,如果一个进程A向进程B发送了消息,我们可以认为A发生在B之前。

这样就定义了分布式系统中不同节点上不同事件之间的因果关系,后来衍生的向量时钟也是同样的道理。

本质上来说,逻辑时钟定义了事件到整数值的映射。所以很多逻辑时钟的实现都采用单调递增的软件计数器,这个计数器的值与任何物理时钟都没有关系。分布式系统中的节点和进程在使用逻辑时钟时,为事件加上逻辑时钟的时间戳,比如文件读写和数据库更新等。

逻辑时钟的贡献来自于Leslie Lamport在1978年发表的一篇论文《Time, Clocks, and the Ordering of Events in a Distributed System》。

4 Truetime:物理时钟回归

Google的Spanner提出了一种新的思路,在不进行通信的情况下,利用高精度和可观测误差的本地时钟 (TrueTime API)给事件打上时间戳,并且以此比较分布式系统中两个事件的先后顺序。利用这个方法,Spanner实现了事务之间的外部一致性(external consistency,如下图所示)。

也就是说,一个事务结束后另一个事务才开始,Spanner可以保证第一个事务的时间戳比第二个事务的时间戳要早,从而两个事务被序列化后也一定能保持正确的顺序。

TrueTime API是一个提供本地时间的接口,但与Linux上gettimeofday接口不一样,它除了可以返回一个时间戳t,还会给出一个误差ε。例如,返 回的时间戳是1分30秒350毫秒,而误差是5毫秒,那么真实的时间在1分30秒345毫秒到355毫秒之间。真实的系统中ε平均下来是4毫秒。

利用TrueTime API,Spanner可以保证给出事务标记的时间戳介于事务开始的真实时间和事务结束的真实时间之间。假如事务开始时TrueTime API返回的时间是{t1, ε1},此时真实时间在 t1-ε1到t1+ε1之间;事务结束时TrueTime API返回的时间是{t2, ε2},此时真实时间在t2-ε2到t2+ε2之间。Spanner会在t1+ε1和t2-ε2之间选择一个时间点作为事务的时间戳,但这需要保证 t1+ε1小于t2-ε2,为了保证这点,Spanner会在事务执行过程中等待,直到t2-ε2大于t1+ε1时才提交事务。由此可以推导出,Spanner中一个事务至少需要2ε的时间(平均8毫秒)才能完成。

由此可见,这种新方法虽然避免了通信开销,却引入了等待时间。为了保证外部一致性,写延迟是不可避免的,这也印证了CAP定理所揭示的法则,一致性与延迟之间是需要权衡的。

为什么Google要采用这样设计呢? 

Truetime根本上解决了什么问题? 

Spanner是要解决全球规模分布式系统中关于时间的两大难题: 

  1. 在数据中心之间同步时间是超级困难和不确定的

  2. 在全球规模范围内序列化请求是不可能的

解决这些问题的办法是接受不确定性,使用GPS和原子时钟,把不确定性减低到最小。对于 Spanner这样全球部署或者跨地域部署的系统,如何来为事务分配 timestamp, 才能保证系统的响应时间在可接受的范围内? 如果整个系统采用一个中心节点来分配时间戳, 那么系统的响应时间就变得非常不可控,对于离中心节点隔了半圈地球的用户来说, 响应时间估计会是100ms 级别。

如何理解turetime 呢?要弄明白truetime在事务操作中作用,首先看一下Spanner支持的几种事务类型:

简单只读事务。Spanner设计的只读事务有以下要求:

 客户程序自己实现重试动作 

 读操作要显式的声明没有写(例如只读打开一个文件) 

 系统无需获得锁,不阻塞读过程中进来的写操作

 系统自己选择一个时间戳,用来确定读取副本的时间戳 

 任何一个满足时间戳的副本都可以用作读操作

当然,快照读就更简单了,无锁的读取过去的快照,客户可以指定时间戳,也可以让系统选择一个时间戳,无需赘述。

读写事务则使用两阶段锁,来保证外部一致性:

Spanner 利用truetime机制,把系统中的操作按照发生的先后顺序,构造一个 Linearizability 的运行记录。所以,我们说Spanner是实现Linearizability的系统。 

总结来说,Spanner 是采用全球同步(有一定误差)的物理时间truttime戳作为系统的时间戳,并且作为系统内各种操作的版本号。

5 区块链:重新定义时间

中本聪在比特币一文——《Bitcoin: A Peer-to-Peer Electronic Cash System》中提出了时间戳服务器模型,并奠定了区块链的基础。为了解决双花问题,中本聪设想了一个去中心化的自验证体系: 

在基于铸币的模型中,铸币方知道所有的交易并决定哪个先到达。要在没有可信方的情况下完成此任务,必须公开宣布交易,并且我们需要一个系统,让参与者就接收它们的顺序的单一历史记录达成共识。收款人需要一个证明:对于一个交易,大多数节点都同意该交易是第一个收到的。

我们建议的解决方案是从时间戳服务器开始的。时间戳服务器的工作方式是获取要加盖时间戳的数据块的散列,并广泛地发布散列,就像在报纸或Usenet post上发布一样。显然,时间戳证明了数据必须在那个时候存在,以便进入散列。每个时间戳散列包含前一个时间戳的散列,由此形成一个链,每个后续的时间戳都会增强前一个时间戳的有效性。

这样,区块链作为时间机器的滴答机制就形成了,一个区块高度对应一个时间窗口,这是为什么区块链也被称为时间机器的原因。为了让时钟跳动均匀,POW区块链会自动调整算法难度,维持滴答周期在一个平均的物理时间范围内,比如比特币是在10分钟左右,以太坊在15秒左右。非POW的区块链也维护这样的时钟滴答,比如filecoin测试网维护在45秒左右。

进一步,非POW的区块链维护固定的时钟滴答是很难的,再以filecoin为例,采用在全网采用UTC时间戳(类似前面谷歌的做法)来实现固定的物理时间间隔,这要求全网的服务器都和NTP服务器同步,并限制了严格的时钟飘移范围(1s)。因为区块链这样的时间机器特性,才让链上的数据在没有分叉的情况下无法篡改。也正因为这样,区块链才让人联想到物理时间的消逝,熵的增加,能量的耗散,以及“青春散场、昨日不再”。

由区块链的本质引申开来,研究者试图找到替代的解决方案。其中一个非常有吸引力的方案是VDF。VDF是 Verifiable Delay Function的缩写,可验证延迟函数VDF的概念是斯坦福大学计算机科学和电子工程教授、计算机安全实验室联合主任Dan Boneh在Crypto 2018大会发布的《Verifiable Delay Functions》论文中首次提出的。Function说明了VDF是一个函数,对每一个输入都有一个唯一的输出。Delay 可以用一个时间T(wall time)来表示,延迟函数在时间T完成计算,但不能通过并行加速在小于时间T完成计算。Verifiable 要求延迟函数的输出非常容易验证。详细请阅读《Paxos、PoW、VDF:一条美丽的黄金线》一文。

Function:

§ unique output for everyinput

Delay:

§ can be evaluated in time T

§ can not be evaluated intime <T on parallel

Verifiable:

VDF计算过程最重要的一点是:在计算时要求大量计算资源,但验证时只需花费相对少的计算资源。这样的计算和验证的非对称关系乍看起来有点像工作量证明(PoW)。于是,批评接踵而至:“ 听起来我们又回到了工作量证明 ”,“ 不再烧一轮 CPU 我们就干不了这事是吗 ?”——文献《VDF不是工作量证明》一文指出:虽然 VDF 和传统的 PoW 算法都拥有“难以计算”且“易于验证”这样的属性,最核心的区别在于,区块链工作量证明的共识算法是可并行化的工作量证明,并且只是有概率会成功,不是一种函数。相反,VDF 是连续工作量证明,是确定的函数。

关于VDF和PoW的区别,已有很多争论。总体来说,PoW 直接作为随机数的来源是有缺陷的,同时,VDF 也无法直接替代 PoW。但是,这并不能说明 VDF 不可以被用到共识协议里。原因如下:

• PoW 不抵抗并行计算加速而 VDF 是抵抗的。实际上,PoW 不抗并行计算加速是符合中本聪关于“一个 CPU 一票”的设想的,而抗并行加速的性质只会与这个目的背道而驰。VDF 会使得多 CPU 的计算者和单 CPU 的计算者相比几乎没有什么优势。

• 对于固定的难度设定 d,PoW 可以有很多合法的解,这也是保证 PoW 共识网络拥有稳定的吞吐量以及刺激矿工进行竞争的前提。而对于给定输入 x,VDF 拥有唯一的输出(这也是为什么它被称作函数)。

总体来说,VDF很好的刻画了区块链对于时间滴答机制的本质需求。在一些非PoW区块链和非区块链的领域,都有大量研究和探索,比如协议实验室和以太坊联合成立的实验室,以及大量对VDF感兴趣的项目。

注:filecoin的协议实现也在考虑VDF:

Future versions of the Filecoin protocol may use Verifiable Delay Functions (VDFs) to strongly enforce block time and fulfill this leader election requirement; we choose to explicitly assume clock synchrony until hardware VDF security has been proven more extensively.

6 其他影响

和影响人们的生活一样,时间更是影响了计算机系统的方方面面,也自然影响了我们。 

6.1 NTP的时间同步

在分布式系统中,关于时间的共识是非常困难的。不同机器中石英钟的频率可能不一致,这会导致不同机器中时间并不一致。为了同步不同机器中的时间,人们提出了NTP协议。这样,一个机器的时间就会依赖于另外一个外部时钟。

NTP协议基于这样原理:网络通信延迟来回是相等的。基于此可以获得两台机器时间差值 。在NTP服务器(上)获得的时间再加上(时间落后本机)或减去(时间领先本机)这个延迟就可以设置为本地的时间,由此获得时间同步。

6.2 有限时间内的不可能性

1985年,Fischer,Lynch和Patterson发布了他们著名FLP成果(Impossibility of distributed consensus with one faulty process):在异步的系统中,如果存在进程故障,系统是不可能达成一致的。FLP表明,当至少有一个进程可能崩溃时,没有一种确定性地解决异步环境中共识问题的算法。在工程应用中,这个理论也可以理解为:在不稳定故障的异步系统中,不可能有一个完美的故障检测器。

根本的原因在于时间。FLP结果并不意味着共识是无法达到的,只是在有限的时间内并不总是可以达到的。同步系统在进程和进程计算之间为消息传递提供了一个已知的上限。异步系统没有固定的上限。

在《分布式系统:概念与设计》一书中,作者针对FLP指出:在分布式系统中,并不是说,如果有一个进程出现了故障,进程就永远不可能达到共识。它允许我们达到共识的概率大于0,这也是与实际情况相符合的。例如现在运行在广域网上的分布式系统,都是异步的,但是事务系统这么多年来一直都能达到共识。

所以,FLP表述为:在有限的时间内,不可能达成一致。系统可能或者极有可能达成一致,但这不是保证的。也就是说, 在异步的系统中,有限时间内达到一致性是不可能的。在分布式计算上,试图在异步系统和不可靠的通道上达到一致性是不可能的。

因此,一般的一致性前提都是要求保证:在这里我们不考虑拜占庭类型的错误,同时假设消息系统是可靠的。因此,对一致性的研究一般假设信道是可靠的,或不存在异步系统在运行。

概率,深刻的影响着分布式系统可靠性。世界的概率本质虽然不能让我们准确的推断未来,但是对于预测消息是否准确传递却绰绰有余。想一想,我们知道在有限时间内达到绝对的一致性是不可能的,那为什么程序员自信的设置超时值为5秒呢?

就像这个世界的概率本质一样,分布式系统同样构建在概率的基础之上。

6.3 延迟

很多人把延迟归类到网络延迟,指数据在传输介质中传输所用的时间,即从报文开始进入网络到它开始离开网络之间的时间。实际上,在计算机世界里,延迟无所不在。

除了VDF之外,程序员可能还要知道下面的这些时间数字:

  • L1 cache reference ......................... 0.5 ns

  • Branch mispredict ............................ 5 ns

  • L2 cache reference ........................... 7 ns

  • Mutex lock/unlock ........................... 25 ns

  • Main memory reference ...................... 100 ns

  • Compress 1K bytes with Zippy ............. 3,000 ns = 3 µs

  • Send 2K bytes over 1 Gbps network ....... 20,000 ns = 20 µs

  • SSD random read ........................ 150,000 ns = 150 µs

  • Read 1 MB sequentially from memory ..... 250,000 ns = 250 µs

  • Round trip within same datacenter ...... 500,000 ns = 0.5 ms

  • Read 1 MB sequentially from SSD* ..... 1,000,000 ns = 1 ms

  • Disk seek ........................... 10,000,000 ns = 10 ms

  • Read 1 MB sequentially from disk .... 20,000,000 ns = 20 ms

  • Send packet CA->Netherlands->CA .... 150,000,000 ns = 150 ms

  • ......

6.4 租约

租约(lease)在分布式系统中的一般描述如下:

  • 租约是由授权者授予的在一段时间内的承诺。

  • 授权者一旦发出租约,则无论接受方是否收到,也无论后续接收方处于何种状态,只要租约 不过期,授权者一定遵守承诺,按承诺的时间、内容执行。

  • 接收方在有效期内可以使用授权者的承诺,只要租约过期,接收方将放弃授权,不再继续执行,如果重新执行需要重新申请租约。

  • 通过版本号、时间周期,或者到某个固定时间点认为租约的证书失效

租约可以说是分布式系统的心跳机制。在分布式系统中,像分布式锁,集群leader这样角色,可能随时变化。为了避免死锁,或者错误的leader认知,一般都要设计租约机制。

7 总结

本文主要回顾了计算机系统演进过程中的时间问题,特别是古典分布式系统的时间问题,以及由时间带来的顺序问题;探讨了最新支持拜占庭容错的区块链网络系统的时间本质,以及在可验证延迟函数方面的最新探索。

目前的分布式系统无法超越时空的限制来运行,系统的设计也受到时空考虑范围的约束。而未来,量子计算机将会在时空约束方面带来哪些改变,值得期待。

8 参考文献

  • http://physics.ucr.edu/~wudka/Physics7/Notes_www/node55.html

  • https://queue.acm.org/detail.cfm?id=2655736

  • http://history.programmer.com.cn/14015/

  • https://www.geekhub.cn/a/1681.html

  • http://muratbuffalo.blogspot.fi/2013/07/spanner-googles-globally-distributed4.html

  • http://blog.sina.com.cn/s/blogc35ad45b0102wa53.html

  • http://duanple.blog.163.com/blog/static/709717672012920101343237/

  • https://en.wikipedia.org/wiki/Lease(computerscience)

  • Leases: An Efficient Fault-Tolerant Mechanism for Distributed File Cache Consistency

  • SEDA: An Architecture for Well-Conditioned, Scalable Internet Services Time, Clocks, and the Ordering of Events in a Distributed System

  • Viewstamped Replication: A New Primary Copy Method to Support Highly-Available Distributed Systems Probabilistic Accuracy Bounds for Fault-Tolerant Computations that Discard Tasks

  • https://quizlet.com/blog/quizlet-cloud-spanner

  • http://baike.baidu.com/link?url=upN85rlJXR69lDiYxYy_aFEecj1t3D5vTwIuUXPMN2rz9xKkYlPK-UEOMjA13PWwuuKXNPnE8YXlMJzluqHHpq

  • http://duanple.blog.163.com/blog/static/70971767201122011858775/

  • https://zh.wikipedia.org/wiki/%E6%8B%9C%E5%8D%A0%E5%BA%AD%E5%B0%86%E5%86%9B%E9%97%AE%E9%A2%98

  • https://people.eecs.berkeley.edu/~rcs/research/interactivelatency.html

  • http://highscalability.com/blog/2013/1/15/more-numbers-every-awesome-programmer-must-know.html

  • https://wondernetwork.com/pings/

  • https://gist.github.com/jboner/2841832

  • https://gist.github.com/hellerbarde/2843375

  • https://people.eecs.berkeley.edu/~rcs/research/interactivelatency.html

  • http://link.springer.com/article/10.1023/A:1019121024410

  • https://www.infoq.com/articles/pritchett-latency

  • http://highscalability.com/blog/2012/3/12/google-taming-the-long-latency-tail-when-more-machines-equal.html

  • https://github.com/colin-scott/interactive_latencies

  • http://bravenewgeek.com/everything-you-know-about-latency-is-wrong/

分布式系统 时间同步问题 在重新启动hadoop之后,发现hbase在查询数据的时候,无法查询,究其原因是因为在查询数据是,是通过各个子节点来查询的。但由于各个子节点时间不同步问题,所以会造成查询报异常 由此,需要进行时间同步,同步的是时间点以Master服务器为标准,Slave节点首先要查看时间服务是否启动 以下操作都在Slave机器上操作 Service ntpdate status 如果已启动则设置关闭:se... 阅读详情

相关推荐

Kerberos认证失效背后的时钟同步陷阱:从HBase连接问题看分布式系统时间一致性

本文深入分析了Kerberos认证失效问题背后的时钟同步陷阱,特别是在HBase等分布式系统中时间一致性对认证的关键影响。通过解析Kerberos协议的5分钟时钟偏差限制,提供了chrony时间同步方案和Kerberos配置调优指南,帮助解决24小时认证失效等典型问题。

weixin_29247219的博客 743

分布式环境下的服务器时钟同步问题解决办法

不同的分布式环境下时钟同步方法,搭建内网的时间服务器

不会骑摩托的程序员不是好的摄影师 1547

《深入理解分布式系统》之分布式系统模型

《深入理解分布式系统》之分布式系统模型

流水账 1440

分布式集群时钟同步问题及解决方案

这里的时钟说的是服务器的时间,集群是多个实例共同工作,如果集群中各个服务器之间的时间不一致,势必会出现一系列严重的问题。例如下单业务中,新增一条订单,通常会在订单表中插入一条订单记录,订单记录中应该会有**“下单时间”**这样的字段,而这个字段的值往往是在程序中获取当前系统时间插入数据库或者直接从数据库服务器获取时间,若订单系统是集群化部署,或者数据库是分库分表的集群化部署,而他们的时钟是不同步的,那么数据将会变得混乱。

我的博客 1474

时间戳:数字世界的“时间记忆术

在数字世界里,时间戳就像无数个隐形的“快递标签”,默默记录着每一条消息、每一笔交易、甚至每一次点击的“时间足迹”。它就像一台永不休息的“时间记录仪”,为数字世界中的每个动作打上独一无二的“时间标记”。下次当你看到屏幕上的时间标记时,不妨想一想:这串数字背后,藏着多少关于“时间”的智慧和奥秘!微信聊天记录中的每条消息都带有时间戳,试着找到你最早的一条消息,看看它的时间格式!无论是人类可读的日期格式,还是一串神秘数字,它们都是时间戳的化身。在分布式系统中,不同机器的时间可能不一致,时间戳帮助它们协调同步。

muzibuku的博客 961

分布式系统的时间顺序

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 分布式系统的时间顺序 区块链被认为是分布式的系统,分布式系统中由于多节点,通讯、物理位置等的问题,各节点间时间一致的问题随即也被提了出来,那么怎么处理分布式系统中的一致性问题,这里简单介绍下:分布式系统的时间顺序问题。如有解释错误或者不明,请及时提出指正。 分布式系统,最简单理解有多个服务节点,客户端发出请求,服务节...

weixin_44172023的博客 448

分布式系统(二)

时间和时钟Time and Clock 时钟有什么用处 1.知道发送请求到服务器需要多久 需要客户端和服务端时钟是同步的 2.用时间戳来安排在分布式系统中的事务 需要分布式系统中的时钟是同步的 3.A是什么时候转钱给B 需要准确的时钟,与global authority 同步 时钟偏移(skew)和时钟漂移(drift) 1.时钟偏移是指 两个时钟的读数的瞬间的不同。 2.时钟漂移率 是指由参考时钟度量的每个单位时间内,时钟与参考的偏移量 同步系统对于最大时钟漂移率有个界限 两种同步方式 外部同步 如果需要

fragile98的博客 4380

你一定想不到,Bug 背后竟然藏着时间的秘密

文章通过时间处理、分布式系统、内存管理等编程Bug,揭示了技术与哲学的深层联系。作者论证了程序错误不仅是技术问题,更反映了人类认知的局限与偏差。每次调试代码本质上是调整对世界的理解模型,是一次认知的觉醒与成长。编程因此成为一种探索思维边界、重塑认知地图的哲学实践。

Where there is a will, there is a way ! 777

分布式环境时钟同步问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、时钟不同步导致的问题二、集群时钟同步 一、时钟不同步导致的问题 在分布式集群环境下,不同服务器的时间如果不一致,则产生的数据可能会发生错乱。 比如电商系统下单时,如果订单系统2个服务器时间不一致,一台服务器时间是2021-01-01 10:00:00,另一台时间为2020-01-02 10:00:00,那么两台服务器同时产生的两条订单数据不论是排序处理还是订单数据统计都乱了。 二、集群时钟同步 分布式集群中每个服务器节点都能

u012387539的博客 1797

分布式系统架构设计原理与实战:理解分布式系统的时间与顺序问题

作者:禅与计算机程序设计艺术 1.背景介绍 随着互联网的快速发展,各种互联网应用已经从单机应用程序逐渐演变成多台计算机集群组成的分布式系统架构。在分布式系统中,时间、顺序等重要属性也是难题之一。本文通过对分布式系统架构设计的一些原则和方法论,以及对分布式系统时间、顺序问题的深入研究,全面阐述了如何构

AI天才研究院 453

分布式系统从服务器获取时间

一个服务器,若干客户端,java rmi实现客户端从服务器获取当前时间

分布式系统概念和设计——时间和全局状态(分布式系统中的时间问题)

关于计算机的时间设计

多头注意力探索Now 1603

模型剪枝实战 | Torch-Pruning 库在YOLOv8上的应用指南

本文详细介绍了如何使用Torch-Pruning库对YOLOv8模型进行结构化剪枝,以实现模型“瘦身”。通过DepGraph(依赖图)技术自动处理层间依赖,确保剪枝安全。文章提供了从环境搭建、核心原理理解到完整剪枝流程的实战指南,并强调了剪枝后的微调与性能评估,帮助开发者在保持精度的同时显著提升模型推理速度。

weixin_29046035的博客 503

分布式系统中时间乱序问题的零侵入修复方案

在分布式系统和高并发场景中,时间乱序是常见的技术挑战,主要表现为后发生的事件先被记录,导致监控数据异常和计算失真。其核心原理在于网络延迟、设备时钟不同步等因素造成的时间戳不一致。通过内存池优化和异步流水线改造,可以在不牺牲系统性能的前提下实现时间乱序修复。典型应用场景包括物联网平台数据处理、金融交易系统等对时间序列敏感的领域。本文介绍的滑动窗口算法结合ArrayPool内存管理,在20万TPS的物联网平台中实现乱序率降低97%,为高性能系统提供了一种外科手术式的精准解决方案。

weixin_30582943的博客 279

YOLO详解

本文参考知乎 https://zhuanlan.zhihu.com/p/25236464 1. YOLO的创新点 YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。 从网络设计上,YOLO与two steps的目标检测方法如RCNN、Fast RCNN和Faster RCNN的区别如下: YOLO训练和检测均是在一个单独网...

UnknownPlayer的博客 9945

亚马逊(Amazon ads)广告API申请步骤(已经更新完)

你如果是自己的店铺使用,就选择左边的、如果是授权的那种给别人用就选右边的。审核通过了才能进行下一步,我目前就是刚申请完,后续会持续更新!然后会调整到,下面的页面,选择Agency然后右上角点击创建。审核通过会发邮件到你的企业邮箱、时间大概是1-7天左右。输入对应的信息,点击提交审核,就可以开始申请了。1、广告平台跟卖家平台是分开的,这个概念要清楚。2、注册广告一定要用企业邮箱!回到首页,点击成为合作伙伴。注册了以后会跳转到广告。然后再点击加入合作伙伴。然后会弹出下面的页面。

阿泽的博客 5655

KubeEdge边缘节点时间同步:解决分布式系统时钟问题的完整指南

在边缘计算环境中,**KubeEdge边缘节点时间戳**的精确同步是确保分布式系统稳定运行的关键因素。当云边协同处理数据时,不同节点间的时间差异可能导致数据不一致、任务调度混乱等严重问题。本文将深入探讨KubeEdge中的时钟同步挑战及其解决方案。 ## 🔍 为什么边缘节点时间同步如此重要? 在KubeEdge架构中,云节点和边缘节点分布在不同的地理位置,各自拥有独立的时钟源。**时间戳不一

gitblog_01020的博客 969

专为AI打造的浏览器:内存占用仅为Chrome的1/9、比Chrome快11倍(Docker部署教程,支持飞牛nas等服务器部署)

🚀 专为AI打造的无头浏览器来了! 用Zig从零构建,内存仅Chrome的1/9,速度快11倍,原生CDP协议支持Docker部署,适合爬虫、自动化测试和AI代理应用。✨

XiaoqiangClub的博客 730

lamport时间戳

cas和vector clock 都是以时间戳,作为并行的检测手段,那么时间戳为什么可以表现出并行或因果时序呢? 在1978年的lamport论文Time Clocks and the Ordering of Events in a Distributed System就论述了时间戳的原理。 以下是我读完这篇论文的一些自己的理解(不是论文翻译),因为很喜欢物理,所以对这个问题也格外感兴趣。如果

xubodong的专栏 6603

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5564

HFSS实战项目——微带一分四功分器

呕心沥血保姆级教程!!!!手把手教会你做功分器,史上最详细步骤!!!

2401_87464239的博客 2673

开源项目year中跨年时间戳问题的技术解析与修复历程

开源项目year中跨年时间戳问题的技术解析与修复历程 在软件开发过程中,时间处理一直是个看似简单实则暗藏玄机的领域。最近,开源项目year中暴露了一个典型的跨年时间戳问题,值得我们深入探讨其技术本质和解决方案。 问题现象分析 项目中的"/en/currentYear"接口在2024年仍然返回2023年的数据,这显然是一个时间戳未及时更新的问题。这类问题在跨年时刻尤为常见,通常由...

gitblog_07114的博客 420

C#上位机之海康相机开发(SDK)实战教程

SDK的接口设计遵循“句柄-操作-释放”模式,掌握→→→的流程,就能完成基础开发;工业场景需重点关注稳定性:断连重连、内存管理、抗干扰(网口相机的IP设置、触发信号的可靠性);进阶功能(如图像处理、多相机同步)需结合视觉库(EmguCV)和硬件特性(GPIO触发),但前提是保证基础采集的稳定。建议新手先跑通SDK自带的C#示例,理解每个函数的作用,再逐步替换为自己的代码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2192

如何解决分布式系统中的跨时区问题[原理篇]

《谈谈你最熟悉的System.DateTime[上篇][下篇]》从跨时区的角度对DateTime这个我们熟知的类型进行了深入探讨,它们都是为这篇文章作的准备工作。在接下来的两篇文章中,我们将完整的介绍如果在一个分布式系统中处理时区的问题。 一、场景以及需求 为了让大家本文介绍的主题有一个比较直观的认识,我们给出一个具体的应用场景。一个跨国公司开发一套统一的办公系统,供遍布全球的所有分公司使用...

weixin_34326179的博客 634

TensorRT量化校准数据集选择

在TensorRT中进行INT8量化时,校准数据集的选择至关重要,直接影响量化后模型的精度和推理性能。这是一个典型的问题。

浩瀚之水的专栏 497

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

分布式系统关于时间的注意点

一旦分布式系统中依靠时间来做一些判断时,需要考虑各个机器时间不一致的情况,NTP可能会存在时间误差。 全局时间来解决这个问题。

无能力者只知抱怨 538

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 人工智能伦理学的一知半解
下一篇: 有感,一些与自己同龄的文字
半吊子全栈工匠
半吊子全栈工匠 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄18年 4632粉丝 897原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值