本文是阅读 http://book.mixu.net/distsys/abstractions.html 的笔记。html
第二章的题目是"Up and down the level of abstraction"。这一章里面,做者主要介绍了分布式系统里面的一个重要概念:CAP理论。node
什么是CAP理论呢?就是说在任何状况下,分布式系统只能知足下面三项中的两个:算法
这三者不能同时知足。网络
接下来是详细内容。curl
--------------------下面是本次新闻联播的详细内容------------------------------异步
抽象(Abstraction)async
要讨论理论,就不能不聊到抽象。做者在这里文艺了一把。首先在哲学意义上讨论了抽象。分布式
当咱们说X比Y更加抽象,咱们在说什么?ide
首先,和Y相比,X并无引入新的东西。X甚至可能移除了一些东西,显得更加可控。性能
其次,X在某些程度上更容易理解。
做者开始掉书袋了。啧啧。尼采说过:
Every concept originates through our equating what is unequal. No leaf ever wholly equals another, and the concept "leaf" is formed through an arbitrary abstraction from these individual differences, through forgetting the distinctions; and now it gives rise to the idea that in nature there might be something besides the leaves which would be "leaf" - some kind of original form after which all leaves have been woven, marked, copied, colored, curled, and painted, but by unskilled hands, so that no copy turned out to be a correct, reliable, and faithful image of the original form.
这句话的大概意思,斗胆翻译以下:
咱们从各异的事物中总结出其的共性,从而产生了概念。世界上没有彻底相同的两片树叶,可是”树叶“这个概念倒是咱们忽略世界上千万的不一样的叶子的差异,抽象而成的。这说明,有一些本质的东西让树叶成为”树叶“,而这些本质,原始的存在, 仿佛是被一双技巧拙劣的双手标记,扭曲,拷贝,上色,成为咱们看到的一片片树叶。它们面目全非,彻底不是本质存在的正确,可靠和可信的反映。
抽象,本质上,是假的。每一个具体的个体都是惟一的。可是抽象让世界更加可控。因此若是咱们周围看到的都是本质,那么咱们从中推论出来的结果会普遍适用。反之,相似推论出来的不可能的结果(impossibility result)则代表,在一些限制和假设下,咱们是不能解决某些问题的。
因此抽象就是为了让事物等价,忽略某些现实生活中并不本质的东西。可是咱们怎么知道该忽略那些呢?
咱们无法提早知道。
咱们在作系统设计的时候,每忽略一些事实,咱们就冒险引入一些错误和性能问题。而后咱们就不得不换一条路。那么,对分布式系统来讲,那些本质咱们不得不考虑呢?这就是系统模型设计要解决的问题啦。
系统模型
分布式系统的程序有下面几个特色:
那么,
系统模型就是:
对分布式系统实现的环境和设施的基本假设。
一个强壮的系统模型作最少的假设,其算法容错能力出众。而较弱的系统模型,假设更多,可是实现起来可能更加容易理解。好比假设节点历来不失灵,那么算法不就很简单咯,可是写出来就没考虑节点失灵的错误处理了。
系统模型中的节点(Nodes)
节点上提供了计算和储存资源。
这里的节点,通常系统都假设,要么失灵(Fail),就是彻底crash;要么正常。还有一种假设是拜占庭将军问题。就是说节点失灵不是彻底crash,而是发送一些错误信息。后者比较少见,暂时假设不会发生。
节点之间的通讯的假设
通讯链路链接不一样的节点,容许消息相互传播。对通讯的假设很少。这里主要是区分下节点失灵(Fail)和网络分割(Network Partition)。
左边是节点失灵,右边是网络分割。很好理解。
一些算法会假设网络通讯老是可靠的。不过整体来讲,咱们仍是认为网络不可靠,消息会丢失和延迟。
时间和序列的假设
不一样节点接受到的消息序列多是彻底不一样的。咱们能够假设全部节点上的时间都彻底一致,或者,作以下假设。
显然异步系统模型更加接近真实时间,同时更加难以实现。
-----------------------核心内容(必考,敲黑板)----------------------------
一致性问题(The Consensus problem)
多台计算机(或者节点)达到一致代表:
FLP impossibility result
假设以下:
在上面的假设下,FLP 代表,
即便消息永远不会丢失,即便最多只有一个进程失效(Crash),在异步系统模型下,也不存在一个肯定性的分布式算法。
假设存在这种算法,那么任意延迟某消息(在异步系统模型中是容许的),在这段时间内该算法没法让进程肯定选择某值。我也不是太理解这个解释。因此放下原文。
This result means that there is no way to solve the consensus problem under a very minimal system model in a way that cannot be delayed forever. The argument is that if such an algorithm existed, then one could devise an execution of that algorithm in which it would remain undecided ("bivalent") for an arbitrary amount of time by delaying message delivery - which is allowed in the asynchronous system model. Thus, such an algorithm cannot exist.
FLP 不可能结果代表,咱们须要在异步系统模型中作折中。在解决一致性问题的时候,当消息没办法保证传递,算法须要放弃safety或者livness。 这里原文中使用的safety多是指consistency,liveness 则是availability。
CAP理论
该理论有三个性质。
上面三个性质,只有两个能够同时知足。以下图。
同时知足三个性质的系统是不存在的。
好比你要强一致,而且保证高可用性,任何节点失效系统都不失效,那么对网络分割就没办法容忍了,每条消息都不能丢失。
CA和CP都是强一致系统。差异是CA是没有办法handle网络分割的。而CP在一个2n+1的系统中容忍n个节点失灵。
CA系统没办法区分是网络问题仍是节点问题,因此遇到消息丢失就只有中止write,以防止divergence(一份copy四处不一样)。
CP系统经过在Partition两处构建不对称node数,只保留节点多的那部分Partition,节点少的那部分就处于不可用状态,不容许write。
另外一个角度来看CAP系统的话,咱们始终要保证对网络分割的容错,
那只有两种选择了。要么实现强一致,放弃部分可用性(of minor partition);要么实现弱一致,保证可用性(那么在不一样Partition,在同一时刻可能取到不一样的值)
因此说,一致性和可用性是此消彼长的关系,是矛盾的统一体。强一致的设计要求,让咱们不得不放弃可用性,由于在发生网络分割的时候,咱们不可能在多个Partition还继续write,使不一样Partition出现不一致。
强一致也是性能的敌人。要求每一个节点都获得update,那么对普通操做,代价是很大的。
若是咱们在网络分割发生时,坚持可用性,那么强一致是不可能的。固然,一致性模型不是只有强一致一种,咱们还能够容许其余选择,好比: