Designing Data-Intensive Application

原文地址

DDIA

如果近几年从业于软件工程,特别是服务器端和后端系统开发,那么你很有可能已经被大量关于数据存储和处理的时髦词汇轰炸过了: NoSQL!大数据!Web-Scale!分片!最终一致性!ACID! CAP 定理!云服务!MapReduce!实时!

在最近十年中,我们看到了很多有趣的进展,关于数据库,分布式系统,以及在此基础上构建应用程序的方式。这些进展有着各种各样的驱动力:

  • 谷歌、雅虎、亚马逊、脸书、领英、微软和推特等互联网公司正在和巨大的流量 / 数据打交道,这迫使他们去创造能有效应对如此规模的新工具。
  • 企业需要变得敏捷,需要低成本地检验假设,需要通过缩短开发周期和保持数据模型的灵活性,快速地响应新的市场洞察。
  • 免费和开源软件变得非常成功,在许多环境中比商业软件和定制软件更受欢迎。
  • 处理器主频几乎没有增长,但是多核处理器已经成为标配,网络也越来越快。这意味着并行化程度只增不减。
  • 即使你在一个小团队中工作,现在也可以构建分布在多台计算机甚至多个地理区域的系统,这要归功于譬如亚马逊网络服务(AWS)等基础设施即服务(IaaS)概念的践行者。
  • 许多服务都要求高可用,因停电或维护导致的服务不可用,变得越来越难以接受。

数据密集型应用(data-intensive applications) 正在通过使用这些技术进步来推动可能性的边界。一个应用被称为 数据密集型 的,如果 数据是其主要挑战(数据量,数据复杂度或数据变化速度)—— 与之相对的是 计算密集型,即处理器速度是其瓶颈。

帮助数据密集型应用存储和处理数据的工具与技术,正迅速地适应这些变化。新型数据库系统(“NoSQL”)已经备受关注,而消息队列,缓存,搜索索引,批处理和流处理框架以及相关技术也非常重要。很多应用组合使用这些工具与技术。

这些生意盎然的时髦词汇体现出人们对新的可能性的热情,这是一件好事。但是作为软件工程师和架构师,如果要开发优秀的应用,我们还需要对各种层出不穷的技术及其利弊权衡有精准的技术理解。为了获得这种洞察,我们需要深挖时髦词汇背后的内容。

幸运的是,在技术迅速变化的背后总是存在一些持续成立的原则,无论你使用了特定工具的哪个版本。如果你理解了这些原则,就可以领会这些工具的适用场景,如何充分利用它们,以及如何避免其中的陷阱。这正是本书的初衷。

本书的目标是帮助你在飞速变化的数据处理和数据存储技术大观园中找到方向。本书并不是某个特定工具的教程,也不是一本充满枯燥理论的教科书。相反,我们将看到一些成功数据系统的样例:许多流行应用每天都要在生产中满足可伸缩性、性能、以及可靠性的要求,而这些技术构成了这些应用的基础。

我们将深入这些系统的内部,理清它们的关键算法,讨论背后的原则和它们必须做出的权衡。在这个过程中,我们将尝试寻找 思考 数据系统的有效方式 —— 不仅关于它们 如何 工作,还包括它们 为什么 以这种方式工作,以及哪些问题是我们需要问的。

阅读本书后,你能很好地决定哪种技术适合哪种用途,并了解如何将工具组合起来,为一个良好应用架构奠定基础。本书并不足以使你从头开始构建自己的数据库存储引擎,不过幸运的是这基本上很少有必要。你将获得对系统底层发生事情的敏锐直觉,这样你就有能力推理它们的行为,做出优秀的设计决策,并追踪任何可能出现的问题。

本书纲要

本书分为三部分:

  1. 第一部分 中,我们会讨论设计数据密集型应用所赖的基本思想。我们从 第一章 开始,讨论我们实际要达到的目标:可靠性、可伸缩性和可维护性;我们该如何思考这些概念;以及如何实现它们。在 第二章 中,我们比较了几种不同的数据模型和查询语言,看看它们如何适用于不同的场景。在 第三章 中将讨论存储引擎:数据库如何在磁盘上摆放数据,以便能高效地再次找到它。第四章 转向数据编码(序列化),以及随时间演化的模式。
  2. 第二部分 中,我们从讨论存储在一台机器上的数据转向讨论分布在多台机器上的数据。这对于可伸缩性通常是必需的,但带来了各种独特的挑战。我们首先讨论复制(第五章)、分区 / 分片(第六章)和事务(第七章)。然后我们将探索关于分布式系统问题的更多细节(第八章),以及在分布式系统中实现一致性与共识意味着什么(第九章)。
  3. 第三部分 中,我们讨论那些从其他数据集衍生出一些数据集的系统。衍生数据经常出现在异构系统中:当没有单个数据库可以把所有事情都做的很好时,应用需要集成几种不同的数据库、缓存、索引等。在 第十章 中我们将从一种衍生数据的批处理方法开始,然后在此基础上建立在 第十一章 中讨论的流处理。最后,在 第十二章 中,我们将所有内容汇总,讨论在将来构建可靠、可伸缩和可维护的应用程序的方法。