DDIA 7. 分布式系统的麻烦

目录

  1. 局部故障(部分失效是不确定性的)
  2. 不可靠的网络(超时的3种情况,trade off 超时间隔太长或太短的问题)
  3. 不可靠的时钟 (单调钟vs时钟,事件的时间戳排序的问题)
  4. 不可靠的租约(栅栏令牌)
  5. 不可靠的节点(拜占庭问题)

故障

当我们在使用单机系统时,它通常以一种相当可预测的方式工作:要么它正常工作,要么不工作。

而当我们在使用分布式系统时,情况就不同了。在分布式系统中,系统的某些部分可能以某种不可预知的方式被破坏,即使系统的其他部分工作正常。这种故障通常是不确定的:如果你想做涉及多个节点和网络的东西,可能甚至不知道某个消息是否成功,因为消息穿越网络所需的时间也是不确定的。

这种故障的不确定性,使得分布式系统的变得复杂而脆弱。一个系统越大,它的组件就越有可能出现故障。在一个有成千上万个节点的系统中,某些东西总是会出现故障。而错误处理策略仅仅是简单的放弃的话,一个大系统可能会花费大量时间从故障中恢复,而不是做有用的工作。所以我们需要分布式系统能够容忍失败的节点,并且仍然保持整体工作,将容错机制建立到软件中。换句话说,分布式系统需要从不可靠的组件中建立一个可靠的系统。

不可靠的网络

分布式系统是一组由网络连接的机器组成的。网络是这些机器通信的唯一方式,每台机器都有自己的内存和磁盘,一台机器不能访问另一台机器的内存或磁盘。在网络中,一个节点可以向另一个节点发送消息,但是网络不能保证它何时到达或是否到达,所以网络是不可靠的。

不可靠的网络系统

如上图所示,如果发送的请求并没有得到响应,则无法区分
(a)请求丢失
(b)远程节点失效
(c)响应丢失。
处理这个问题的通常方法是超时:一段时间后,发送方放弃等待,并假定响应不会到达。但是,当超时发生时,远程节点可能已经得到请求并进行了处理。

故障检测

由于网络的不确定性使得很难判断一个节点是否工作。分布式系统当中常用的便是超时检测的机制。如果超时检测是检测故障的方法,那么超时应该是多长时间呢?不幸的是,没有简单的答案。

长的超时时间意味着需要等待一个节点被宣告死亡。短的超时时间会更快地检测到故障,但是事实上节点并没有停止工作(例如由于节点或网络过载)时,会错误地检测一个节点失效。如果节点实际上是活着的,在执行某些操作的时,工作另一个节点接管,则该操作可能最终执行两次。而且当一个节点失效时,它的责任需要转移到其他节点,这将额外的负载放到其他节点和网络上。如果系统已经处于高负载之下,过早检测节点失效会使问题变得更糟。特别是,它可能发生的是节点实际上没有时效,但由于过载而响应缓慢,将其负载转移到其他节点会导致级联故障。

目前学界和业界的趋势是:不使用常数配置的超时,而是系统可以连续测量的响应时间和响应时间的抖动,并自动调整超时时间根据所观察到的响应时间动态分布。如Akka的超时器,Cassandra的动态检测,TCP的超时重传。

不可靠的时间

在分布式系统中,时间是一件棘手的事情,因为通信不是瞬时的:消息穿越网络从一台机器转到另一台机器需要时间。消息接收的时间总是比发送的时间晚,但由于网络中的可变延迟,我们不知道以后会有多少延迟。很难确定多台机器处理的逻辑与顺序。

每台机器都有自己的时钟,通常是一个石英晶体振荡器。这些设备并不完全准确,所以每台机器都有自己的时间,它可能比其他机器稍快或慢一些。存在同步时钟的网络协议:最常用的机制是网络时间协议(NTP),它允许计算机时钟根据一组服务器报告的时间进行调整。服务器可以从更精确的时间源获取时间。

时钟:

UTC时间以1970年1月1日为开始,根据公历,忽略闰秒,来计算当前时间。计算机时钟通常与NTP同步,这意味着一台机器的时间戳(理想情况下)意味着与另一台机器上的时间戳相同。

单调的时间:

您可以在一个时间点检查时钟的值,然后再一次检查时钟。两个值之间的差异告诉你这两个检查之间要花多少时间。在分布式系统中,通过一个单调的时钟测量时间(如超时)通常是好的,因为它不承担不同的节点的时钟之间的同步的细微误差。

事件的时间戳排序

跨多个节点的事件排序是一个令人头疼的问题。例如,如果两个客户机向分布式数据库写入,谁首先到达?哪个是最近写的? 如下图所示:

image.png

写x = 1的时间戳是42.004秒,但写x = 2的时间戳42.003秒。当Node 2接收到这两个事件时,它会错误地得出结论:x = 1是最新的值,忽略x=2的写入。Client B的增量操作将会丢失。这种冲突解决策略被称为最后写者胜(LWW),会导致一个具有滞后时钟的节点无法覆盖以前用一个快速时钟写入的节点的值,直到节点之间的时钟偏差消失。

所以对于有严格时序要求的系统,需要使用逻辑时钟(比如:Lamport Clock,Lanport老爷子真的是分布式领域的上古神牛啊~~~),这是基于递增计数器是一个来判断事件的更迭顺序。逻辑时钟不测量每天的时间或经过的秒数,只有事件的相对顺序,也就是判断一个事件是否发生在另一个事件之前或之后。

4.不可靠的租约

在分布式系统之中,有时需要确保在存储服务文件只能同时被一个客户端访问,因为如果多个客户端试图写它,文件会被损坏。您需要通过在访问文件之前从锁服务获得租约来实现分布式锁。但是有时这个锁并非有我们想象的可靠,如下图所示:

不正确的执行分布式租约

如果持有租约的客户端 1 因为GC等原因暂停太久,而它的租约到期了。另一个客户端 2 可以获取租约,并开始向文件写入数据。当暂停的客户端1返回时,它仍然认为自己拥有一个有效的租约,并且继续写入数据。于是造成了写入冲突。

栅栏令牌

我们可以使用栅栏令牌的方式,让不可靠的租约变的更加可靠,如下图所示:

通过栅栏令牌来确保写入安全

锁服务器可以在每次授予租约时,返回一个令牌,它是一个在每次授予锁时增加的数字ID。每次客户端发出一个写请求时,必须包含当前的租约令牌。而存储服务会记录写入的租约令牌,成为一个栅栏,旧的令牌写入将被存储服务拒绝。

拜占庭问题

第12章 拜占庭容错

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容