在本书的第一部分和第二部分,我们从头开始组装进入分布式数据库的所有主要因素,从磁盘的数据布局一直到出现故障时分布式一致性的极限。但是,这些讨论假定应用中只有一个数据库
实际上,数据系统通常更加复杂。在大型应用中你经常需要通过不同的方式获取和处理数据,没有单一的数据库可以满足所有不同的需求。应用因此使用多种存储产品的组合,比如数据存储,索引,缓存,分析系统等,并且实现从一个存储移动到另一个存储的机制
在本书的最后一部分,我们将围绕多个不同的数据系统(可能具有不同的数据模型,并针对不同的访问模式进行优化)集成到一个一致的应用程序体系结构中的问题。供应商常常忽略系统构建这一方面,他们声称产品可以满足您的所有需求。实际上,集成不同的系统是非平凡应用中最重要的事情之一。
在一个高层次上,存储和处理数据的系统可以被分为两个大类:
从技术上来讲,派生的数据是冗余的,是信息的复制。然而,会在查询时提供良好的性能。通常将其归一化。你可以从单一数据源派以不同角度生出不同的数据集
不是所有的系统在体系结构上对记录和派生系统又严格的区分,但是区分它们是有帮助的,因为可以梳理你的系统中的数据流:将系统中哪些是输入,哪些是输出,以及之间的依赖关系展示清楚
大多数数据库,存储引擎,和查询语言本身都不是记录或者派生系统。数据库仅仅是工具:如何使用取决于你。它们之间的区别不在于工具,而是你在应用中如何使用它们。
通过清楚地知道哪些数据是从其他数据中得出的,可以使得本来令人困惑的系统体系结构更清晰。这一点将贯穿本部分
我们将在第 10 章讨论批处理数据流的系统,比如 MapReduce,并了解它们如何向我们提供了构建大型数据系统的工具和原理。在第 11 章,我们将采用这些思路来应用到数据流,这使得我们可以以较低的延迟来做到同样的事。第 12 章通过探讨如何使用这些工具来构建可靠,可扩展以及可维护的应用总结了本书。