引子

@禅与计算机程序设计艺术
Lamport认为,在动手写代码之前,要先思考和写作的重要性。图灵奖得主、分布式系统先驱、LaTeX之父Leslie Lamport认为,对于程序员而言,对数学思维的强调永远不会过分,要写出好代码,不能惧怕数学。但基本上,程序员和许多计算机科学家都被数学吓坏了。
What was wrong with their original algorithm?
Well, they didn’t have an algorithm, just a bunch of code. Very few programmers think in terms of algorithms. When trying to write a concurrent system, if you just code it without having algorithms, there’s no way that your program is not going to be full of bugs.
--- Leslie Lamport,2013年图灵奖得主:如何写出数学上完美的算法

关键问题

分布式系统解决了传统单体架构的单点问题和性能容量问题,另一方面也带来了很多的问题,其中一个问题就是多节点的时间同步问题:

不同机器上的物理时钟难以同步,导致无法区分在分布式系统中多个节点的事件时序。

1978年Lamport在《Time, Clocks and the Ordering of Events in a Distributed System》中提出了逻辑时钟的概念,来解决分布式系统中区分事件发生的时序问题。

逻辑时钟概念

逻辑时钟是为了区分现实中的物理时钟提出来的概念,一般情况下我们提到的时间都是指物理时间,但实际上很多应用中,只要所有机器有相同的时间就够了,这个时间不一定要跟实际时间相同。更进一步,如果两个节点之间不进行交互,那么它们的时间甚至都不需要同步。因此问题的关键点在于节点间的交互要在事件的发生顺序上达成一致,而不是对于时间达成一致。

综上,逻辑时钟指的是分布式系统中用于区分事件的发生顺序的时间机制。从某种意义上讲,现实世界中的物理时间其实是逻辑时钟的特例。

为什么需要逻辑时钟?

时间是在现实生活中是很重要的概念,有了时间我们就能比较事情发生的先后顺序。如果是单个计算机内执行的事务,由于它们共享一个计时器,所以能够很容易通过时间戳来区分先后。同理在分布式系统中也通过时间戳的方式来区分先后行不行?

答案是NO,因为在分布式系统中的不同节点间保持它们的时钟一致是一件不容易的事情。因为每个节点的CPU都有自己的计时器,而不同计时器之间会产生时间偏移,最终导致不同节点上面的时间不一致。也就是说如果A节点的时钟走的比B节点的要快1分钟,那么即使B先发出的消息(附带B的时间戳),A的消息(附带A的时间戳)在后一秒发出,A的消息也会被认为先于B发生。

那么是否可以通过某种方式来同步不同节点的物理时钟呢?答案是有的,NTP就是常用的时间同步算法,但是即使通过算法进行同步,总会有误差,这种误差在某些场景下(金融分布式事务)是不能接受的。

因此,Lamport提出逻辑时钟就是为了解决分布式系统中的时序问题,即如何定义a在b之前发生。值得注意的是,并不是说分布式系统只能用逻辑时钟来解决这个问题,如果以后有某种技术能够让不同节点的时钟完全保持一致,那么使用物理时钟来区分先后是一个更简单有效的方式。

如何实现逻辑时钟: 时序关系与相对论 ( 物理学与计算机思想的交汇:狭义相对论与 Lamport Logic Clock)

通过前面的讨论我们知道通过物理时钟(即绝对参考系)来区分先后顺序的前提是所有节点的时钟完全同步,但目前并不现实。因此,在没有绝对参考系的情况下,在一个分布式系统中,你无法判断事件A是否发生在事件B之前,除非A和B存在某种依赖关系,即分布式系统中的事件仅仅是部分有序的。

上面的结论跟狭义相对论有异曲同工之妙,在狭义相对论中,不同观察者在同一参考系中观察到的事件先后顺序是一致的,但是在不同的观察者在不同的参考系中对两个事件谁先发生可能具有不同的看法。当且仅当事件A是由事件B引起的时候,事件A和B之间才存在一个先后关系。两个事件可以建立因果关系的前提是:两个事件之间可以用等于或小于光速的速度传递信息。 值得注意的是这里的因果关系指的是时序关系,即时间的前后,并不是逻辑上的原因和结果。

那么是否我们可以参考狭义相对论来定义分布式系统中两个事件的时序呢?在分布式系统中,网络是不可靠的,所以我们去掉可以和速度的约束,可以得到两个事件可以建立因果(时序)关系的前提是:两个事件之间是否发生过信息传递。在分布式系统中,进程间通信的手段(共享内存、消息发送等)都属于信息传递,如果两个进程间没有任何交互,实际上他们之间内部事件的时序也无关紧要。但是有交互的情况下,特别是多个节点的要保持同一副本的情况下,事件的时序非常重要。

Lamport 逻辑时钟

分布式系统中按是否存在节点交互可分为三类事件,一类发生于节点内部,二是发送事件,三是接收事件。

Lamport 逻辑时钟原理

Lamport 逻辑时钟原理如下图1 所示:

通过以上定义,我们可以对所有事件排序,获得事件的全序关系(total order)。上图例子,我们可以进行排序:

分布式系统之道:Lamport 逻辑时钟相关推荐

  1. Lamport 逻辑时钟

    分布式系统中按是否存在节点交互可分为三类事件,一类发生于节点内部,二是发送事件,三是接收事件.注意: 以下文章中提及的时间戳如无特别说明,都指的是Lamport 逻辑时钟的时间戳,不是物理时钟的时间戳 ...

  2. 分布式系统-同步化-时钟同步-物理时钟与Lamport时间戳(逻辑时钟)

    1.概述 同步化是分布式系统中的一个重要概念,同步化主要解决的是排序问题.例如:多个线程不能同时操作一个变量,而是将多个线程使用锁或无锁结构进行同步,同步的目的就是将多个线程排序为一个操作时序对这个变 ...

  3. c++ 获取时间戳_分布式系统理论基础三-时间、时钟和事件顺序

    现实生活中时间是很重要的概念,时间可以记录事情发生的时刻.比较事情发生的先后顺序.分布式系统的一些场景也需要记录和比较不同节点间事件发生的顺序,但不同于日常生活使用物理时钟记录时间,分布式系统使用逻辑 ...

  4. 一致性协议浅析:从逻辑时钟到Raft

    前言 春节在家闲着没事看了几篇论文,把一致性协议的几篇论文都过了一遍.在看这些论文之前,我一直有一些疑惑,比如同样是有Leader和两阶段提交,Zookeeper的ZAB协议和Raft有什么不同,Pa ...

  5. 搜道网美女时钟免费申请软件v3.9官方版

    2019独角兽企业重金招聘Python工程师标准>>> 名称:搜道网美女时钟免费申请软件v3.9官方版 版本:3.9 大小:11.9MB 软件语言:中文简体 软件授权:免费版 应用平 ...

  6. 5道面试逻辑智力测试题内附详细答案

    (1)假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有 ...

  7. 66道面试逻辑智力测试题

    [1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有 ...

  8. 分布式系统:时间、时钟和事件序列

    在程序中,我们经常需要知道事件序列,在单体应用中,事件序列是较为简单的,最简单的办法就是用时间戳,但在分布式系统中,事件序列是很困难的,Leslie Lamport大神在论文Time, Clocks, ...

  9. 分布式系统中节点之间的同步形成区块链

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 分布式系统中节点之间的同步形成区块链 分布式系统由Tanenbaum定义,"分布式系统是一组独立的计算 ...

最新文章

  1. vue中设置子组件的点击事件不影响父组件的点击事件
  2. docker安装gitlab_docker 安装部署gitlab
  3. NVIDIA TESLA M40
  4. 关于nginx rtmp的一点配置
  5. python有什么用-学了Python一般可以用来干什么?老男孩教育告诉你!
  6. 变量定义与声明的区别
  7. MySQL数据库的多种连接方式及工具
  8. 确认计算机故障的方法,计算机常见故障及处理方法大全!
  9. 谷粒商城-商城业务-商品详情
  10. 华为路由器MPLS VPN综合实验
  11. 计算机ms office二级试题,计算机二级MSoffice操作试题及答案
  12. OpenCV4学习记录(一)解决第一步OpenCV4.5.1+VS2019+CMake
  13. SQL优化中索引列使用函数之灵异事件
  14. 英语六级试卷软件测试,背单词软件_2018年12月英语六级考试真题测试(11)含答案_沪江英语...
  15. shell的几个重要命令,主要参数,循环语句以及变量处理
  16. 初创跨境电商公司,让Callnovo的海外客服成为您出海的桨
  17. 抢先看,2023年前瞻版Java八股文面试题,面试应该是够用了(吊打面试官)
  18. 对象存储(Object-based Storage)概述
  19. gcc posix sjij for MSYS 9.2.1+
  20. 计算机英语上海答案,上海居转户 计算机或英语职称证书

热门文章

  1. 淘淘商城第78讲——查询商品详情添加缓存的分析
  2. 易中天讲座免费在线学习 免费下载
  3. 基于QT实现的职工住房管理系统
  4. python 文字转语音 带情感_Python文字转换语音,让你的文字会「说话」抠脚大汉秒变撒娇萌妹...
  5. 把执行结果转成json对象报错_关于JSON转换成对象 报错LinkedHashMap不能直接转成对象...
  6. 一个IT前辈的JIRA使用心得
  7. Linux系统磁盘分区及挂载 - fdisk
  8. ssh_dispatch_run_fatal: Connection to 10.119.126.248 port 29418: incorrect signature fatal: Could no
  9. 记win10安装cupy的cuda版本成功踩得坑!!!血泪教训!!
  10. 2013年各大小IT公司待遇