在讨论分片(Sharding)之前,让我们先讨论一下数据分区(Data Partitioning):
数据分区
数据分区是一种将数据库分解为许多较小部分的技术。它是在多台机器上拆分数据库或数据表以提高数据库的可管理性、性能和可用性的过程。
方法
有许多不同的方法可以用来决定如何将应用程序数据库拆分为多个较小的数据库。以下是各种大规模应用中最常用的三种方法:
水平分区(或分表)
在该策略中,我们根据分区键定义的值区间水平分割表数据。它也被称为数据库分片。
垂直分区
在垂直分区中,我们根据列对数据进行垂直分区。我们将表划分为具有较少元素的相对较小的表,每个部分都存在于单独的分区中。
在本教程中,我们将特别关注分片。
什么是分片?
分片是一种与水平分区相关的数据库体系结构模式,它是将一个表的行分隔成多个不同表的实践,称为分区或分片。每个分区都有相同的模式和列,但也有共享数据的子集。同样,每个分区中保存的数据都是唯一的,并且独立于其他分区中的数据。
数据分片的理由是,在某个时间点之后,通过添加更多的机器来横向扩展比通过添加强大的服务器来纵向扩展更便宜、更可行。分片可以在应用程序或数据库级别实现。
分区标准
数据分区有大量可用的标准。一些最常用的标准是:
基于哈希
该策略基于哈希算法将行划分为不同的分区,而不是基于连续索引对数据库行进行分组。
这种方法的缺点是动态添加/删除数据库服务器变得昂贵。
基于列表
在基于列表的分区中,每个分区是基于列上的值列表而不是一组连续的值区间来定义和选择的。
基于区间
区间分区基于分区键的值区间将数据映射到各个分区。换句话说,我们以这样一种方式对表进行分区,即每个分区包含分区键定义的给定区间内的行。
区间应该是连续的,但不重叠,其中每个区间都为分区指定了一个非包容性的下限和上限。等于或高于区间上限的任何分区键值将添加到下一个分区。
组合
顾名思义,组合分区策略基于两种或多种分区技术对数据进行分区。在这里,我们首先使用一种技术对数据进行分区,然后使用相同或其他方法将每个分区进一步细分为子分区。
优点
但为什么我们需要分片?以下是一些优点:
- 可用性(Availability):为分区数据库提供逻辑独立性,确保应用程序的高可用性。这里可以独立管理各个分区。
- 可扩展性(Scalability):通过跨多个分区分布数据,证明了可扩展性。
- 安全性(Security):通过在不同分区中分别存储敏感和非敏感数据,帮助提高系统的安全性。这可以为敏感数据提供更好的可管理性和安全性。
- 查询性能(Query Performance):提高系统性能。现在系统只需要查询较小的分区,而不是查询整个数据库。
- 数据可管理性(Data Manageability):将表和索引划分为更小、更易于管理的单元。
缺点
- 复杂性(Complexity):分片通常会增加系统的复杂性。
- 跨分片连接(Joins across shards):一旦数据库被分区并分布在多台机器上,执行跨多个数据库碎片的连接通常是不可行的。由于必须从多个服务器检索数据,因此这样的连接将不会具有性能效率。
- 重新平衡(Rebalancing):如果数据分布不均匀或单个分片上有大量负载,在这种情况下,我们必须重新平衡分片,以便请求尽可能均匀地分布在分片之间。
何时使用分片?
以下是分片可能是正确选择的一些场景:
- 利用现有硬件而不是高端机器。
- 维护不同地理区域的数据。
- 通过添加更多分片快速扩展。
- 由于每台机器负载较少,因此性能更好。
- 当需要更多并发连接时。