书籍详情
《深入理解分布式系统》[56M]百度网盘|亲测有效|pdf下载
  • 深入理解分布式系统

  • 出版社:电子工业出版社京东自营官方旗舰店
  • 出版时间:2022-03
  • 热度:8318
  • 上架时间:2024-06-30 09:38:03
  • 价格:9.0
书籍预览
免责声明

本站支持尊重有效期内的版权/著作权,所有的资源均来自于互联网网友分享或网盘资源,一旦发现资源涉及侵权,将立即删除。希望所有用户一同监督并反馈问题,如有侵权请联系站长或发送邮件到ebook666@outlook.com,本站将立马改正

内容介绍

产品特色

编辑推荐

适读人群 :本书适合对分布式感兴趣的读者

面向初学者:通过理论和实践结合的方式介绍分布式系统,帮助读者夯实分布式基础知识;

面向实践者:实现简单的Paxos共识算法,分析HDFS、ZooKeeper、etcd、Kubernetes等分布式系统案例。


内容简介

《深入理解分布式系统》主要讲解分布式系统常用的基础知识、算法和案例,经笔者对文献海洋中晦涩艰深的原理和算法进行提炼,辅以图示和代码,并结合实际经验进行分析总结而成。通过阅读本书,读者可以快速、轻松地掌握分布式系统的基本原理,以及Paxos或Raft共识算法,并通过典型的案例学习如何设计大型分布式系统。

《深入理解分布式系统》首先介绍什么是分布式系统、分布式系统带来的挑战,以及如何对分布式系统进行建模,这部分内容偏向概念性介绍。接着介绍了分布式数据的基础知识,包括数据分区技术、数据复制技术、CAP定理、一致性模型和隔离级别,尝试厘清一些十分容易混淆的术语,比如一致性、线性一致性、最终一致性和一致性算法等。本书还介绍了分布式系统的核心算法——Paxos和Raft算法,不仅补充了大量图示进行讲解,还从零实现了一个Paxos算法。此外,本书分析了常见的分布式事务,并讨论了分布式系统中的时间问题,整理了一些实际发生的编程陷阱。最后结合一些对工业界产生重大影响的论文或开源系统,学习前人在设计大型分布式系统时的思路、取舍和创新。


作者简介

唐伟志,曾任网易游戏、腾讯基础架构工程师。毕业后一直从事分布式系统相关工作,在知乎和公众号“多颗糖”上分享对分布式系统论文的解读和算法的讲解。开源爱好者、TiDB Reviewer和Kubernetes Contributor。


内页插图

精彩书评

系统讲解分布式原理与应用的书有很多,非常佩服作者挑战该主题的勇气。本书理论与实践相结合,详细讲解了分布式系统中最重要的时间及一致性概念,并佐以常见的分布式应用帮助读者加深对理论的理解,是一本不可多得的分布式入门和拓展视野的好书!

——《Go语言高级编程》作者 曹春晖

在云原生时代,分布式系统随处可见,我们必须掌握它。本书覆盖了从分布式系统模型、分布式数据基础到分布式共识和分布式事务的各个方面,采用通俗易懂、图文并茂的方式讲解,让你了解、掌握分布式系统的方方面面。不想学分布式系统的码农,不是好架构师。

—— Go语言中文网站长 polaris(徐新华)

分布式理论是掌握大规模软件架构必须要了解的知识点。本书不仅介绍了分布式的核心理论,还深入研究了丰富的案例,对比分析了各种真实的项目实现,非常值得读者学习。

—— 高级存储研发奇伢


精彩书摘

原子提交在分布式领域更普遍地被称为提交问题(The Commit Problem)。

事务的一大好处就是保证了原子性,所有的操作要么都执行,要么都不执行(All Or Nothing)。原子性可以说是事务最重要的特性,软件开发人员依靠事务的原子性,能够安全地将一系列相关的、不可分割的操作组合成一个整体,实现许多业务需求。

但保证原子性并非易事—不仅仅是在分布式系统中,在单机系统中亦如此。原因是原子性涉及了硬件和软件,而两者都可能出现意外故障。即使是向文件中写入一些简单的字节,也需要额外的工作来保证写入的原子性,保证即使硬盘在执行写入操作的时候出现故障,文件也不会被损坏。

我们先简单回顾单机事务的原子性的实现。

常见的机械磁盘一般可以保证512字节的原子写,所谓原子写也就是说,即便遭遇突然断电等意外情况,一般的机械磁盘也可以保证当前512字节的成功写入;如果写入的数据大于512字节,则原子写得不到保障。

为了在更通用的情况下实现原子性,常见方法是使用日志或WAL这类技术。简单地说,先将操作的元数据写入一个单独的日志文件,同时还有表示操作是否完成的标记。倘若系统在写入过程中发生故障,那么基于这些数据,系统恢复后依然能够识别出哪些操作在故障发生前已完成,然后通过撤销所有的操作来回滚事务;或者通过完成剩余未执行的操作来继续提交事务。基于硬盘原子写和日志文件来实现事务原子性的方法,在文件系统和数据库中广泛使用。

但分布式系统中的原子性问题更加复杂,因为节点分布在不可靠的网络中。此外,我们不仅需要确保一个操作在一个节点上的原子性,还要确保一个操作在多个节点上的原子性,也就是说,操作要么在所有的节点上都生效,要么不在任何一个节点上生效,每个节点提交或中止事务的操作要保持一致。

我们还是用银行转账来举例。假设一个分布式系统中的两台服务器,用户A的账户余额存储在服务器N1上,用户B的账户余额存储在服务器N2上,他们的账户上都有100元。

接下来用户A要转账10元给用户B,事务需要同时修改用户A和用户B的数据。假设事务先给服务器N2上用户B的账户加上10元,再给服务器N1上用户A的账户减去10元。由于数据分布在两台完全不同的服务器上,很可能出现一些意想不到的故障,可能在给用户B的账户加上10元后,服务器N1宕机了,无法对用户A扣钱;甚至服务器没有宕机也可能触发异常,例如可能在请求服务器N1的时候发现用户A的账户余额已经不足10元了,不能再对用户A的账户减去10元(数据库约束账户不能为负数)。不管怎样,服务器N1没有完成它在事务中的那部分工作,但服务器N2又完成了它的任务。

分布式事务的原子性通过原子提交协议(Atomic Commit Protocol,ACP)来实现,原子提交协议也叫原子提交算法,原子提交协议必须满足以下三个特性:

Ÿ 协定性(Agreement)。所有进程都决议出同一个值,相当于所有进程要么一起提交事务,要么一起中止事务,不存在两个进程一个提交事务另一个中止事务的情况。

Ÿ 有效性(Validity)。如果所有进程都决定提交事务并且没有任何故障发生,那么最终整个系统将提交事务;只要有一个进程决定中止事务,系统最终将中止事务。

Ÿ 终止性(Termination)。终止性又分为弱终止条件(Weak Termination Condition)和强终止条件(Strong Termination Condition)。弱终止条件是指,如果没有任何故障发生,那么所有进程最终都会做出决议(提交或终止事务);强终止条件也称为非阻塞条件(Non-Blocking Condition),是指没有发生故障的进程最终会做出决议。

满足强终止条件的提交算法被称作非阻塞提交算法,而满足弱终止条件但不满足强终止条件的提交算法被称作阻塞提交算法。值得注意的是,协定性约束了两个进程不能决议出不同的值,因此,原子提交协议严格不允许一个出错的进程和一个正确的进程做出不同的决定。如果一个进程出错一段时间后又恢复,则会导致提交算法出现不一致。

其实从这三个特性可以看出,原子提交协议实际上解决了分布式共识问题(见第4章)的一个子类,即对事务的提交或中止达成共识。


前言/序言

本书写作目的

本书面向对分布式系统感兴趣的技术人员,无论初次接触分布式系统的新手、拥有工作经验的行家,还是分布式系统方面的专业人士,都可以根据自身所需阅读本书各个章节。

目前国内对分布式系统的学习非常依赖于国外课程和资源,其中的佼佼者如MIT的课程代号为6.824的经典分布式系统课程。然而,国内在分布式系统方面仍缺乏成体系的学习材料,缺乏对Paxos和Raft算法进行深入剖析同时包含实际代码实战的图书。更糟糕的是,分布式系统领域有的词语被过度复用,再加上翻译的影响,导致许多概念和术语混淆,最具代表性的便是“一致性”和“一致性算法”,读者可以就这两个概念与周围的朋友交流,应该会得到各种不同的答案。

因此,本书的写作目的还包括:

能解释清楚各种分布式原理、算法和系统“是什么”“为什么”“如何实现”,以及优缺点。同时,本书会穿插介绍许多分布式技术相关的有趣故事。

能够讲清楚算法背景,尝试解决什么问题,如何解决,以及如何优化算法。

能够尽量展示伪代码。笔者信奉“代码胜过千言”,虽然对于分布式系统来说,代码经常会比较复杂,但本书会尽量展示代码或伪代码。

能够对每个原理举例并画图说明,并结合实际案例和经验进行分析。

能够深度剖析各个案例,让读者无惧系统设计。

本书结构

本书内容涵盖常见的分布式系统基础知识,包括分布式系统定义和基本原则、分布式数据基础、分布式共识算法(以Paxos和Raft为主)、分布式事务、分布式系统中的时间问题及案例分享。

第1章主要介绍什么是分布式系统,为什么需要分布式系统,以及分布式系统带来的挑战,最后给出一些设计分布式系统时非常有用的数字。有基础的读者可以选择性阅读。

第2章主要介绍分布式系统模型,本章从两个著名的思想实验(两将军问题和拜占庭将军问题)开始,然后从网络链路、节点故障和时间三个方面对分布式系统进行分类,可作为读者日常工作中进行系统建模的引子。

第3章主要介绍分布式数据基础。为了满足分布式系统对高性能、可用性、容错性和可扩展性的需求,通常底层数据存储系统会对数据进行分散存储,常见的技术有数据分区和数据复制。然而,这也带来了一致性问题:上层应用如何理解分布式数据的不一致?什么样的数据是不一致的?什么是 CAP 定理?更深入地讲,我们该如何区分线性一致性、强一致性、弱一致性和最终一致性等容易混淆的词汇?什么是隔离级别?它和一致性又有什么不同?本章尝试厘清分布式系统中这些概念,帮助读者更好地理解和构建一个分布式数据存储系统。

第4章主要介绍分布式共识算法,即Paxos和Raft等算法。共识算法通常作为一个分布式系统的基础库被其他应用调用,各大互联网厂商如Google、Meta、Amazon、腾讯、阿里巴巴、百度和字节跳动都实现了自己的Paxos或Raft基础库。但共识算法的难以理解可谓“臭名昭著”,笔者周围许多人都被Paxos晦涩的论文和数不尽的变体“劝退”。虽说Raft更为容易理解,但想要实现一个“工业级”的Raft,仍需许多必不可少的优化,并不像大多数人想象的那么简单。因此,本章毋庸置疑是本书重点,笔者将带领读者深入浅出地理解共识算法,让读者不再畏惧Paxos和Raft算法。

第5章主要介绍常见的分布式事务实现,主要分为原子提交和并发控制两部分。原子提交算法包括两阶段提交、三阶段提交、Paxos提交、Saga事务等,并发控制包括两阶段锁、乐观并发控制和多版本并发控制。最后具体分析Google的Percolator——一个结合了两阶段提交和快照隔离的分布式事务解决方案。虽说分布式事务解决方案层出不穷,但基本离不开本书介绍的这几种类型。

第6章主要介绍分布式系统中的时间和事件顺序问题。由于分布式系统没有一个统一的时钟服务,所以诞生了许多单体系统中不存在的时钟问题,本章介绍了物理时钟、时钟同步、逻辑时钟、向量时钟和分布式快照。

第7章介绍了一些经典分布式系统的案例,这些案例的设计精妙且经久不衰,巧妙结合了前几章许多分布式系统的技术,成为人们争相模仿的对象,影响了无数的开发者和开源软件。本章重新审视这些案例,希望给读者带来新的灵感,能够帮助读者解决工作或面试中遇到的难题。

为了照顾初次接触分布式系统的读者,也为了循序渐进地展开主题,本书前两章会从基础概念讲起,有基础的读者可以选择跳过前两章的内容。

表达约定

介于不同的参考资料或不同的上下文语境,在本书中,对以下术语可能有不同的表述方式,例如:

节点:也叫进程、计算机、服务器、组件甚至副本。

分片:有时会叫分区或水平分区,本书不考究其概念上的细微差别。

共识(Consensus):国内许多博客会把Paxos或Raft等算法称为“一致性”算法,这容易与一致性(Consistency)混淆,因此,本书将其统称为共识算法。

代码与官方参考

相关链接请登录www.broadview.com.cn/42811中的下载资源处获取。

勘误和支持

笔者尽量保证书中的内容严谨,但限于笔者水平,无法保证内容百分之百全面与正确,本书可能出现的错误和不受欢迎的观点都是本人的原因,与笔者引用的参考资料没有任何关系。若读者在阅读过程中发现书中存在失误和不足,或者有任何建议,都可以通过本书源码仓库提交Issue或PR,还可以关注我的公众号“多颗糖”直接与我交流。我会把每一位读者都当作良师益友,你们的批评和意见我都会十分重视与感激,我会在本书后续版本和勘误中及时更新。