Skip to Content
设计数据密集型应用程序
book

设计数据密集型应用程序

by Martin Kleppmann
May 2025
Beginner to intermediate
616 pages
7h 31m
Chinese
O'Reilly Media, Inc.
Book available
Content preview from 设计数据密集型应用程序

第 6 章 分区 分区

本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com

显然,我们必须摆脱顺序性,不能限制计算机。我们必须说明定义,规定数据的优先级和描述。我们必须说明关系,而不是程序。

格蕾丝-默里-霍珀,《管理与未来计算机》(1962 年)

第 5 章中,我们讨论了复制问题,即在不同节点上复制多份相同数据。对于非常大的数据集或非常高的查询吞吐量来说,这还不够:我们需要将数据分割成多个分区,也就是所谓的分片i

术语混乱

我们在这里所说的分区,在 MongoDB、Elasticsearch 和 SolrCloud 中被称为shard;在 HBase 中被称为region,在 Bigtable 中被称为tablet,在 Cassandra 和 Riak 中被称为vnode,在 Couchbase 中被称为vBucket。不过,"分区"是最常用的术语,所以我们还是使用它。

通常,分区的定义方式是,每条数据(每条记录、每行或文档)正好属于一个分区。实现这一点有多种方法,我们将在本章中深入讨论。实际上,每个分区都是自己的一个小型数据库,尽管数据库可能支持同时触及多个分区的操作。

希望对数据进行分区的主要原因是可扩展性。不同的分区可以放置在无共享集群的不同节点上(关于无共享的定义,请参阅第二部分导言)。因此,大型数据集可以分布在许多磁盘上,查询负载也可以分布在许多处理器上。

对于在单个分区上运行的查询,每个节点都可以独立执行自己分区的查询,因此可以通过增加节点来扩展查询吞吐量。大型复杂查询有可能在多个节点上并行执行,但难度明显增加。

20 世纪 80 年代,Teradata 和 Tandem NonStop SQL 等产品率先推出了分区数据库[1],最近,NoSQL 数据库和基于 Hadoop 的数据仓库又重新发现了分区数据库。有些系统是为事务性工作负载设计的,有些则是为分析设计的(参见"事务处理还是分析?

在本章中,我们将首先了解对大型数据集进行分区的不同方法,并观察数据索引与分区之间的交互。然后,我们将讨论再平衡,如果要在集群中添加或删除节点,就必须进行再平衡。最后,我们将概述数据库如何将请求路由到正确的分区并执行查询。

分区和复制

分区通常与复制相结合,以便将每个分区的副本存储在多个节点上。这意味着,即使每条记录只属于一个分区,为了容错,它仍然可以存储在多个不同的节点上。

一个节点可以存储多个分区。如果使用 "领导者-追随者 "复制模型,那么分区和复制的组合可以如图 6-1 所示。 每个分区的领导者被分配给一个节点,而其追随者被分配给其他节点。每个节点可能是某些分区的领导者,而其他分区的追随者。

我们在第 5 章中讨论的关于数据库复制的所有内容同样适用于分区复制。分区方案的选择在很大程度上与复制方案的选择无关,因此在本章中我们将保持简单,忽略复制。

ddia 0601
图 6-1. 复制与分区相结合:每个节点在某些分区中担任领导者,在其他分区中担任跟随者。

键值数据分区 ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Start your free trial

You might also like

Python设计模式(第2版)

Python设计模式(第2版)

Posts & Telecom Press, Chetan Giridhar
Kafka权威指南(第2版)

Kafka权威指南(第2版)

Gwen Shapira, Todd Palino, Rajini Sivaram, Krit Petty
超越Vibe编程

超越Vibe编程

Addy Osmani

Publisher Resources

ISBN: 9798341656581Supplemental Content