这是阅读 http://book.mixu.net/distsys/time.html 的笔记,是该系列的第三章。

为什么时间和顺序很重要呢?为什么我们关系事件A发生在事件B之前?

因为分布式系统要解决的问题是把单机上的问题通过多机来解决。然而传统单机的程序总是假设确定的顺序。对于分布式程序来说,正确性最简单的定义就是,跑起来像一台单机上运行的程序。

全序和偏序

具体的定义大家可以去翻离散书。简单地说,全序就是在集合里任何两个元素都可以比较,分出大小。偏序中,某些元素是没办法比较大小的。

在单节点系统中,全序是必然的。因为单机上指令顺序执行。程序运行可预测。这个性质在分布式系统上不是不能实现,但是要付出代价。通信非常昂贵,时间同步困难且脆弱。

什么是时间

时间是顺序的来源。有了时间,我们才可以定义谁先谁后。分秒时只不过为了让人理解恰好出现的记号。

假设时间以同样的速率推进,(这是一个非常强的假设),时间和时间戳有下面解释:

  • 顺序(Order)例如,通过时间戳对事件进行排序
  • 持续时间(Duration)计算某事件持续时间,用于算法判断条件(例如监控心跳,判断是否出现网络分割)
  • 解读(Interpretaion)时间作为日期,本身包含一定意义,例如判断下周日是否下雨。

分布式系统中每个节点都有独立的本地时间和时间戳,于是事件的发生有本地的顺序。但是该顺序和其他节点完全独立。给决定分布式系统中的全局顺序造成一定困难。

不可假设时间匀速流逝

分布式系统中应该尽量避免假设时间在不同节点上都以同样的速率流逝,否则系统实现会比较脆弱。

那是否可以做到不同节点事件,一致而顺序发生呢?有三个设计(假设)选择。

  • 全局时钟(Global Clock):是
  • 本地时钟(Local Clock):不全是
  • 没有时钟存在(No Clock):没有

同步系统模型有全局时钟,部分同步模型有本地时钟,而异步系统模型没有时钟。

全局时钟假设

全局时钟是全序的源泉。

完美的时钟,走时同步,存在于所有节点。这是分布式系统的理想假设。实际上,时钟同步只能保证有限的精度。用户可能随机地改变本机时间,新节点加入,都有可能破坏全局时钟的假设。

当然,现实系统也有做出这个假设的。FB的Cassandra,就是使用时间戳来解决write的冲突的。时间戳较大的write会赢。那么,如果时间不同步,那么旧的write有可能覆盖新的。

本地时钟假设

假设,可能是目前比较合理的假设,本地有时钟,但是不存在一个全局时钟。两个节点的本地时间戳是不能比较的。

这和真实世界比较接近。事件在本地是可以排序的,但是在多节点分布式系统里不行。不过可以在单机上计算timeout。

没有时钟假设

完全不使用”时钟”这个概念,取而代之,“逻辑时间”。因为时间戳么,只不过是当前世界状态的一个快照,那我们用一个计数器(Counter),并和节点之间交流就可以做到了。

这样,我们可以在不同的节点之间决定事件顺序。不过有个坏处,因为缺乏时钟,没办法决定timeout。

“没有时钟”的假设的一个实现是“Vector clocks”。后面会详细讲到。Cassandra的cousin Riak 和 Vodemort(LinkedIn)是它的应用。这些系统避免了全局or本地时钟漂移带来的不确定性。

那么事件的顺序的准确性,完全是由通信的延时来决定了。

向量时钟 (Vector clocks)

Lamport时钟和向量时钟通过计数器和通信来决定分布式系统中事件发生顺序的。计数器可以在不同节点之前进行比较。

Lamport时钟

每个进程都维护一个计时器。

  • 当进程做了任意一件事,增加计时器计数。
  • 进程发送的消息中包含计时器计数。
  • 当收到消息以后,计数器设置如下:max(local_counter, received_counter) + 1

Lamport时钟定义了一个偏序,如果 timestamp(a) < timestamp(b):

  • a 可能发生在b之前
  • a和b压根没法比较

第二种情况发生在a和b所在的Partition没有发送通信。

Vector clocks

向量时钟是Lamport时钟的一种扩展。它维护大小为N的数列[t1, t2, ....],N为节点数。每个节点都更新自己的时钟。

  • 每当进程做了事情,更新该node的时钟。
  • 进程发送的消息,包含上面提到的数组。
  • 当收到消息以后,更新本地的数组里面的每个元素max(local, received);为当前节点的counter加1。

如下图:

向量时钟潜在的问题是每个节点都有个时钟计数,对于大型的系统来说,向量本身可能变得很大。

失灵检测

对于一个节点上的程序,它怎么知道远程某个节点失效了呢?在缺乏有效准确的全局信息下,我们可以通过一个合理的timeout值来确定。

但是合理的timeout值该怎么确定呢?

失灵检测器可以通过使用心跳消息来实现timeout。节点之间交换心跳消息。如果消息在timeout之前没有收到响应,就可以认为出现失效。

这种检测要么太冲动(把正常的节点算成失效),要么太保守,很长时间才能检测出错误。

论文 http://www.google.com/search?q=Unreliable%20Failure%20Detectors%20for%20Reliable%20Distributed%20Systems 讨论了失灵检测在解决一致性问题中的两大属性: 完整性和精准性。

时间,顺序和性能

我们知道在分布式系统中应假设偏序而不是全序。而要承诺全序也是可能的,但是代价非常大。通常的做法是告诉某一个master节点顺序,让它去执行。(GFS的control path做法)。这可能造成性能瓶颈。

时间,顺序和同步真的必要么?看情况。有时候可能你只不过需要最后的结果而不关系中间事件发生的顺序。(Map Reduce)

[分布式系统学习]阅读笔记 Distributed systems for fun and profit 之三 时间和顺序的更多相关文章

  1. [分布式系统学习]阅读笔记 Distributed systems for fun and profit 之一 基本概念

    因为工作的原因,最近打算看一些分布式学习的资料.其中这个http://book.mixu.net/distsys/就是一篇非常适合分布式入门的介绍. 这个短小的材料有下面5个小的章节,图文并茂,也没有 ...

  2. [分布式系统学习]阅读笔记 Distributed systems for fun and profit 之四 Replication 拷贝

    阅读http://book.mixu.net/distsys/replication.html的笔记,是本系列的第四章 拷贝其实是一组通信问题,为一些子问题,例如选举,失灵检测,一致性和原子广播提供了 ...

  3. [分布式系统学习]阅读笔记 Distributed systems for fun and profit 抽象 之二

    本文是阅读 http://book.mixu.net/distsys/abstractions.html 的笔记. 第二章的题目是"Up and down the level of abst ...

  4. Distributed systems theory for the distributed systems engineer

    Gwen Shapira, SA superstar and now full-time engineer at Cloudera, asked a question on Twitter that ...

  5. [置顶] 人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)

    这是一个导读,可以快速找到我记录的关于人工智能(深度学习)加速芯片论文阅读笔记. ISSCC 2017 Session14 Deep Learning Processors: ISSCC 2017关于 ...

  6. 可扩展的Web系统和分布式系统(Scalable Web Architecture and Distributed Systems)

    Open source software has become a fundamental building block for some of the biggest websites. And a ...

  7. 论文阅读笔记 Improved Word Representation Learning with Sememes

    论文阅读笔记 Improved Word Representation Learning with Sememes 一句话概括本文工作 使用词汇资源--知网--来提升词嵌入的表征能力,并提出了三种基于 ...

  8. (转)深度学习word2vec笔记之基础篇

    深度学习word2vec笔记之基础篇 声明: 1)该博文是多位博主以及多位文档资料的主人所无私奉献的论文资料整理的.具体引用的资料请看参考文献.具体的版本声明也参考原文献 2)本文仅供学术交流,非商用 ...

  9. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...

随机推荐

  1. QT编译错误:Project ERROR: This example requires Qt to be configured with -opengl desktop

    学习QT场景视图,对一个Boxes的例子比较感兴趣,于是去编译学习,结果编译不能通过(使用的是QT5.12): Project ERROR: This example requires Qt to b ...

  2. Python 常用类库

    python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的libraries(modules)如下: 1 ...

  3. 基本select 语句总结

    --------------基本select语句总结 8.6---------------------------------------------------------------------- ...

  4. IE8兼容性调试及IE 8 css hack

    做网站开发,一提到IE,就会让人头大,有一肚子的牢骚要发:微软为什么不跟着国际标准走呢,总是独树一帜,搞出那么多问题来.IE的firebug调试工具也不太好用,尤其是低版本的IE,更是让人头疼. 最近 ...

  5. pip更换下载源(提升下载速度)

    经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,或者下载速度很慢,所以我们最好是将自己使用的pip源更换一下,这样就能解决被 ...

  6. debug的一点总结

    程序员常常需要和bug打交道,一般来说调试bug的时间要多于编写程序的时间. bug可以简单的分为两大类: 语法上的bug 逻辑上的bug 语法上的bug就是指编译器能够识别的,例如常见的缺少分号和括 ...

  7. scala函数demo

    /** * Created by root * Description : 柯里化函数,偏应用函数,匿名函数,高阶函数 */ object FunctionTest { def main(args: ...

  8. PHP代码审计笔记--URL跳转漏洞

    0x01 url任意跳转 未做任何限制,传入任何网址即可进行跳转. 漏洞示例代码: <?php $redirect_url = $_GET['url']; header("Locati ...

  9. SpringBoot(三)-- 整合FreeMarker模板

    1.pom依赖 <!-- 引入freeMarker的依赖包. --> <dependency> <groupId>org.springframework.boot& ...

  10. STL——配接器(adapters)

    一.配接器 <Design Patterns>一书提到23个最普及的设计模式,其中对adapter样式的定义如下:将一个class的接口转换为另一个class 的接口,使原本因接口不兼容而 ...