导读
数据库分片是一种用于提升数据库性能的架构模式,选择正确的分片策略和实施方式对于提高数据库性能和应对大规模数据挑战至关重要。
本文介绍了数据库分片的定义、原理和实施方法。文章解释了数据库分片是如何通过将数据切分、分散存储在多个服务器上来提升性能,并对数据库分片与传统数据库的区别进行了详细对比,探讨了何时应该考虑进行数据库分片。文章介绍了几种常见的分片策略,包括基于键、基于范围、垂直和基于目录的分片,并分析了它们的优缺点。文章还讨论了数据库分片的实施步骤和长期解决方案,强调了 TiDB 作为支持自动分片的分布式 SQL 数据库的优势 。
数据库分片是一种提升数据库性能的策略,通过把数据切分成若干部分,然后将这些部分分散存储在多个数据库服务器上。 这些被切分的数据部分称为“分片”,每个分片都包含数据的一部分。 把所有分片合起来,就构成了完整的数据集,且每条数据仅存储在一个分片中。 由于涉及更多的机器参与处理,分片能让数据库处理更多事务,存储更多数据。 对于那些需要高可扩展性的大型分布式系统,数据库分片特别有效。
数据库分片是一种“无共享”架构的体现,即每个分片操作独立的数据库服务器,不与其他分片共享任何计算资源。比如,下方左图展示了存储在计算机上的一个原始表:
若原始表非常大,查询操作就会变得非常缓慢。采用分片架构可以提升查询性能,如右图所示,数据被分成两部分,一部分存储在数据库服务器 DB1 上,另一部分则存储在 DB2 上。通过这种方式,把数据分散存储在多个服务器上,就实现了分片。
在设置数据库分片时,分片策略的选择将直接影响数据库性能。我们将在文后详细探讨不同的分片方法。这篇文章旨在深入介绍数据库分片的原理,并揭示这一流行架构模式的所有细节。
传统数据库通常运行在单一服务器上,无论是实体服务器、虚拟机还是其他形式的节点。这些系统的一个共同点是它们的性能存在上限。这也意味着,为了满足快速增长的数据处理需求,你可能需要将数据库迁移到更强大但成本更高的硬件上。一旦数据库超出当前机器的处理能力,你就必须重复这一过程。
还有另一种既昂贵又复杂的解决方法,你可以在你的环境中添加新的数据库硬件。但这需要某种方式智能地将数据分布在多台机器上,通过在多个数据库服务器上增加一个软件层或将这个能力添加到你的应用程序中来实现。这种做法非常普遍,业界也形成了专门的术语–数据库分片。
数据库分片与分区(partitioning https://docs.pingcap.com/zh/tidb/stable/partitioned-table ) 的主要区别在于其作用范围和数据分割的方式。分区发生在单个数据库服务器内部,将数据切分为多个段,即分区,但这些分区依然处于同一数据库系统内。这类似于在一个大仓库内划分不同的区域,而分片则相当于将货物分布到多个仓库中。每个分区,就像分片一样,包含数据集的一个子集,但所有分区都位于同一数据库服务器内。这种方式有助于管理大型数据表,并在不分散负载到多个服务器的情况下提升查询效率。
下图与前面的图相似。主要区别在于,原始表被分割成块,这些块位于单个数据库服务器上。分片的数据位于多个数据库服务器上。
虽然数据库分片通过将数据分割并分布到不同的数据库中以实现可扩展性,分区则在单个数据库内组织数据以实现高效管理和访问。两者都旨在提高数据库性能,只是实现方式不同。
分区和分片不是非此即彼的事情,数据库架构中二者结合的做法也是非常普遍的,在此我们不做赘述。
决定何时以及是否对数据库进行分片,就像挑选扩展业务的恰当时机一样——时机与必要性并重。数据库分片并非万能钥匙,会引入一定的复杂性。
1 何时分片
2 何时避免分片
记住, 数据库分片不是银弹,考虑周全后再决策是否适合你的数据库需求 。
分片策略的关键在于通过使用分片键,将数据高效分布至不同的分片中。不同的策略各有优缺点,选择应基于数据库的具体需求和特性。
1 基于键的数据库分片
基于键的分片利用特定值,如用户 ID 或时间戳,作为分片键。
如下图所示,我们选择了列 1 作为分片键。然后,我们对数据项应用哈希函数。哈希键决定了我们的数据将去往哪个分片。
基于键的分片有利于实现均匀分布数据。可随着数据增长,需要重新整理已有数据,维护成本较高。
2 基于范围的数据库分片(水平分片)
使用基于范围的分片方式会根据一系列值(如日期或地理位置)的范围进行数据分片划分。
在下图中,我们选择了基于 Paint Color 列进行分片, Paint Color 是一个数值。数据库将采用此数值以及分片范围来确定数据应该放置的位置。
这种方法根据范围(如字母顺序或日期范围)来实现数据分片,简单明了,非常适合时序数据这样具有清晰、均匀划分的数据类型。但如果某些范围比其他范围拥有更多数据(即热点),则可能导致数据分布不均。
3 垂直数据库分片
垂直分片根据表列分割数据,并将列分布在不同的分片中。这种模式用于将宽表分割成多个表,其中一个表比另一个表更窄,而这个更窄的表将包含最常查询的数据。如果需要查询第二个表数据的时候,你可以将第二个表与第一个表连接。
垂直分片适用于包含大量未使用列的表,通过隔离频繁访问的数据来提高性能。
4 基于目录的数据库分片
基于目录的分片策略根据表列分割数据,并将列分布在不同的分片中。
在下图中,我们再回到之前使用的 Paint Color 列。在这个例子中,我们使用字典(也称为查找表)将数据放置在特定的分片中。
此种分片策略适用于包含大量未使用列的表数据库,通过隔离频繁访问的数据来提高性能。
这种分片方法涉及使用查找目录来跟踪哪些数据在哪个分片上。虽然它提供了很大的灵活性并且可以很好地处理数据不均匀分布的问题,但引入的查找目录也带来了单点故障的风险。同时,维护和保持目录的一致性也是重要的考虑因素。
我们已经讨论了分片策略,但还有更关键细节:由谁来实施分片?换句话说,你可以手动分片你的数据库,或者你可以使用中间件层或可以有效自动分片数据的数据库。
让我们来看看我们可以使用哪些具体方法来实现手动分片或自动分片数据库:
1 自动分片:使用分布式 SQL 数据库
分布式 SQL 数据库本身就支持自动分片,大大简化了数据库的扩展和维护。
2 自动分片:中间件解决方案
中间件解决方案是指使用像 ProxySQL 或 Vitess 这样的为 MySQL 设计的分片中间件。这些工具部署在你的应用程序和数据库之间,透明处理分片逻辑。
3 手动或自动分片:使用内置分片能力的数据库
如 MySQL Cluster 或 MariaDB 等数据库都包含内置分片功能,可以提供更 MySQL 原生的分片解决方案:
4 手动分片:应用层分片
应用层分片策略通过修改你的应用程序逻辑,以在多个数据库实例间分配数据。该策略让你有更多控制权,但需要大量的开发工作。
数据库分片是一项复杂的工程,往往包含以下实施步骤:
选择正确的数据库分片策略对于组织的成长至关重要。TiDB,由 PingCAP 开发的开源分布式 SQL 数据库,内置自动分片功能。它能为现代应用提供弹性扩展、实时分析和持续数据访问。使用 TiDB 进行 RDBMS 扩展以及互联网规模 OLTP 工作负载处理的公司可从以下方面获益:
在我们探讨了数据库分片的复杂性和策略后,明显的结论是,尽管分片提供了一种强大的方法来处理大规模数据和高事务量,但它并不是一劳永逸的解决方案。特别是当考虑实施手动分片时,这一点尤为重要。因此,在决定分片之前,仔细评估数据库的规模、预期增长和可用的技术资源是非常必要的。
最终目标,无论是选择分片还是采取其他策略,都是确保数据库的可扩展性、高效性、易于维护性,并且能够满足应用程序当前和未来的需求。
在这方面,采用如 TiDB 这样支持自动分片的分布式 SQL 数据库,提供了一个理想的解决方案。它不仅能够应对规模的缩放挑战,还能够处理分片带来的复杂性,同时在处理大量数据时保持卓越的性能。这样的系统允许开发者专注于业务逻辑的实现,而不必过分担忧底层数据存储的细节,实现了技术架构的高效和灵活性。