扩展数据库是一个挑战。随着业务的增长,你可能开始难以处理不断增加的吞吐量或数据规模。你可能会发现查询延迟变得更差,或者硬件资源达到了极限。这时,经典的解决方案通常是通过升级硬件实现垂直扩展,但是否有更好的办法?如果硬件的性能已经达到上限,又该怎么办?
这正是水平分片可以解决的问题。在本文中,我们将介绍一些数据库可能适合水平分片的常见指标,同时也会介绍在进行分片前的一些可实施措施。让我们一起深入了解吧!


突破极限

在扩展数据库时,你可能会遇到各种不同的瓶颈。在数据库层面,瓶颈通常出现在以下几个方面:CPU、内存、磁盘空间或 IOPS(每秒输入输出操作)。
这些瓶颈可能会对你的业务产生重大影响。例如:

  • 数据库操作(如架构更改)开始变得更慢,导致新功能难以上线;
  • 查询延迟增加,导致响应变得迟缓;
  • 当情况更糟时,甚至可能导致故障和数据中心宕机事件。

数据库扩展的选项

在考虑分片之前,确保已经探索了其他扩展方式。
当单服务器资源被完全占用时,你需要将负载分布到更多节点。以下是几种常见的扩展方法:

1. MySQL 副本

一种可靠的 MySQL 扩展方法是使用副本(replicas)来处理读取请求。这需要配置副本服务器,同时对应用程序进行修改,为读取和写入分别设定不同的连接字符串。大多数 Web 应用程序的数据访问模式以读取为主,这种方法允许通过添加更多副本来继续扩展读取能力。

2. 数据分段

另一个策略是通过对表的逻辑分组,增加更多 MySQL 集群。例如,可以将某些服务或产品领域(例如用户或通知)相关的所有表分离到一个新的集群。这有时被称为垂直分片(Vertical Sharding 或 Vertical Partitioning)。下面的示意图展示了如何将包含用户表和通知表的集群通过垂直分片,将通知表移动到独立的集群中:
分片前的集群:
包含用户表和通知表的单集群。
垂直分片后的集群:
用户表和通知表分离到不同的集群。
尽管垂直分片是一种可行选项,但它也有一些缺点:除了需要对应用程序进行连接字符串的更改外,还需要处理更复杂的操作,例如在没有使用 Vitess 等框架的情况下,在分离到不同服务器的表之间无法执行 JOIN 操作。
当数据库已被分割到最小的逻辑表组时,可能仍然会遇到瓶颈。这时就需要水平分片了。


水平分片

水平分片(Horizontal Sharding)与之前提到的垂直分片不同。水平分片并不是通过将整个表移动到其他地方实现分片,而是让每个底层数据库集群拥有相同的架构,仅通过分割行数据的方式来实现分片。
水平分片后的表:
每个分片都共享相同的架构,但存储不同的行数据。


历史与现代水平扩展

在过去,水平分片通常是最大的互联网公司在运维瓶颈时的最后手段,且通常需要自行构建分片解决方案。例如,Facebook 的 TAO、Twitter 的 Gizzard 和 YouTube 的 Vitess。分片被视为在尝试所有其他方案之后,仍需解决增长问题的最后一招。
但今天,分片已经有了不同的视角。自 2011 年 YouTube 开源 Vitess 以来,这种分片解决方案逐渐被广泛采用,它使得水平分片更加可行且易于使用。如今,分片不仅不再是最后的选择,甚至在早期实施分片还能帮助避免更大的应用程序变更。


何时进行分片

那么,如何判断数据库是否准备进行分片呢?以下几种指标可以帮助你决定是否考虑分片:

  • 数据规模达到上限;
  • 写入吞吐量达到瓶颈;
  • 读取吞吐量达到瓶颈。

下面,我们将逐一说明这些类别。

1. 数据规模

最初需要分片的原因之一是磁盘容量不足以存储所有数据。但现如今,磁盘容量不再是主要问题。例如,Backblaze 最近购买了超过 4 万块容量为 16TB 的硬盘!
然而,数据规模仍然是驱动分片的一个因素。需要考虑工作集容量以及其中有多少能装入内存。当活跃数据不能完全存储在内存中,更多查询被迫从磁盘读取时,查询延迟会增加。
更大的数据规模还会影响许多数据库操作,例如备份和恢复。而且,执行其他操作(如配置新副本或进行架构更改)需要更长的时间。这正是 Vitess 制定分片大小指南背后的逻辑:更小的分片数据规模有助于提升管理效率。


2. 写入吞吐量

当数据库集群的写入吞吐量达到瓶颈时,是考虑分片的另一个原因。这种情况可能会以下两种方式表现出来:

  • IOPS 达到上限: 主库在处理 IOPS 方面达到极限时,写操作的性能会开始下降。然而在此之前,复制延迟通常会成为一个问题。

尽管 MySQL 的复制性能近年来有所改善,但主库和副本库之间总会存在一定的写入延迟。如果副本库无法及时同步主库,用户可能看到的是不一致或陈旧的数据,而如果应用程序尝试读取刚写入的数据,还可能因为延迟而出现错误。

  • 其他操作性能下降: 包括架构更改和批量任务,这些操作在写入吞吐量达到瓶颈时也会变得更慢。

3. 读取吞吐量

虽然通过读写分离和增加副本可以解决读取能力不足的问题,但这并非没有挑战。如上文所述,复制延迟可能会导致用户体验差。此外,与其通过副本解决读取吞吐量问题,更早采用水平分片可以避免复制延迟,并简化应用代码的复杂性(如管理多个连接字符串)。最重要的是,水平分片还能为未来增长做好准备,让你不必在写入吞吐量或数据规模成为问题时再回来实施分片。


分片的优势

分片不仅可以解决大数据规模扩展的问题,还可以用于扩展读取和写入的吞吐量。此外,分片还提供以下优势:

  • 更好的成本优化: 随着扩展的增加,分片可以帮助企业实现更高的成本效益。
  • 提高并行性性能: 对备份、恢复和架构更改任务的并行处理速度有所提升。
  • 更好的 SLA: 通过减少故障域的影响范围到单一分片,提高服务质量。
  • 可预测的水平扩展: 通过分片实现线性的扩展路线图。

综上所述,分片是一种强大的工具,无论在早期还是扩展过程中都能为数据库的可扩展性提供关键支持,同时避免后续复杂的应用程序更改。



如何扩展你的数据库以及何时对 MySQL 进行分片插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://folen.top/2025/09/13/mysql-scale/