什么是数据库分片?

22-12-30 banq

了解跨多台机器拆分数据库如何通过并行处理大容量应用程序的请求来提高性能
当存储在数据库中的数据增长到开始影响应用程序性能的程度时,数据库分片是一种有用的数据库架构模式。
数据库分片是一种高级数据库架构概念,该过程通常在数据库大小随时间增加且应用程序需要扩展的组织中获得。
数据库分片是将大型数据库拆分为多个数据库并跨多台机器存储的过程。分片过程可以提高性能,缩短查询的响应时间,并使团队能够在不影响应用程序可用性的情况下扩展团队。

数据库分片是一种架构技术,可加快严重依赖大数据的应用程序的性能,例如金融科技、社交媒体、银行和支付应用程序,这些应用程序会不断触发大量事件以保存/检索数据数据输入/来自数据库。

1. 什么是数据库分片?

  • 数据库分片是一种数据库架构模式。
  • 该过程涉及将更大的数据集(例如大表)拆分为多个逻辑集,称为分片。
  • 然后分片分布在不同的数据库服务器上。
  • 所有分片的联合构成了整个数据集。

数据库服务器一起存储和处理大型数据集

在以下情况下通常需要分片:
  • 数据量增长,将所有数据存储在单个数据库中变得难以管理。
  • 写入/读取请求量和响应时间各不相同,并且更容易在不同的专用服务器之间拆分和扩展数据以减少请求的响应时间
  • 所有流量都路由到单个数据库服务器,这对应用程序性能的影响很差,并且应用程序开始出现超时。


2. 数据库分片是如何工作的?

  • 有多种方法可以创建分片和拆分数据。选择的方法可能因应用程序而异。
  • 数据库分片可以基于特定列或一组数据属性,这完全取决于我们为什么需要创建分片。例如,如果我们在全球范围内存储公司的数据,并且如果我们开始遇到居住在英国的公司的高流量,我们可以根据公司的位置拆分我们的数据。例如,我们可以创建两个分片:英国分片和非英国分片,然后我们可以将英国分片托管在英国地区托管的数据库服务器中。这种技术被称为Geo Shard。

还有其他分片技术,包括范围分片和基于目录的分片。我将用一个例子来解释这些概念。
  • 让我们考虑一个包含以下列的数据库表:UserID(整数主键)、Name(文本)、Importance(整数)和 IsLocked(布尔值)



我们可以将这个表拆分/分区成多个分片,并将分片部署在不同的机器上。例如,我们可以垂直拆分数据库,从而可以将一部分行分区以存储到不同的逻辑分片中。应用程序可以计算分片键以确定数据所在的分片。


让我们回顾一下可以计算分片键的一些方法:

基于范围的分片键
分片键可以基于一个范围,例如,用户名 AF 的用户可以被赋予分片键 :

  1. 用户名以字母 GZ 开头的用户可以被赋予分片键
  2. 基于范围的分片键也是称为基于散列的分片键。

本质上,我们使用数据值来计算一个新键,然后用它来识别分片键。

基于目录的分片
我们还可以创建一个查找表(键值),我们可以在其中执行数据查找以检索分片键值。例如,我们可以拆分用户数据,将所有 IsLocked 为 True 的用户移动到分片 A,将所有 IsLocked 设置为 False 的用户部署到分片 B。


最后,我想回顾一下将数据划分为碎片的过程

我们可以将一个表拆分成多个表,称为分区:

水平分区
如果我们将表拆分为多个表,其中每个表都具有与原始表相同的架构。随后,我们可以将不同的行移动到每个表中。这称为水平分区。
例如,我们可以将 ID < 4 的所有用户移动到表 1 中,而所有其他用户都可以移动到表 2 中。
需要注意的关键是表 1 和表 2 应该具有相同的架构,如下所示:




垂直分区
如果我们将一个表拆分为多个表,其中所有列的并集创建原始表,那么它被称为垂直分区。
例如,让我们考虑 99% 的请求是关于检索用户的姓名和重要性列。
我们可以通过创建两个表并将数据跨两个表移动来垂直拆分用户表,如下所示:




因此,有多种方法可以对数据进行分区和计算分片键,这完全取决于应用程序的要求。

3. 数据库分片的好处和挑战
让我们回顾一下数据库分片的好处和挑战:

分片的好处
我们可以使用数据库分片来获得以下好处:

缩放
该概念围绕跨多个数据库服务器托管数据库以分散负载。随着流量的增长,这有助于在多个服务器之间移动请求。因此,可以在不引入任何应用程序停机的情况下添加新的数据库服务器。

性能提升
我们还可以通过添加 CPU/RAM 来垂直扩展每个数据库服务器。Sharding 允许我们将流量转移到多台服务器,而不是依赖一台服务器,这可以在我们遇到大量流量时防止网络瓶颈。我们可以根据具体的数据需求,对每台服务器分别进行升级。
我们可以以优化数据搜索的方式拆分数据。
例如,假设我们构建了一个用户管理应用程序,我们的应用程序数据库存储了数万亿条用户记录。此外,让我们考虑一下我们的应用程序每分钟收到一百万个请求,其中客户端应用程序始终按用户名查询用户信息。我们可以将用户表分片到两台服务器上。
我们可以平衡和转移流量,以便可以将特定用户名的用户请求转移到不同的数据库服务器。这可以减少响应时间,因为请求负载是平衡的,并且不同的服务器可以并行工作来为请求提供服务,因为查询必须扫描更少的行。

应用可用性
单体数据库的问题之一是,如果它宕机,它可能会使整个应用程序失败。通过分片,我们可以将数据库分布在多台机器上,并将数据复制到不同的分片上。这增加了至少有一个数据库可用于处理请求的机会。
这些要求在高可用性系统中至关重要。这是因为如果所有数据库部署在不同区域并且数据在多个服务器之间复制和共享,则所有数据库同时失败的可能性较低。


分片挑战
数据库分片带来了自身的挑战,例如:

基础设施复杂性管理
技术团队必须管理多个数据库服务器,并了解何时将流量路由到不同的数据库服务器。数据库需要维护、管理和复制,并且需要保持同步,这增加了额外的复杂性。诊断问题可能会变得更加困难。
此外,随着数据在多个数据库之间共享,构建数据报告变得更加困难。解决它的一种方法是构建跨不同服务器的多个数据库的报告数据仓库或视图。

费用
随着多个数据库和复杂的应用程序代码,管理和维护数据库的成本也增加了。


4.总结
本文概述了什么是数据库分片以及分片过程如何提高性能、缩短查询响应时间并使团队能够在不影响应用程序可用性的情况下扩展团队。
数据库分片是将大型数据库拆分为多个数据库并跨多台机器存储的过程。
当存储在数据库中的数据增长时,数据库分片是一种有用的数据库架构模式。金融科技、社交媒体、银行和支付应用程序严重依赖数据,并且会不断触发许多事件以在数据库中保存/检索数据。