在大型系统中,数据库分片是一种关键技术,用于实现水平方向的扩展能力。
几乎所有实际应用中的系统,都依赖于一个数据库服务器来处理大量的读取和写入请求。这种高负载可能导致服务器过载,进而影响系统的整体性能。
为了缓解这些问题并提高系统效率,可以采用诸如数据库复制和数据库分片等技术。在本指南中,我们将首先探讨一系列提升系统性能的方法,包括:
- 提升数据库服务器的配置
- 使用数据库复制
- 实施横向数据分区
在讨论完这些技术之后,我们将深入研究数据库分片的工作原理,并分析这种方法的优点和局限性。
让我们开始吧!
提升系统性能的策略
接下来,我们将探讨当数据库服务器面临性能瓶颈时,可以采取的提升系统性能的技术:
#1. 提升数据库服务器配置
增加数据库服务器的处理能力,例如增强 CPU 和增加内存,似乎是一种直接的性能提升方法。
然而,这种方法存在限制。我们不可能拥有无限的存储和处理能力。当服务器的配置超出一定限度时,性能提升的效果会逐渐减弱。
#2. 数据库复制
当数据库服务器因为大量的并发请求而过载时,我们可以考虑使用数据库复制技术。
数据库复制采用主从架构,通常有一个主节点负责处理写入请求,以及多个只读副本。
这种方法提高了系统的可用性并减轻了服务器的负载。读取请求可以被路由到不同的只读副本,从而实现并行处理。
但这同时引入了新的问题。主节点的写入操作会修改数据,这些更新需要定期同步到只读副本。
假设在主节点执行写操作的同时,有一个针对只读副本的读取请求。
主节点上的更改尚未同步到只读副本,这会导致读取到过时的数据,这种情况是不理想的。
#3. 横向分区
横向分区是另一种用于优化系统性能的技术。我们可能会遇到包含数十亿行的大型数据表(例如,客户和交易数据)。
从这样的大型表中读取数据会比较慢。但是,通过水平分区,我们可以将一个大表分割成多个分区(或更小的表),并从中读取数据。诸如 PostgreSQL 等关系数据库本身就支持分区功能。
尽管如此,所有分区仍然位于同一个数据库服务器实例中。唯一的区别是我们现在可以从多个分区而不是单个大型表中读取数据。
因此,当请求数量增加时,服务器仍然可能无法满足需求。
数据库分片的工作原理
在探讨了提升系统性能的方法及其局限性之后,现在我们来了解一下数据库分片是如何工作的。
在分片中,我们将一个大型数据库拆分成多个较小的数据库,每个数据库运行在单独的数据库服务器实例上。每个较小的数据库被称为一个分片。每个分片都包含一个唯一的数据子集。
但是,我们如何将数据库分割成多个分片?我们如何确定哪些数据行应该存放在哪个分片中?
🔑 关键在于分片键。
了解分片键
让我们详细了解一下分片键的作用。
分片键通常是数据库表中的一个或多个列,它的选择应该保证数据能够均匀地分布在多个分片中。我们不希望某个特定分片的数据量远大于其他分片。
在存储客户和交易数据的数据库中,`customer_ID` 是一个很好的分片键候选。
一旦确定了分片键,我们可以设计一个哈希函数来决定哪些数据行属于哪个分片。
例如,假设我们需要使用 `customer_ID` 作为分片键,将数据库分为五个分片(分片 #0 到分片 #4)。在这种情况下,一个简单的哈希函数是 `customer_ID % 5`。
通过将 `customer_ID` 除以 5 取余数,所有余数为零的 `customer_ID` 值将被映射到分片 #0。余数为 1 到 4 的 `customer_ID` 值将分别映射到分片 #1 到分片 #4。
在完成数据库分片后,重要的是建立一个路由层,将传入的请求转发到正确的数据库分片。
数据库分片的优点
以下是数据库分片的一些主要优点:
#1. 高扩展性
数据库可以被分割成多个更小的分片,因此数据库分片允许我们进行水平扩展。
#2. 高可用性
当只有一个数据库服务器实例处理所有请求时,就存在单点故障的风险。如果该服务器宕机,整个应用程序都会停止工作。
使用数据库分片,所有数据库分片在同一时间都发生故障的可能性相对较低。即使某个分片发生故障,我们仍然可以处理其他分片的请求,这提高了可用性和容错能力。
数据库分片的局限性
现在我们来回顾一下数据库分片的一些局限性:
#1. 复杂性
虽然分片在可扩展性和容错性方面具有优势,但它也增加了系统的复杂性。
从将记录映射到分区,到实施路由层以将查询发送到各个分片,分片数据库需要投入大量精力。
#2. 重新分片
分片的另一个限制是需要重新分片。
虽然我们使用哈希函数来尽可能均匀地分配数据记录,但仍然可能出现某个分片比其他分片数据量大很多,并更快地达到容量上限。在这种情况下,我们需要考虑重新分片(或重新洗牌),这将产生显著的开销。
#3. 运行复杂查询
当需要运行涉及连接的分析查询时,我们需要从多个分片获取数据,而不是从单个数据库中。这在运行大量分析查询时会成为一个挑战。虽然可以通过对数据库进行反规范化来解决这个问题,但这仍然需要付出额外的努力!
结论
让我们总结一下本文所学到的知识。
增加硬件配置并不总是最佳方案,因此不建议过度依赖提升服务器实例的性能。我们还回顾了数据库复制和水平分区等技术及其局限性。
然后,我们通过将大型数据库拆分成更小、易于管理的分片,了解了数据库分片的工作原理。我们探讨了如何仔细选择分片键,以实现均匀的分区,以及为什么需要使用路由层来将传入请求转发到正确的数据库分片。
数据库分片具有高可用性和可扩展性等优点,但缺点包括设置分片和重新分片的复杂性。当优点大于分片所带来的复杂性时,可以考虑使用分片。接下来,可以查看各种 AWS 关系型数据库的比较。