NoSQL Distilled 关键要点

在我们的书 NoSQL Distilled 中,我们用一些关键要点总结了许多章节。为了方便快速参考,我们在这里列出了这些关键要点。

全部展开 | 全部折叠

Pramod Sadalage & Martin Fowler: 2012 年 9 月 12 日

第 1 章

为什么选择 NoSQL?

  • 关系型数据库已经成功应用了二十年,提供了持久性、并发控制和集成机制。
  • 应用程序开发人员一直对关系模型和内存数据结构之间的阻抗不匹配感到沮丧。
  • 正在从将数据库用作集成点转向将数据库封装在应用程序中并通过服务进行集成。
  • 数据存储发生变化的关键因素是需要通过在集群上运行来支持大量数据。关系型数据库不是为在集群上高效运行而设计的。
  • NoSQL 是一个偶然的专有名词。没有规范的定义——你只能观察到一些共同的特征。
  • NoSQL 数据库的共同特征是

    • 不使用关系模型
    • 在集群上运行良好
    • 开源
    • 为 21 世纪的网络资产而构建
    • 无模式
  • NoSQL 兴起的最重要结果是多语言持久化。

第 2 章

聚合数据模型

  • 聚合是我们将作为一个单元进行交互的数据集合。聚合构成了数据库中 ACID 操作的边界。
  • 键值、文档和列族数据库都可以被视为聚合导向数据库的形式。
  • 聚合使数据库更容易在集群上管理数据存储。
  • 当大多数数据交互都与同一个聚合进行时,聚合导向数据库效果最佳;当交互使用以多种不同格式组织的数据时,聚合无关数据库效果更好。

第 3 章

关于数据模型的更多细节

  • 聚合导向数据库使聚合间关系比聚合内关系更难处理。
  • 图数据库将数据组织成节点和边图;它们最适合具有复杂关系结构的数据。
  • 无模式数据库允许你自由地向记录添加字段,但通常数据用户会期望有一个隐式模式。
  • 聚合导向数据库通常计算物化视图,以提供与主聚合不同的组织方式的数据。这通常使用 Map-Reduce 计算来完成。

第 4 章

分布式模型

  • 有两种分布式数据的方式

    • 分片将不同的数据分布到多个服务器上,因此每个服务器充当数据子集的单一来源。
    • 复制将数据复制到多个服务器上,因此每段数据可以在多个地方找到。

    系统可以使用其中一种或两种技术。

  • 复制有两种形式

    • 主从复制使一个节点成为处理写入的权威副本,而从节点与主节点同步并可能处理读取。
    • 对等复制允许写入任何节点;节点协调以同步它们的数据副本。

    主从复制减少了更新冲突的可能性,但对等复制避免了将所有写入加载到单个故障点上。

第 5 章

一致性

  • 当两个客户端试图同时写入相同数据时,就会发生写写冲突。当一个客户端在另一个客户端写入过程中读取不一致的数据时,就会发生读写冲突。
  • 悲观方法锁定数据记录以防止冲突。乐观方法检测冲突并修复它们。
  • 由于某些节点已收到更新而其他节点尚未收到更新,分布式系统会看到读写冲突。最终一致性意味着一旦所有写入都传播到所有节点,系统将在某个时刻变得一致。
  • 客户端通常希望读取自己的写入一致性,这意味着客户端可以写入然后立即读取新值。如果读取和写入发生在不同的节点上,这可能很困难。
  • 为了获得良好的一致性,你需要让许多节点参与数据操作,但这会增加延迟。因此,你通常需要在一致性和延迟之间进行权衡。
  • CAP 定理指出,如果你遇到网络分区,你必须在数据可用性和一致性之间进行权衡。
  • 持久性也可以与延迟进行权衡,特别是如果你想通过复制数据来生存故障。
  • 你不需要联系所有副本以保持复制的强一致性;你只需要足够大的法定人数。

第 6 章

版本戳

  • 版本戳可以帮助你检测并发冲突。当你读取数据然后更新数据时,你可以检查版本戳以确保没有人在你读取和写入之间更新数据。
  • 版本戳可以使用计数器、GUID、内容哈希、时间戳或它们的组合来实现。
  • 对于分布式系统,版本戳向量允许你检测不同的节点何时具有冲突的更新。

第 7 章

Map-Reduce

  • Map-Reduce 是一种模式,允许在集群上并行化计算。
  • 映射任务从聚合中读取数据并将其归结为相关的键值对。映射仅一次读取一条记录,因此可以并行化并在存储记录的节点上运行。
  • 归约任务接受来自映射任务的单个键的多个值并将其汇总为单个输出。每个归约器对单个键的结果进行操作,因此可以按键并行化。
  • 具有相同输入和输出形式的归约器可以组合成管道。这提高了并行性并减少了要传输的数据量。
  • Map-Reduce 操作可以组成管道,其中一个归约的输出是另一个操作的映射的输入。
  • 如果 Map-Reduce 计算的结果被广泛使用,它可以存储为物化视图。
  • 物化视图可以通过增量 Map-Reduce 操作来更新,这些操作仅计算视图的更改,而不是从头开始重新计算所有内容。

第 12 章

模式迁移

  • 具有强模式的数据库,如关系型数据库,可以通过保存每个模式更改以及它的数据迁移来进行迁移,这些更改以版本控制的顺序进行。
  • 无模式数据库仍然需要仔细迁移,因为访问数据的任何代码中都有隐式模式。
  • 无模式数据库可以使用与具有强模式的数据库相同的迁移技术。
  • 无模式数据库还可以以容忍数据隐式模式更改的方式读取数据,并使用增量迁移来更新数据。

第 13 章

多语言持久化

  • 多语言持久化是关于使用不同的数据存储技术来处理不同的数据存储需求。
  • 多语言持久化可以应用于整个企业或单个应用程序。
  • 将数据访问封装到服务中减少了数据存储选择对系统其他部分的影响。
  • 添加更多数据存储技术会增加编程和操作的复杂性,因此需要权衡良好数据存储适合性的优势与这种复杂性。

第 14 章

超越 NoSQL

  • NoSQL 只是数据存储技术的一组。随着他们对多语言持久化的舒适度提高,我们应该考虑其他数据存储技术,无论它们是否带有 NoSQL 标签。

第 15 章

选择你的数据库

  • 使用 NoSQL 技术的两个主要原因是

    • 通过使用更符合应用程序需求的数据库来提高程序员的生产力。
    • 通过某种方式处理更大的数据量、减少延迟和提高吞吐量来提高数据访问性能。
  • 在决定使用 NoSQL 技术之前,测试你对程序员生产力和/或性能的期望至关重要。
  • 服务封装支持随着需求和技术的发展而更改数据存储技术。将应用程序的各个部分分离成服务还允许你将 NoSQL 引入现有应用程序。
  • 大多数应用程序,特别是非战略性应用程序,应该坚持使用关系型技术——至少在 NoSQL 生态系统变得更加成熟之前。

第 8-11 章没有关键要点,因为这些是数据库使用的示例