数据分片(Sharding)概念介绍
2026/8/11 23:11:53 网站建设 项目流程

分片概述

虽然现代数据库理论上可以支持非常大的数据量(TB级、PB级),但在实际应用中,达到这些理论极限之前,往往就会遇到性能瓶颈、备份与恢复时间过长等问题。这也是为什么在数据量达到一定规模时,很多系统会采取数据库分片(Sharding)来优化存储和性能的原因。
分片是一种提高数据库扩展性的方法,用于将一个数据集分成两个或多个较小的块(chunk),称为逻辑分片(logical shards)。然后,逻辑分片(logical shards)分布在单独的数据库节点上,称为物理分片(physical shards)。物理分片(physical shards)可以容纳一到多个逻辑分片(logical shards)。分片允许将较大的数据集拆分成较小的块并存储在多个数据节点中,从而增加系统的总存储容量、吞吐量等能力。
这些被切分的数据称为"分片",每个分片都包含数据的一部分。把所有分片合起来,就构成了完整的数据集,且每条数据仅存储在一个分片中。由于涉及更多的机器参与处理,分片能让数据库处理更多事务,存储更多数据。对于那些需要高可扩展性的大型分布式系统,数据库分片特别有效。
根据分片的方向,可以将数据分片进一步划分为垂直分片(vertical sharding)和水平分片(horizontal sharding)两种。垂直分片是指将一个大表按照列(即数据的属性)进行分割,将相关性较高或者经常一起使用的列划分到不同的表(也称为分片)中。每个分片包含原表的一部分列,不同分片可以存储在不同的数据库服务器上。这种分片方式基于数据的不同属性或功能进行划分。水平分片则是根据行(即数据的记录)来分割数据,将表中的数据按某种逻辑(如用户ID的范围、时间戳等)划分到不同的分片中,每个分片包含所有列但只保存一部分行记录。这样,不同的分片可以分布在不同的数据库服务器上,实现数据的分布式存储。垂直分片是一种scale-up实现,水平分片是一种scale-out实现。

注意,垂直分片和水平分片不是完全隔离的两种分片技术,在业务服务中,可以同时使用垂直分片和水平分片。对于一个行数较多的大表来说,可以分别对其进行垂直分片和水平分片,以提高服务的处理能力。
除了根据分片的方向对分片进行分类,还可根据分片技术作用的技术层次,将其进行技术分类,由于业务服务对这种分类的感知必要性不高,这里不再介绍,有兴趣的同学,可以参考"一文读懂数据分片技术差异"这篇文章。
分片是一种扩展形式,称为水平扩展或横向扩展,因为会引入更多节点来分担负载。水平扩展可实现近乎无限的可扩展性,以处理大数据和高强度工作负载。相比之下,垂直扩展是指通过更强大的 CPU、更大的 RAM 或更大的存储容量来提高单台机器或单台服务器的性能。
对于垂直分片,主流数据库均未提供逻辑垂直分片能力,均是物理垂直分片能力,而物理垂直分片能力就是新增表的能力。所以后续如无特殊说明,介绍的分片均指水平分片。

分片的优缺点

在使用分片前,应充分评估其优缺点对业务服务的影响,只有在明确其使用价值大于其带来的问题后,才考虑使用该技术。接下来将分别介绍下分片的优点和缺点。

分片的优点

  1. 提升系统可扩展性:随着业务的发展,对数据库的吞吐量可能会急剧增长。分片可以通过增加更多的数据库服务器来水平扩展系统的处理能力。通过添加额外的分片来适应业务增长,确保系统性能保持稳定,从而更容易应对高并发场景。
  2. 提高性能:随着数据量的增加,单一数据库的查询、写入速度会逐渐下降。通过分片技术,可以将数据分散到多个数据库或表中,减少单个数据库的负担,从而提高系统的整体性能。
  3. 提高可用性:由于数据是分布式的,即使部分数据库发生故障,其他数据库仍能继续提供服务,保证了系统的可用性。这对于很多需要7x24小时不间断服务的业务至关重要。

分片的缺点

尽管分片能够有效解决大数据量和高并发带来的问题,但它也会带来系统复杂度上升的问题,引入了一些新的挑战和潜在问题,主要包括:

  1. 复杂性:分片为数据库架构带来了复杂性。它需要仔细规划、监控和维护。选择正确的分片策略、分片键等技术细节可能具有挑战性。此外,管理大量分片可能变得很麻烦。分片创建、删除和重新平衡需要仔细协调和自动化。
  2. 数据分布不均:如果分片策略设计不当,可能导致数据在不同库或表之间的分布不均匀(数据倾斜),某些库或表负载过高,而其他则资源闲置,影响整体性能。
  3. 数据一致性问题:在分布式系统中,保持数据一致性是一个挑战,尤其是在涉及跨分片的操作时。需要采用分布式事务、最终一致性的策略或使用分布式锁等机制来确保数据的一致性,并且可能会影响性能。
  4. 跨分片操作问题:尽管数据进行了分片,但对外部来说,还是一个逻辑的整体。对于需要跨分片的操作,如何在业务请求拆分到各个分片,然后再处理完后,又将各个分片的结果统一是一个难点。如某些查询可能跨越多个分片,需要协调机制来检索、合并和连贯地呈现数据,从而影响性能。

分片实现策略

常见的分片策略有以下几种:

  1. 哈希分片:
    ○ 原理:通过计算分片键的哈希值,并根据哈希值的范围或取模运算结果来决定数据存放在哪个分片上。这种方法可以非常均匀地分布数据,适用于不需要保持数据顺序的场景。
    ○ 优点:数据分布均匀,扩展性好,容易实现。
    ○ 缺点:不适合范围查询,且分片键的选择对性能影响大。
  2. 范围分片:
    ○ 原理:根据分片键的值范围来决定数据的存储位置。如,按时间戳将数据分配到不同的表或库中。
    ○ 优点:支持范围查询和排序操作,直观易理解。
    ○ 缺点:数据分布可能不均匀,扩展时可能需要重新分配数据。
  3. 列表分片(也称为指定位分片):
    ○ 原理:预先定义一系列的分片键值,每个值对应一个分片。数据根据分片键值直接映射到对应的分片。
    ○ 优点:简单直观,适用于分片键取值范围有限且已知的场景。
    ○ 缺点:扩展性和灵活性较差,分片键值的增减可能需要重新调整分片。
  4. 一致性哈希:
    ○ 原理:一种特殊的哈希算法,可以解决普通哈希分片在节点增删时重分布数据的问题。数据通过哈希环映射到不同的节点,增加或减少节点只影响相邻节点的数据。
    ○ 优点:在节点变化时能最小化数据迁移,适用于动态扩展的场景。
    ○ 缺点:实现相对复杂,且在极端情况下仍可能存在数据分布不均。
    分片策略有很多,这里仅列举几种比较常见的分片策略。
    选择合适的分片策略需要根据业务的具体需求、查询模式、数据增长预期以及系统的扩展目标来决定。在实际应用中,可能还会结合中间件等技术来进一步优化分片管理、查询路由和数据一致性等问题。

分片(Sharding)和分区(Partitioning)的对比

分片(Sharding)和分区(Partitioning)都是数据库和分布式系统中用于数据分布和管理的策略。它们都旨在通过将数据分割成更小的、更易于管理的部分来提高性能、可扩展性和可用性。
分片用于将一个数据集合切分成多个分片。然后,分片分布在单独的数据库节点上。每个数据库节点可以容纳一到多个分片。分片允许将较大的数据集拆分成较小的块并存储在多个数据节点中,从而增加系统的总存储容量、吞吐量等能力。
分区用于将一个数据集合切分成多个分区。分区会将数据库中的表划分为多个部分,每个部分称为分区。每个分区存储表中的一部分行数据,并独立存储。通过将表分割为多个分区,从而提高查询性能。
分片与分区的主要区别在于其作用范围和数据分割的方式。分区发生在单个数据库服务器内部,将数据切分为多个段,即分区,但这些分区依然处于同一数据库系统内。这类似于在一个大仓库内划分不同的区域,而分片则相当于将货物分布到多个仓库中。每个分区,就像分片一样,包含数据集的一个子集,但所有分区都位于同一数据库服务器内。这种方式有助于管理大型数据表,并在不分散负载到多个服务器的情况下提升查询效率。

上图中,分区会将原始表分割成块,然后这些块位于单个数据库服务器上。而,分片的数据在切分后,位于多个数据库服务器上。
接下来简单对比下分片和分区:
(1) 数据分布位置:分区通常在单个数据库实例内部进行,而分片可能跨越多个数据库实例或服务器。
(2) 分片的管理:分区通常由数据库管理系统自动管理,而分片可能需要额外的中间件或服务来管理数据的分布和路由。
(3) 复杂性:分片可能比分区更复杂,因为它涉及到跨多个节点的数据管理和一致性问题。
从上面的对比可知,分区适用于单个数据库实例内的数据组织,而分片适用于跨多个节点的大规模分布式系统。在实际应用中,分区和分片可以结合使用,以满足不同的性能、可扩展性和可用性需求。例如,一个分布式数据库可能在每个分片内部使用分区来进一步优化数据的存储和访问。

分片时机

与任何分布式架构一样,数据库分片并非免费提供。设置分片、维护每个分片上的数据以及正确路由这些分片之间的请求会产生开销和复杂性。在开始分片之前,请考虑以下替代解决方案是否可以解决问题:
(0) 什么也不做
在没有任何明显瓶颈或限制因素(例如用尽可以支持工作负载的硬件)的情况下,分片不是一个好主意。不建议对一个数据量和访问量都不高的业务服务提供分片能力。
(1) 升级机器
只需升级机器就可解决业务瓶颈,而无需分片的复杂性。添加 RAM、升级机器的CPU或增加数据库可用的存储空间都是简单的解决方案,不需要您更改数据库架构或应用程序的设计。
(2) 专业服务或数据库
根据业务需求,将一部分负担转移到其他提供商甚至单独的数据库上可能更有意义。例如,可以将 blob 或文件存储直接移动到云提供商(如 Amazon S3)。分析或全文搜索可以由专业服务或数据仓库处理。卸载此特定功能比尝试分片整个数据库更有意义。
(3) 使用缓存
如果业务服务的读取性能存在瓶颈,那么缓存是一种有助于改善性能的策略。缓存涉及将已请求的数据临时存储在内存中,以便后续的请求可以更快地访问它。
(4) 提供副本
如果业务数据工作负载主要以读取为重点,则使用副本可提高可用性和读取性能,同时避免数据库分片的一些复杂性。只需启动数据库的额外副本,就可以通过负载平衡或地理定位查询路由来提高读取性能。但是,部分会给以写入为中心的工作负载带来复杂性,因为必须将每个写入复制到每个复制节点。
如果以上替代解决方案均未能解决问题,则有必要考虑分片。数据分片不是银弹,只有在必要时,才应考虑分片。同时,已使用分片的应用程序具有以下主要特征:
(1) 应用程序数据量增长到超过单个数据库节点的存储容量。当数据库承受数百万用户或 TB 级别数据的压力开始挣扎时,分片便显得尤为必要。
(2) 对数据库的写入或读取量超出了单个节点或其读取副本可以处理的范围(如数据库连接达到了上限,且成为了读写的瓶颈),导致响应时间变慢或超时。
(3) 应用程序所需的网络带宽超过了单个数据库节点和任何读取副本可用的带宽,导致响应时间变慢或超时。
(4) 扩展性需求迫在眉睫,业务快速增长,持续的数据与用户增长成为了新常态。如发布的某一款应用,成为了爆款。

参考

https://juejin.cn/post/7315117029983207461 Scaling Your Database: A Comprehensive Guide to Sharding and Partitioning
https://www.mongodb.com/resources/products/capabilities/database-sharding-explained Database Sharding: Concepts and Examples
https://cn.pingcap.com/blog/database-sharding/ 数据库性能优化入门:数据库分片初探
https://cloud.tencent.com/developer/article/1902755 一文读懂数据分片技术差异
https://www.amazonaws.cn/knowledge/database-sharding/ 什么是数据分片?
https://www.mongodb.com/resources/products/capabilities/database-sharding-explained Database Sharding: Concepts and Examples
https://learn.microsoft.com/en-us/azure/architecture/patterns/sharding Sharding pattern
https://developer.aliyun.com/article/1596741 分区和分片
https://hazelcast.com/glossary/sharding/ What is Sharding
https://architecturenotes.co/p/database-sharding-explained Database Sharding Explained
https://www.digitalocean.com/community/tutorials/understanding-database-sharding Understanding Database Sharding
https://www.cnblogs.com/qcloud1001/p/10405281.html 数据库分片(Database Sharding)详解

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询