-->

左耳听风_029_28_推荐阅读分布式系统架构经典资料

你好,我是陈浩,我名猪耳朵耗子。

在前一段时间呢,我写了一系列的分布式系统架构方面的文章,有很多的读者纷纷留言讨论相关的话题。

还有的读者留言啊,表示对分布式系统架构这个主题啊感兴趣啊,希望我能推荐一些学习资料。

就像我在前面的课程中多次提到的,分布式系统的技术占呢非常非常大,所以我要推荐的学习资料也比较多。

在后面的课程中呢,我会结合主题啊,逐步推荐给你那。

今天这节课呢我会推荐一些分布式系统的基础理论啊和一些不错的图书和资料。

那这些图书和资料的链接呢,我在文中啊都给你提供了课后啊,你可以打开看一看。

那这一讲呢比较长啊,所以我在文章开头呢特意整理了目录啊,帮你快速找到自己感兴趣的内容。

首先呢我想分享一些基础理论。

那接下来我要说的这些基础知识啊,有可能你已经知道了。

不过呢还是容我把它分享在这里,我希望用比较通俗易懂的文字,把这些枯燥的理论知识啊讲清楚。

Cap定理呢是分布式系统设计中最基础啊,也是最为关键的理论。

他指出,分布式数据存储啊不可能同时满足这三个条件。

那第一呢是一致性,就是每次读取啊,要么获得最近写入的数据,要么获得一个错误。

那第二呢是可用性,嗯,意思就是每次请求都能获得一个非错误的响应,但不保证返回的是最新写入的数据。

那第三呢是分区容忍,意思是尽管任意数量的消息被节点间的网络丢失或者延迟系统啊仍然能够继续运行。

也就是说呢,CAP定理表明,在存在网络分区的情况下,一致性和可用性必须二选一。

而在没有发生网络故障的时候呢啊也就是分布式系统正常运行的时候呢,一致性和可用性是可以同时被满足的那这里需要注意的是,CAP定理中的一致性和ACID数据库事务中的一致性截然不同。

掌握CAP定理,尤其是能够正确理解CAP的含义,对于系统架构来说啊非常重要。

因为对于分布式系统来说呢,网络故障在所难免。

如何在出现网络故障的时候维持系统,按照正常的行为逻辑运行,就显得尤为重要了。

你可以结合实际的业务场景和具体需求来进行权衡。

比如对于大多数互联网应用来说啊,因为机器数量庞大,部署节点分散,网络故障呢是常态,而可用性呢是必须要保证的,所以只有舍弃一致性来保证服务的AP.而对于银行等需要确保一致性的场景呢,通常呢会权衡CA和CP模型。

那CA模型呢在网络故障时完全不可用。

而CP模型呢会具备部分可用性。

我在文中呢给你画了一张图来总结CACP和AP三个系统。

那这里呢我来解释说明一下,首先对于CA啊,全称是consistency加availability.那这样的系统呢关注一致性和可用性,它需要非常严格的全体一致的协议啊,比如两阶段提交,也就是two PC.那CA系统呢不能容忍网络错误或者节点错误。

一旦出现这样的问题啊,整个系统啊就会拒绝写请求。

因为他并不知道对面的那个节点是挂掉了,还是只是网络问题。

那唯一安全的做法呢就是把自己变成只读的那其次呢是CP,那全称呢是consistency加partition tolerance.那这样的系统关注一致性和分区容忍性,他关注的是系统里大多数人的一致性协议,比如pixel算法。

那这样的系统呢只需要保证大多数节点数据一致。

而少数的节点在没有同步到最新版本数据的时候呢,会变成不可用的状态,这样能够提供一部分的可用性。

那最后呢是AP,全称呢是availability加partition tolerance.那这样的系统啊关心可用性和分区容忍性。

所以这样的系统啊不能达成一致性,需要给出数据冲突。

而给出数据冲突呢就需要维护数据版本。

Dynamo就是这样的系统。

然而呢还是有一些人会错误的理解CAP定理啊,甚至误用在clouerror工程博客CAP confusion problems with partition tolerance一文中啊,对此有详细的阐述。

在谷歌的transaction across data center视频中呢,有一张图啊,我把它放在了文章里。

这张图啊是CAP理论在具体工程中的体现。

讲完了CAP理论,我再来介绍第二篇有关基础理论的文章,叫finasices of distributed computing.那这是英文维基百科上的一篇文章,它是散公司的劳伦斯彼得多维奇等人。

啊,在一九九四年到九七年提出的讲的是刚刚进入分布式计算领域的程序员,常会有的一系列错误。

假设多维奇在一九四六年出生在美国波士顿,他创办了阿拉丁企业。

啊,并且在这个公司啊编写了著名的ghost script开源软件,在一九八八年啊首次发布。

他在学生时代呢就和艾伦凯啊等等,比他年长的人一起开发了small talk.并且他的开发成果啊激发了后来java语言GIT编译技术的创造灵感。

他后来在赛安公司工作,并且成为赛安公司的院士。

那在一九九四年呢,他成为了ACM院士。

基本上每个人刚开始建立一个分布式系统的时候呢,都做了以下这八条假定。

那第一呢网络是稳定的,第二网络传输的延迟是零,而第三呢网络的带宽啊是无穷大,第四网络是安全的那第五呢网络的拓扑不会改变。

那第六个假定就是只有一个系统管理员,第七呢传输数据的成本为零,第八点,整个网络啊是同构的。

但是呢随着时间的推移,每一条啊都会被证明是错误的,也都会导致严重的问题和痛苦的学习体验。

阿尔蒙罗德姆盖尔奥兹啊写了一篇长文,叫做falaces of distribute computing explained啊,来解释这些点。

那他在写这篇文章的时候呢,已经是两千零六年了。

所以从中能看到这八条常见错误。

被提出十多年之后啊,还有什么样的影响?第一呢,为什么当今的分布式软件系统也需要避免这些设计错误?那第二呢,就是在当今的软硬件环境里啊,这些错误意味着什么?比如文中在谈延迟为零,假设的时候呢,还谈到了AJX,而这个是两千零五年才开始流行的技术。

而佳沃斯威尔逊的文章呢则用日常生活中的例子给这些点啊做了更为通俗的解释。

这八个需要避免的错误啊,不仅对于中间件和底层系统的开发者和架构师是重要的知识。

对于网络应用程序开发者也同样重要。

分布式系统的其他部分啊,比如容错啊、备份啊、分片啊、微服务等,也许可以对应用程序开发者部分透明。

但是这八点啊,即使是应用程序开发者也必须知道。

那为什么我们要深刻认识这八个错误呢?是因为啊这需要我们清楚的认识到,在分布式系统中呢错误是不可能避免的。

我们能做的不是避免错误,而是要把这些错误的处理当做成功。

啊,能写在代码中,后面呢我会写一个系列的文章啊,来谈一谈分布式系统容错设计中的一些常见的设计模式啊,敬请关注。

以上呢就是我首先给你介绍的技术理论部分。

那接下来呢我再介绍一些经典资料。

首先呢我们来介绍一篇文章,文章的标题呢叫做distributed system siri for the distributed system engineer.那这篇文章的作者认为呢,推荐大量的理论论文啊是学习分布式系统理论的错误方法啊,除非这是你的博士课程。

因为论文呢通常难度比较大啊,又很复杂,需要认真的学习。

而且呢还需要理解这些研究成果产生的时代背景,才能真正领悟到其中的精妙。

之处在这一篇文章中呢,作者给出了他整理了分布式工程师啊必须要掌握的知识列表,并且直言掌握这些足够设计出新的分布式系统。

那首先呢作者推荐了四份阅读材料,他们共同概括了构建分布式系统的难点,还有所有工程师啊必须要克服的技术难题。

那第一呢是distribubuty system for final profit啊,这是一本小书,涵盖了分布式系统的关键问题,包括时间的作用和不同的复制策略。

那这节课的后面呢会对这本书啊有详细的介绍。

那第二呢是notes on distributed systems for young blaass.而这篇文章中呢,没有理论,是一份适合新手阅读的分布式系统实践笔记。

那第三呢是a note on distribute systems,而这是一篇经典的论文。

讲述了为什么在分布式系统中啊远程交互不能像本地对销单进行。

第四份阅读材料呢就是the finanaces distribute computing,每个分布式系统新手啊都会做的八个错误假设,并且还探讨了这些假设会带来的影响。

那前面啊也专门对这篇文章做了介绍。

那随后呢作者分享了几个关键点,那第一点呢是失败和时间。

分布式系统工程师啊面临的很多困难都可以归咎为两个根本原因,一是进程可能会失败。

二呢是没有好方法表明进程失败。

那这个呢就涉及到如何设置系统时钟以及进程间的通信机制。

在没有任何共享时钟的情况下,如何确定一个事件发生。

在另一个事件之前,你可以参考lampod时钟和vector时钟啊,还可以看一看dynamo的论文。

那第二个关键点呢是容错的压力,能在不降级的情况下,容错的系统一定要像没有错误发生一样运行。

这就意味着系统的某些部分必须冗余的工作。

从而呢在性能和资源消耗两方面带来成本最终一致性和其他的技术方案,以系统行为的弱保证为代价来试图避免这种系统压力。

阅读dynamo论文和帕特赫尔兰的经典论文,life beyond transactions啊能获得很大的启发。

那第三个关键点呢是基本原语,在分布式系统中呢几乎没有一致认同的基本构建模块。

但是目前啊已经越来越多的在出现了,比如leader选举呢就可以参考玻璃算法。

而分布式状态机复制呢,可以参考维基百科和lampson的论文啊,后者更权威,只是有点枯燥。

那第四个关键点呢是基本结论,某些事实啊是需要吸收理解的。

比如进程之间啊如果会丢失某些信息,那就不可能在实现一致性存储的同时啊响应所有的请求。

那这个呢就是CAP定理,还有呢就是一致性啊,不可能同时满足两个条件啊,第一呢总是正确。

第二呢就是在异步系统中啊,只要有一台机器发生故障,系统总是能终止运行啊,也就是停止失败。

另外呢一般来说啊消息交互少于两轮都不可能达成共识。

最后呢作者分享的第五个关键点是真实系统学习分布式系统架构。

最重要的就是结合一些真实系统的描述,反复思考和点评它背后的设计决策。

比如谷歌的JFS、 spanner、 tribby、 big table,还有deeper a等等,还有drag cassandra和self等非谷歌的系统。

那以上呢就是我分享的第一篇文章,而第二篇文章呢叫做FLP impossibility result中文叫做FLP.不可能性名称呢起源于他的三位作者fisher linch和peterson这篇文章,讨论了理论上能做出最强的共式算法会受到怎样的限制?所谓共识问题呢,就是让网络上的分布式处理者最后都对同一个结果值达成共识。

那这个解决方案对错误有恢复能力,处理者一旦崩溃,就不再参与计算了。

在同步的环境下呢,每个操作步骤的时间和网络通信的延迟都是有限的。

要解决共识问题啊是可能的方式,就是等待一个完整的补偿来检测某个处理者是否已经失败了啊,如果没有收到回复,那就假定他已经崩溃了。

那共识问题啊有几个变种,它们在强度方面有所不同。

呃,通常来说呢一个更强的问题,它的解决方案同时也能解决比它更弱的问题。

那共识问题的一个较强的形式啊,是这样的啊,就是给出一个处理者的集合。

其中啊每一个处理者都有一个初始值啊,有这样三个特性。

第一呢就是所有无错误的进程,最终都会决定一个值。

那第二个特性呢,就是所有会做决定的无错误进程决定呢都会是同一个值。

那第三呢就是最终被决定的值啊,必须被至少一个进程提出过。

那这三个特性啊分别被称为终止一致同意和有效性。

任何一个具备这三点特性的算法,都被认为是解决了共识问题。

那FLP不可能性呢,则是讨论了异步模型下的情况。

主要结论呢有两条。

第一条呢就是在异步模型下不存在一个完全正确的共识。

算法不仅是前面较强形式的共识,算法不可能实现FLP,还证明了比它弱一些的共识。

算法也就是说只需要一些无错误的进程,做决定就足够了啊,这种共识算法也是不可能实现的那第二条结论呢就是在异步模型下存在一个部分正确的共识算法。

那前提呢是所有无错误的进程都总能做出一个决定,而且没有进程会在它的执行过程中死亡,并且初始情况下,超过半数的进程都是存活状态。

那FLP的结论呢,就是在异步模型中啊,仅仅一个处理者可能崩溃的情况下,就已经没有分布式算法能够解决共识问题了。

而这个是这个问题的理论上界,他背后的原因呢在于异步模型下,对于一个处理者他完成工作,然后再回复消息所需的时间啊并没有上界。

所以呢我们没办法判断出来一个处理者啊,到底是崩溃了,还是在用较长的时间来回复啊,或者是网络有很大的延迟,那FLP不可能性对我们啊还有别的启发。

那第一呢就是网络延迟很重要,网络不能长时间处于拥塞状态,否则共识算法就有可能因为网络延迟过长而导致超时失败。

二呢就是计算时间也很重要,对于需要计算共识的处理过程啊,比如分布式数据库提交需要在短时间内就计算出来,能否提交的结果,那就要保证计算节点资源充分啊,特别是内存容量,磁盘空闲时间和CPU时间方面啊要足够,并且呢在软件层面确保计算不超时。

那另一个问题呢就是像pixils这样的共识,算法为什么可行?因为实际上它并不属于FLP,不可能性证明中所说的完全正确的算法,它的正确性啊会受超时值的影响。

但这个啊并不妨碍它在实践中有效。

因为我们可以通过避免网络拥塞等手段来保证超时值是合适的那接下来呢我要介绍第三份资料和introduction to distribute systems.它是分布式系统基础课的课程提纲,也是一份很棒的。

分布式系统介绍,几乎涵盖了所有的知识点,并且呢还富有简洁并切中要害的说明文字啊,非常适合初学者提纲切领的了解知识的全貌,快速的与现有知识结合,形成知识体系。

此外呢还可以把它作为分布式系统的知识图谱,根据其中列出的知识点啊,一一搜索你能学会所有的东西。

那第四份资料呢,标题叫做distributy systems for final profit啊,这是一本免费的电子书。

作者撰写这本书的目的呢是希望用一种更易于理解的方式讲述以亚马逊的dynamo、谷歌的big table和map RO duce为代表的分布式系统啊背后的核心思想。

所以书中呢着力撰写了分布式系统中的关键概念,以便让读者能够快速了解最为核心的知识,并且进行了足够详实的讲述,方便读者体会和理解,又不至于陷入细节。

那全书呢分为五章,讲述了扩展性、可用性、性能和容错等基础知识,还有FLP不可能性和CAP定理,探讨了大量的一致性模型,还讨论了时间和顺序啊以及中的各种用法。

随后呢探讨了复制问题,如何防止差异以及如何接受差异。

那此外呢,每章末尾啊都给出了针对本章内容的扩展阅读资源列表。

这些资料对这本书的内容啊是很好的补充。

那第五份资料呢就做distributed systems principles and paradigms.那这本书呢是由计算机科学家安德鲁斯托尔特塔能鲍姆和他的同事马丁范斯蒂恩合力撰写的,是分布式系统方面的经典。

教材书中语言简洁,内容通俗易懂,介绍了分布式系统的七大核心原理,并且给出了大量的例子。

接着呢系统讲述了分布式系统的概念和技术,包括通信进程、命名、同步化、一致性和复制、容错和安全等内容。

最后呢还讨论了分布式应用的开发方法啊,也就是泛型。

但是这本书呢不是一本指导如何做的手册,它仅仅适合系统性的学习基础知识,了解分布式系统编写的基本原则和逻辑。

那中文翻译版呢叫做分布式系统原理与泛型第二版。

那第六份资料呢叫做scalalable web architecture and distributed systems啊,这是一本免费的在线小册子,中文翻译版叫做可扩展的外部架构和分布式系统。

这本书啊主要针对面向互联网的分布式系统。

但是其中的原理啊或许也可以应用在其他分布式系统的设计中。

那作者的观点呢就是通过了解大型网站的分布式架构原理,小型网站的构架也能从中受益。

这本书呢从大型互联网系统的常见特性,比如高可用啊、高性能啊、高可靠、易管理等出发,引出了一个类似于flicker的典型的大型图片网站的例子。

首先呢这本书从程序模块化一组合的角度出发,引出了面向服务架构SOA的概念,同时衍生出写入和读取二者的性能问题。

还有对这两者如何调度的考量,在当今的软硬件架构上呢,写入几乎总是比读取更慢,包括软件层面引起的写入慢和硬件层面引起的写入慢。

而网络提供商提供的下载带宽啊,也通常比上传带宽更大,读取往往可以异步操作,还可以做JZP压缩。

而写入呢则往往需要保持连接啊,直到数据上传完成。

所以我们通常需要把服务啊做成读写分离的形式。

然后作者呢通过一个flicker的例子,介绍了他们的服务器分片式集群的做法。

那接下来呢还讲了冗余,包括数据的冗余,异地备份服务的多版本冗余,避免单点故障等等。

那随后呢在冗余的基础上讲到多分区扩容啊,也就是横向扩容。

横向扩容呢是在单机容量无法满足的情况下不得不做了设计。

但横向扩容会带来一个问题,就是数据的局域性会变差。

本来数据可以存在于同一台服务器上,但是现在呢数据不得不存在于不同服务器上,潜在的降低了系统性能,主要呢是可能延长响应时间。

那另一个问题呢就是多份数据的不一致性之后呢,这本书开始深入讲解数据访问层面的设计。

首先它抛出了一个大型数据的存储问题。

如果内存都无法缓存,这个数据量性能啊将会大幅度下降。

那么就需要缓存数据,数据可以缓存在每个节点上。

但如果给所有节点都使用负载均衡,那么分配到每个节点的请求啊,将会十分随机,大大降低了缓存命中率,从而导致低效的缓存。

所以他在接下来啊考虑了全局缓存的设计。

再接下来呢考虑了分布式缓存的设计。

那进一步呢介绍了mam cache啊以及facebook的缓存设计方案。

用代理服务器呢可以把多个重复请求合并成一个对于公网上的公共服务来说呢,这么做可以大大减少。

对数据层访问的次数squreet和vanish. H是两个可用于生产的代理服务软件。

当知道所需要读取数据的原信息的时候呢,比如知道一张图片的UL啊,或者知道一个要全文搜索的单词的时候,索引你就可以帮助找到那几台存有这些信息的服务器。

并且啊从他们那里获取数据文中扩展性的讨论了这个话题。

那接下来呢又谈了负载均衡器,还有一些典型的负载均衡拓扑。

然后呢还讨论了对于用户绘画数据如何处理。

比如对于电子商务网站用户的购物车,在没有下单之前啊,都必须保持有效。

那一种方法呢是让用户绘话与服务器产生关联。

但这样做呢会较难实现自动故障转移啊,如何做好是个问题。

那另外呢什么时候应该使用负载均衡也是个问题。

有时候节秆数量少的情况呢,只要使用轮换式DNS就可以了,负载均衡啊也会让在线性能问题的检测变得更麻烦。

那对于写入的负载呢,可以用队列的方式来减少对服务器的压力,保证服务器的效率。

那消息队列的开源实项有很多,比如rabbit MQ、 active、 MQ、 bin stock d.但是有些队列方案呢也使用了比如zookeeper啊,甚至像REDIS这样的存储符。

这本书呢主要讲述了高性能互联网分布式服务的架构方案,并且啊还介绍了许多实用的工具。

作者指出啊,这是一个令人兴奋的设计领域啊,虽然只讲了一些皮毛,但这一领域啊不仅现在有很多创新,将来啊也会越来越多。

我介绍的第七份资料呢是principles和distributy systems.那这本书呢是苏黎世联邦理工学院的教材,他讲述了多种分布式系统中会用到的算法。

虽然分布式系统的不同场景会用到不同的算法,但并不表示这些算法都会被用到。

不过呢对于学生来说,掌握了算法设计的精髓,也就能举一反三的设计出解决其他问题的算法,从而得到分布式系统架构中所需的算法。

这本书覆盖的算法有这么几个。

那第一呢是顶点涂色算法可以用于解决互相冲突的任务分配的问题。

那第二呢是分布式数算法,包括广播算法汇聚算法,广度优先搜索数算法,还有最小生成数算法。

呃,第三呢是容错和paxel, taxel a是最经典的共识算法之一。

第四是拜占庭协议,即点可能没有完全宕机而输出错误的信息。

那第五呢是全互联网络计算服务器两两互联的情况下算法的复杂度。

那第六呢是多核计算的工程实践,包括事务性存储资源、征用管理。

那第七个算法呢是主导级,又一个用随机化算法打破对称性的例子。

那这些算法呢可以用于路由器建立路由。

那这些算法呢对你迈向更高级更广阔的技术领域啊,真的相当有帮助。

那第八份资料呢就是说making reliable distributy systems in the presence of software errors.那这本书的书名直译过来啊,就是在有软件错误的情况下,构建可靠的分布式系统,是儿郎之父乔阿姆斯特朗的力作。

书中撰写的内容呢是从一九八一年开始的一个研究项目的成果。

那这个项目呢是寻找更好的电信应用编程方式。

那当时的电信应用啊都是大型程序,虽然经过了仔细的测试,但投入使用的时候呢,程序中仍然会存在大量的错误。

那作者呢和他的同事假设这些程序中啊确实有错误,然后想方设法在这些错误存在的情况下构建可靠的系统。

他们测试了所有的编程语言,没有一门语言,拥有电信行业所需要的所有特性。

那这个呢就促使了一门全新的编程语言,二朗的开发还有随之出现的构建健壮系统的设计、方法论和库及。

那这本书抽象了电信应用的所有需求定义的问题域,讲述了系统构建的思路啊,就是模拟现实简单通用,并且啊给出了指导规范。

阿姆斯特朗认为呢在存在软件错误的情况下,构建可靠系统的核心问题,可以通过编程语言或者编程语言的标准库来解决。

所以这本书啊用了很大的篇幅来介绍尔朗以及如何运用它来构建具有容错能力的电信应用。

虽然这本书的内容呢是以构建二十世纪八十年代的电信系统为背景,但是这种大规模分布式系统的开发思路啊,还有对系统容错能力的核心需求与互联网时代的分布式系统架构的思路初期的一致。

书中对问题的抽象总结以及解决问题的思路和方案,有深刻的洞察和清晰的阐释。

啊,所以这本书呢对现在的项目开发和架构啊仍然有很强的指导和借鉴意义。

最后呢我要介绍的第九份资料叫做designing data intensive applications,这是一本非常好的书。

我们知道在分布式的世界里,数据节点的扩展是一件非常麻烦的事儿。

而这本书呢深入浅出的用了很多工程案例,讲解了如何让节点做扩展。

那作者马丁科勒普曼在分布式数据系统领域啊有着很深的功底。

并且在这本书中呢,完整的梳理了各类纷繁复杂的设计背后的技术逻辑,还有不同架构之间的妥协与超越,很值得开发人员和架构。

设计者阅读这本书深入到betree SS tables LSM这类数据存储结构中。

并且从外部的视角来审视这些数据结构,对nosql和关系型数据库所产生的影响。

它可以让你很清楚的了解到真正世界的大数据架构中的富裕分区数据复制的一些坑。

并且呢提供了很好的解决方案。

最赞的是作者将各种各样的技术的本质非常好的关联在了一起帮你触理旁通。

而且呢抽丝剥茧,循循善诱,从提出问题到解决问题到解决方案,再到优化方案和对比不同的方案啊,一点一点的把非常晦涩的技术和知识展开了。

那这本书的引用啊,相当多每章后面啊都有几百个reference.那通过这些reference啊,你可以看到更加广阔、更加精彩的世界。

那这本书呢是一七年三月份出版的,目前啊还没有中译版。

不过英文啊也不难读,非常推荐。

文中这里呢有这本书的PPT链接,你可以从这个PPT里啊管中汇报一下。

好了,今天的推荐阅读课到这里就结束了让我们总结一下今天的内容。

在今天这一讲中呢,我给出的一些分布式系统的基础理论知识和几本很不错的图书和资料,需要慢慢的消化吸收。

也许你看到这么庞大的书单和资料列表有点弯而却步。

但是我真的希望你能够花一点时间啊来看一看这些资料。

相信你看完这些资料之后呢,一定能上一个新的台阶。

那再加上一些在工程项目中的实践,我保证你啊一定能达到大多数人难企及的技术境界。

那自从两千零二年开始接触分布式计算系统,到现在我学习分布式系统已经有十五五了,那发现还有很多的东西还要继续学习。

是的,学无止境啊。

那如果你想成为一名很不错的架构师啊,你一定要好好的学习这些知识。

文末呢我给出了分布式系统架构本质系列文章的目录啊,方便你查找自己关注的内容。