了解数据库分片的入门

创建网站是在 Internet 上设置您的存在的第一步。 为了长期繁荣,您还必须确保您的网站可以扩展以适应增长。 第一步是实现一个可以随您扩展的数据库。 否则,您可能会遇到查询性能缓慢和数据库中断的风险。

这篇文章将讨论如何使用数据库分片来实现数据的高可扩展性和可用性。 我们还将讨论分片的缺点以及您可以使用的不同分片架构。

什么是数据库分片?

分片是一种优化技术,可将表分布在其他数据库服务器上。 这就像分区,两者都涉及将数据分解为更小的子集。 不同之处在于分片将这些子集分发到不同的服务器,同时将它们分区存储在一个数据库中。 这些服务器使用相同的数据库引擎和硬件类型来为所有分片实现相似的性能水平。

分片旨在实现无共享架构,消除处理瓶颈和单点故障。

解释数据库分片的插图。分片的一个例子。 (图片来源:Analytics Vidhya)

您可以通过两种方式实现分片——水平和垂直。 水平分片按行划分表,垂直分表按列划分表。

在这方面,分片就像分区,将大表分成更小的表。

水平分片对于大多数查询返回行子集的数据库是有效的,例如一次返回数据(如姓名、地址、电子邮件等)的客户数据库。

垂直分片对于查询返回单列的数据库是有效的。 例如,如果客户数据库分别返回客户的姓名或电子邮件,您可以将姓名和电子邮件分成不同的集群。

数据库分片的好处

以下是数据库分片的一些优点。

改进的水平缩放

您可以垂直或水平扩展数据库。 垂直扩展是指向服务器添加更多中央处理器 (CPU) 和随机存取存储器 (RAM) 以提高性能。 对于中小型数据库,垂直扩展是一个有用的解决方案。 但是,随着数据的增长,垂直扩展变得不可行。 您只能为单个服务器添加这么多的功能。

水平缩放更灵活。 它使您能够通过向系统添加更多服务器来根据需要扩展数据库。 这些服务器中的每一个都为不同的数据库分片提供资源。 这分散了工作负载并提高了系统处理更多请求的能力。

更快的查询响应时间

分片只有几行和几列。 因此,处理数据库查询所需的时间更少。 相比之下,非分片数据库的查询可能需要搜索数百甚至数千行。

提高停电情况下的可靠性

数据库中断的发生有多种原因,包括意外数据删除、连接错误和网络安全攻击。 分片可以最大限度地减少中断的影响。 由于每个分片都是自治的,因此只有受影响的分片会面临停机。 例如,如果您有四个分片并且其中一个分片出现中断,则只有 25% 的操作会受到影响。

分片的缺点

虽然分片提高了数据库的可靠性和可用性,但实现起来很复杂。 使用错误的分片架构会降低性能并导致数据丢失。

请务必选择一种允许在所有分片之间平衡数据分布的分片技术。 如果没有这种平衡,您可能会创建数据库热点,当一个分片存储大部分数据而其他分片实际上是空的时,就会发生这种情况。 这会降低单个分片的写入吞吐量。

为了解决这个问题,您可以进一步对不平衡的分片进行分区,但该过程具有挑战性,并且可能会在您迁移数据时关闭您的数据库。

订阅时事通讯

想知道我们是如何将流量提高到 1000% 以上的吗?

加入 20,000 多人的行列,他们会通过 WordPress 内幕技巧获得我们的每周时事通讯!

现在订阅

分片的另一个缺点是涉及不同分片中多个表的 SQL 连接可能会变得太慢并降低性能。 但是,使用正确的架构,您可以避免这个问题。

分片架构

您可以使用三种架构实现分片:

  • 基于密钥的分片
  • 基于范围的分片
  • 基于目录的分片

您选择的架构取决于您的用例。

基于密钥的分片

在基于键或散列的分片架构中,数据库应用程序使用分片键来定位分片。 散列函数对分片键值进行散列,输出将数据映射到特定分片。 一个简单的散列函数可以是键的模数和分片的数量。

散列函数可以采用多个分片键。 因此,基于键的分片适用于可能具有共享键的数据记录。 以算法方式分布数据可最大限度地减少创建数据库热点的可能性,其中一个分片包含比另一个分片更多的数据。

但是,由于分布仅依赖于散列函数,因此不可能在逻辑上将数据分组在一起。 因此,需要来自多个分片的数据的数据库操作可能效率低下,因为它们需要从每个分片读取数据。

基于范围的分片

基于范围的分片涉及根据指定的值范围对数据库进行分片。

它使用分片键来确定将值分配给哪个分片。 数据库应用程序在查找表中检查与分片键对应的分片并存储数据。 正因为如此,基于范围的分片很容易设计和实现。

例如,您可以使用用户数据库中的用户 ID 值作为分片键。 您可以将 ID 介于 0 到 2,000 之间的用户存储在一个分片上,将 2,000 到 4,000 之间的用户存储在另一个分片上,依此类推。

基于范围的分片会导致数据库热点。 考虑一个用户数据库,其中大部分用户 ID 位于 2,001 到 4,000 之间。 该过程将它们分配给单个分片,随着时间的推移产生不平衡。 因此,基于范围的分片最适合均匀分布的数据。

基于目录的分片

基于目录的分片将逻辑相关的数据分组在同一个分片中。 它使用一个查找表,其中包含数据库中每个实体的映射列表。 每个映射对应一个数据库分片。

基于目录的分片比基于范围或基于键的分片更灵活,因为您可以动态地将数据添加到分片。 没有可遵循的分片功能或范围内的值。 这种灵活性提高了数据库效率:您可以将相关数据存储在一个分片中,这意味着执行常见查询需要更少的时间。

例如,如果您使用基于目录的分片并根据用户的位置对用户进行分组,从特定位置检索用户,您只需查询单个分片。

使用 Kinsta 进行数据库分片

大多数现代数据库引擎都提供数据库分片支持。 其中一个数据库引擎是 MariaDB,它是 MySQL 的商业支持分支。 它是 IBM、GitHub 和 Wikimedia 等公司采用的高性能开源数据库系统。 它也是 Kinsta 高性能服务器堆栈的一部分。

MariaDB 通过蜘蛛存储引擎提供内置的分片功能。 蜘蛛存储引擎是支持分区和扩展架构 (XA) 事务的集群形成引擎。 它允许您将来自不同实例的远程表视为在同一个实例中。 在蜘蛛存储引擎中创建表后,该表将链接到远程 MariaDB 服务器中的另一个表。 建立连接后,存储引擎将与属于同一事务的所有表共享该链接。

概括

数据库分片是一种扩展技术,它将表划分为更小的子集,并将它们分布到称为分片的不同服务器上。 您可以通过多种方式实现分片,例如基于键的分片、基于范围的分片和基于目录的分片。

虽然分片提高了数据库的可扩展性、可靠性和可用性,但实现起来非常复杂。 此外,一旦创建了分片,将数据库恢复到未分片状态并不容易。 因此,仅当您确定其他可伸缩性选项不起作用时才使用分片进行优化。

无论您的企业是非营利组织还是企业级企业,Kinsta 的专家解决方案都可以消除您对网站托管的担忧,让您专注于最重要的事情。

通过以下方式节省时间、成本并最大限度地提高站点性能:

  • 来自 WordPress 托管专家的即时帮助,24/7。
  • Cloudflare 企业集成。
  • 全球受众覆盖全球 35 个数据中心。
  • 通过我们内置的应用程序性能监控进行优化。

所有这些以及更多,在一个没有长期合同、协助迁移和 30 天退款保证的计划中。 查看我们的计划或与销售人员交谈以找到适合您的计划。

相关文章