什么是数据库分片?

数据库分片是在大规模系统中实现水平扩展的一种技术。

几乎所有的实际系统都由一个接收大量读请求和非可忽略数量写请求的数据库服务器组成。这可能会使服务器超载并影响系统性能。

为了减轻这种影响并提高系统性能,有一些方法,如数据库复制和数据库分片。在本指南中,我们首先会探讨提高系统性能的技术,包括:

  • 扩大数据库服务器规模
  • 数据库复制
  • 水平分区

在讨论这些技术之后,我们将继续学习数据库分片的工作原理,并了解该方法的优势和限制。

让我们开始吧!

提高系统性能的技术

让我们首先讨论在数据库服务器存在瓶颈时提高系统性能的技术:

#1. 扩大数据库服务器规模

扩大数据库服务器实例似乎是改善系统性能的一种直接方法。这包括增强处理能力、增加更多的内存等。

然而,这种技术存在以下限制。我们无法拥有具有无限存储和处理能力的服务器。并且在一定限度之后,回报将递减。

#2. 数据库复制

当数据库服务器实例由于传入请求过载而发生时,我们可以考虑数据库复制。

在数据库复制中,我们有一个通常接收写请求的主节点和多个读副本。

这提高了可用性并减轻了系统超载。我们现在可以同时处理多个查询,因为读请求可以路由到其中一个读副本。

但这引入了另一个问题。对主节点的写请求可以更改数据,并且这些更新定期传播到读副本。

假设在一个读副本发出读请求的同时,主节点正在进行写操作。

主节点中的更改尚未传播到读副本。在这种情况下,我们可能读取过时的数据,这是不可取的。

#3. 水平分区

水平分区是另一种优化系统性能的技术。我们可能有一个包含数十亿行数据的单个大表(例如客户和交易数据表)。

从这样的数据库表中进行读操作较慢。但是使用水平分区,单个大表现在被分成多个分区(或较小的表),我们可以从中读取。关系型数据库,如PostgreSQL本地支持分区。

然而,所有的分区仍然在单个数据库服务器实例中。唯一的区别是我们现在可以从分区中读取,而不是从单个大表中。

因此,当传入请求的数量增加时,服务器可能无法支持增加的需求。

数据库分片工作原理是什么?

现在我们已经讨论了改善系统性能的方法及其限制,让我们了解数据库分片的工作原理。

在分片中,我们将单个大型数据库分割成多个较小的数据库,每个数据库运行在一个数据库服务器实例上。每个这样的较小数据库被称为分片。每个分片包含一组唯一的数据。

但是我们如何将数据库分区为分片?我们又如何确定哪些行应该放入哪些分片中?

🔑 这就引入了分片键。

了解分片键

让我们了解分片键的作用。

通常,分片键是数据库表中的一列(或多列), 应该选择这样的列,使得数据在多个分片之间均匀分布。因为我们不希望某个分片比其他分片大得多。

在一个存储客户和交易数据的数据库中,customer_ID 是一个很好的分片键候选。

一旦我们决定了分片键,我们可以设计一个哈希函数来确定哪些行应该放入哪些分片中。

在这个例子中,假设我们需要使用customer_ID作为分片键将数据库分成五个分片(分片#0到分片#4)。在这种情况下,一个简单的哈希函数是customer_ID % 5

customer_ID值除以5的余数为零时,映射到分片#0。当customer_ID值除以5的余数为1到4时,分别映射到分片#1到分片#4。

在数据库分片实现的这种方式中,有一个路由层来将传入的请求路由到正确的数据库分片。

数据库分片的优势

以下是数据库分片的一些优势:

#1. 高可伸缩性

将较大的数据库划分为多个较小的分片始终是可行的。因此,数据库分片允许我们进行水平扩展。

#2. 高可用性

当存在一个处理所有传入请求的单个数据库服务器实例时,我们就有了一个单点故障。如果数据库服务器宕机,整个应用程序都会宕机。

通过数据库分片,所有数据库分片在给定时刻都出现故障的概率相对较低。因此,如果一个特定的分片出现故障,我们将无法处理该分片的读请求。但其他分片仍然可以处理传入的请求。这提高了可用性和容错性。

数据库分片的限制

现在让我们来看看数据库分片的一些限制:

#1. 复杂性

尽管分片在可伸缩性和容错性方面具有优势,但它给系统引入了复杂性。

从记录映射到分区到实现路由层以将查询路由到相应的分片,数据库分片涉及相当复杂的工作。

#2. 重分片

分片的另一个限制是需要进行重分片。

虽然我们使用哈希函数来获得数据记录的均匀分布,但可能存在一个分片比其他分片大得多,而且可能更快耗尽。在这种情况下,我们必须考虑重分片(或重新洗牌),这会带来相当大的开销。

#3. 运行复杂查询

当您需要运行涉及连接的分析查询时,您需要使用来自多个数据库分片(而不是单个数据库)的记录。因此,当您需要运行太多的分析查询时,这可能是一项挑战。您可以通过denormalizing databases来解决这个问题,但仍需要一些努力!

结论

让我们总结一下我们所学到的内容。

扩大硬件并不总是最佳选择。因此,不建议增强服务器实例。我们还回顾了诸如数据库复制和水平分区等技术以及它们的局限性。

然后,我们学习了数据库分片的工作原理,即将大型数据库分割为更小且易于管理的分片。我们讨论了应该仔细选择分片键,以获得均匀分区和需要一个路由层来将传入请求路由到正确的数据库分片。

数据库分片具有高可用性和可扩展性等优点。其中一些缺点包括设置分片的复杂性以及当一个或多个分片耗尽时的重新分片。

因此,当您认为优势超过分片引入的复杂性时,可以考虑使用分片。接下来,查看各种AWS relational databases的比较。

类似文章