分区
看看我们如何通过分片使系统具备可扩展性。
分布式系统的一个主要优势是可扩展性。
可扩展性
可扩展性使我们能够存储和处理远超单台机器能力的数据集。
实现可扩展性的机制
实现可扩展性的主要机制之一是分片(partitioning)。
分片
分片是指将一个数据集拆分为多个较小的数据集,并将存储和处理这些数据的责任分配给分布式系统中的不同节点。这样,我们可以通过增加节点来提升系统处理数据的能力。
分片有两种主要形式:
- 垂直分片
- 水平分片(也称为 分片)
“垂直”和“水平”这两个术语起源于关系型数据库时代,当时确立了数据的表格化视图概念。
在这种视图中,数据由行和列组成,每一行代表数据集中的一个条目,每一列代表每个条目的一个属性。
下图直观展示了垂直分片与水平分片之间的区别。
垂直分片
垂直分片是将一张表拆分为多张包含更少列的表,并通过额外的表来存储跨表关联的列信息。这种操作通常被称为连接操作(join operation)。拆分后的各张表可以分别存储在不同的节点上。
规范化(Normalization)是一种实现垂直分片的方式。然而,一般的垂直分片远不止于此:即使数据已经规范化,仍可能对某一列进行拆分。
水平分片
水平分片是将一张表拆分为多个较小的表,每张表包含原表中的一部分行。然后,这些子表可以分别存储在不同的节点上。
我们可以通过多种策略来执行这种拆分。
一种简单的做法是按字母顺序进行拆分。例如,我们可以根据学生姓名的姓氏对学校学生表进行水平分片。下图展示了这一过程。
分片的局限性
在垂直分片系统中,需要合并来自不同表的数据的请求(即连接操作)效率会降低。这是因为这类请求可能需要访问多个节点上的数据。
在水平分片系统中,通常可以避免访问多个节点,因为每行数据的所有内容都集中在一个节点上。但当查询涉及跨越多个节点的行范围时,仍然可能需要访问多个节点。
另一个重要的影响是水平分片可能导致事务语义的丢失。
在单机环境中,我们可以轻松地以原子方式执行多个操作,即要么全部成功,要么全部失败。但在分布式系统中,这变得非常困难。
因此,在水平分片的情况下,当数据分布在不同节点上时,要实现原子操作变得更加复杂。
这是分布式系统中的一个普遍现象:没有万能解决方案。我们必须在不同特性之间做出权衡,才能获得期望的系统属性。
垂直分片主要是一种数据建模实践,通常由系统设计工程师独立完成,有时甚至不依赖于具体的存储系统。而水平分片则是分布式数据库的常见特性。因此,为了正确使用这类系统,工程师必须了解其内部工作原理。所以,我们将重点讨论水平分片。