创建网站是在 Internet 上建立形象的第一步。为了长期繁荣,您还必须确保您的网站可以扩展以适应增长。第一步是实施一个可以随您扩展的数据库。否则,您将面临查询性能下降和数据库中断的风险。

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

什么是数据库分片?

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

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

碎片化的例子。 (图片来源:Analytics Vidhya)

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

在这方面,sharding就像分区,把一个大表分成小表。

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

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

数据库分片的好处

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

改进的水平缩放

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

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

更快的查询响应时间

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

提高断电情况下的可靠性

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

分片的缺点

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

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

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

订阅时事通讯

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

加入超过 20,000 人的行列,获取我们的每周时事通讯和 WordPress 内幕消息!

立即订阅

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

分片架构

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

  • 基于键的分片
  • 基于范围的分片
  • 基于目录的分片

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

基于键的分片

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

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

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

Range-based sharding

Range-based sharding 涉及根据指定的值范围对数据库进行分片。

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

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

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

基于目录的分片

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

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

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

使用 Kinsta 进行数据库分片

大多数现代数据库引擎都提供数据库分片支持。一种这样的数据库引擎是 MariaDB,它是 MySQL 的商业支持分支。它是 IBM、GitHub 和维基媒体等公司使用的高性能开源数据库系统。它也是 Kinsta 高性能服务器堆栈的一部分。

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

概述

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

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

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

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

  • WordPress 托管专家的即时帮助,全天候 24 小时。
  • Cloudflare 企业集成。
  • 全球观众覆盖全球 35 个数据中心。
  • 使用我们内置的应用程序性能监控进行优化。

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