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