不知道是否是最通俗易懂的《数据一致性》剖析了


此次准备开启一个新的系列来写了,聊聊分布式系统中的关注点。节奏不会排的太紧凑,计划两周一更吧。html


  本文是本系列的第一篇。从广泛认为的分布式系统中最最最重要的数据一致性开始。内容适合人群>=0年技术相关经验。网络



1、为何须要分布式系统?

任何事物可以被持续的运用和发展,必然有其价值,分布式系统也是同样。分布式系统的产生我认为主要的目的就是“”和“海量”。这个“快”能够分为两个方面:架构

第一个是系统的处理速度快。分布式

第二个是开发的速度快(历时短)。性能

这2点本质都是相同的,把一个动做或者一件事情拆成两部分或者多个部分去同时进行,使得总体的耗时缩短。好比:本来一件事情要一我的作的话要两分钟。那么我雇佣两我的帮我各自作一部分,那么最理想状况下一分钟就能够完成了。单元测试

固然这两个方面中第二项从某种意义上来讲是能够克服的,可是第一项是没法克服的。由于没有一个程序或者说一台计算机,它的性能是无穷大的,若是有,那分布式系统也不会像如今这么广泛了(不少时候用钱能解决的问题都不是问题了)。测试

“海量”则是因为不存在无穷大的硬盘,因此咱们须要把数据分别存储到不一样的硬盘上,才能知足需求。这些硬盘可能在不一样主机、不一样机房、不一样地域,将来可能会在不一样的星球吧。架构设计


2、分布式系统的反作用

  所谓每一个事物都是矛盾统一的结合体,都具备两面性。分布式系统再带来了前面提到的好处的同时,也带来了业界广泛认为最大的问题 —— 数据一致性问题。设计

系统是给人用的,构成使用场景的概念叫业务。业务是核心,对一个系统来讲,业务的发展归根究竟是创建在数据之上的。我能够慢、能够宕机、能够搞得很复杂,这些都能忍,但惟独不能忍的就是数据问题,数据错误、数据不一致等等。cdn

分布式就意味着分治与协做,一件事一我的只负责一部分。生活中这样的例子也无处不在,就拿举办一个Party来讲:一部分人去准备吃的,一部分人去准备喝的,一部分人去准备场地布置。这些事情你们均可以同时进行,可是任一环节掉链子了,或者说不符合Party主题的话,都是失败的。(不知道为何,脑子里浮现的是一场发布会,你们喊着cheers,一口干了高脚杯里的二锅头。。。)。

再举个电商场景中的程序案例:


这里的4个操做以目标来看,其实前后顺序并不重要,重要的是要么都成功,要么都失败,其中任意一个程序不一致那么就会出问题。这个问题本质上和人与人之间的沟通问题是相似的,以前写过一篇文章也专门聊过沟通问题,有兴趣的能够扩展阅读下:《就简单聊聊沟通效率问题》,上面的Party的例子也是这个道理。与沟通惟一的不一样在于,对程序来讲,不必定都要获得响应,都没响应也是一致。当一个事情分红100个部分去作的时候,很可怕,从几率的角度来看,达到一致的几率是2/5050

这里举的程序例子并非严谨,由于实际的分布式系统中由于除了“write”操做还有“read”操做,因此一致性问题比这个更复杂,后面会有更详细的说明。


3、产生数据不一致的缘由

  那么是什么缘由致使了数据不一致的产生呢?一是程序设计问题,或者说代码写错了。这点很好理解,也很容易想到解决方案,多作测试,验证是否符合预期咯。常见的单元测试、接口测试、自动化测试、集成测试等等都是为了更具性价比的将BUG下降到无限接近于0,也造就了“测试工程师”这个岗位更大的做用。

可是,假设真的没有BUG,但仍是会产生数据不一致,由于软件是运行在硬件之上的,因此还有硬件的因素存在。而且对咱们这里的大部分人来讲,硬件相比软件,咱们的掌控力更弱。这其中,最为严重的属网络问题,网络相比其它的来讲是一个更大、更复杂的组织,未知性会随着局域网、广域网这样范围越大越严重。想象一下,每一台主机仅仅是一张大网中的一个眇小的链接点,它所承载的连接越多越容易出现问题。

可能有的小伙伴会有疑问,其它像硬盘、电源断电什么的,也有出现问题的可能性,为何网络问题最为严重呢?其实硬盘、电源比如是你身体的一部分,如手和脚。而网络是人与人之间沟通的渠道,好比手机通话,虽然你没有主动挂断电话,可是整个通话过程是有不少可能性致使中断的,对方的主观意愿也好、信号很差也罢,甚至被第三者给拦截了。相信你们也能承认,打电话出现异常的几率相比本身的手脚不听使唤是高不少的吧。

现实中网络的特色,常遇到的问题如:延迟、丢包、乱序等问题。为了解决这些问题,从互联网第一次出现的1969年(当年美军在ARPA制定的协定下用网络链接了4所大学)到如今,几十年间出了不少的理论和解决方案,这些会在后续的文章中给你们一一作梳理。本文先和你们具体剖析下什么是一致性。


4、详解一致性

  首先什么叫达成一致了?提及来很简单:

在任意时间、任意位置看到的同一个事物是彻底一致的。

好比一场足球赛。咱们无论在现场仍是在电视机前,看到足球从球员A传给球员B,这个信息都是同样的。可是严格意义上来讲,这个并称不上真正的一致,由于电视机接收到这个信息须要通过卫星信号、网络等的传输,咱们看到的时候相比现场的人确定要晚。哪怕在现场的人,根据他所处的位置理论上看到的信息也存在延迟差,只是由于光速很是快,使得在相差几百米以内,这个延迟小到彻底感觉不到而已。

能得出的结论是:在考虑时间维度的状况下,不存在真正意义上的一致

何况咱们在分布式系统中,也没有必要去达到真正的意义上的一致。由于越趋近于一致,系统至关于又归一成一个单体了,在某一个时刻,只能作一件事,彻底丧失了分布式系统的两个目的之一“快”的优点。也所以衍生出多种一致性的变种,分别适用于不一样的场景。为了便于理解,咱们从严格程度的低到高来讲。

大多数状况下,为了尽量的“快”,系统中使用的大部分方案都是所谓的最终一致性,也就容忍必定条件下的不一致,优先保证局部一致,而后再经过一系列复杂的状态同步达到全局的一致。最终一致性不少可实现的分支,列出几种常见的,抛砖引玉一下:

■ 因果一致性:仅要求有因果关系的操做顺序获得保证。好比朋友圈的回复功能。问“饭吃了吗?”确定得在回答“吃了”以前。

■ 读你所写一致性:文字看着别扭,但很好解释。好比你在朋友圈下面回复一句话,其它好友能够不用立刻看到你的回复,可是你本身必须得立刻看到,要否则回复到哪去了?

■ 会话一致性:与人的一次聊天能够理解为一次会话。聊天虽然也有必定的因果关系,可是大部分场景下更多的是逻辑上的前后关系。好比你阐述一个事情,分为3条信息:首先...,而后...,最后...。若是这里的一致性得不到保证那么可能会变成:最后...,首先...,而后...。

比局部一致更严格一些的就是全局的顺序一致性[附录1,1979年提出],保证全部进程看到的全局执行顺序一致,而且每一个进程自身的执行顺序和实际发生顺序一致。像上面提到的足球赛,好比实际发生的事情是①梅西把球传给了C罗,②C罗又把球回传给了梅西,那么每一个人看到顺序都应该是这样。哪怕现场观众已经看到②了,电视机前的咱们还没看到①,可是不要紧,这个事情发生的顺序,对全世界来讲都是同样的。

再严格一些,就是在全局的顺序一致性基础上再增长一个相对时间的一致性要求,业界称之为线性一致性[附录2,1990年提出]。仍是用上面梅西和C罗相互传球的例子来作个比喻,至关于梅西传出球给C罗以后,整个球场“暂停”了,要等全部在观看这场球赛的人都接收到这个传球信息以后,C罗才能作下一个回传。这里须要一个上帝(全局时钟)来“暂停”。这是咱们实际能够作到的极限了,知足这类要求的系统中,名气最大的就属Google的Spanner了。

对不一样级别的一致性汇总概述以下:



5、结语

  这篇就到这吧,本来还想一次性写完的,发现内容实在太多,上万字的文章,估计不少人都没有看下去的勇气了。

如何解决一致性问题,且听下回分解~



论文附录:

[1]《How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs》,Leslie Lamport,1979。连接:research.microsoft.com/en-us/um/pe…

[2] 《Linearizability:A Correctness Condition for Concurrent Objects》,Maurice P. Herlihy,Jeannette M. Wing, 1990。连接:cs.brown.edu/~mph/Herlih…



做者:Zachary_Fan

出处:www.cnblogs.com/Zachary-Fan…



以为回答的不错就点个【推荐】吧~

欢迎扫描下面的二维码,关注公众号:跨界架构师,第一时间了解做者的思考。

内容包括:架构设计丨分布式系统丨产品丨运营丨一些深度思考

相关文章
相关标签/搜索