了解数据库分片的入门知识

了解数据库分片的入门知识

创建一个网站是在互联网上建立你的存在的第一步。为了长期发展,你还必须确保你的网站能够扩展以适应增长。而第一步就是实施一个能与你一起扩展的数据库。否则,你有可能遇到查询性能缓慢和数据库中断的风险。

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

  1. 什么是数据库分片?
  2. 数据库分片的好处
  3. 分片的缺点
  4. 分片架构

什么是数据库分片?

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

分片的目的是完成一个无共享的架构,消除处理瓶颈和单点故障。

database-sharding-example

分片的一个例子 (图片来源:Analytics Vidhya)

你可以通过两种方式实现分片–横向和纵向。横向分片是根据行来划分表,而纵向分片是根据列来划分表。

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

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

垂直分片对那些查询返回单列的数据库来说是有效的。例如,如果客户数据库分别返回客户的姓名或电子邮件,你可以把姓名和电子邮件分成不同的群组。

数据库分片的优势

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

改进水平扩展

你可以垂直或水平地扩展你的数据库。垂直扩展是指在服务器上增加更多的中央处理单元(CPU)和随机存取内存(RAM),以提高性能。对于中小型数据库来说,垂直扩展是一个有用的解决方案。然而,随着你的数据增长,垂直扩展变得不可行了。你能添加到一台服务器上的能量是有限的。

横向扩展是更灵活的。它使你能够通过在系统中添加更多的服务器,根据需要扩展你的数据库。这些服务器中的每一个都为不同的数据库分片提供资源。这分配了工作负荷,提高了系统处理更多请求的能力。

更快的查询响应时间

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

在故障情况下增加可靠性

数据库中断有各种原因,包括意外的数据删除、连接错误和网络安全攻击。分片可以将故障的影响降到最低。由于每个分片是自主的,只有受影响的分片才会面临停机。例如,如果你有四个分片,其中一个出现故障,只有25%的操作会受到影响。

分片的弊端

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

请确保选择一种分片技术,允许在所有分片上平衡地分配数据。如果没有这种平衡,你就会有创造数据库热点的风险,当一个分片存储大部分数据而其他分片几乎保持空闲时,就会出现这种情况。这就减少了对单个分片的写入吞吐量。

为了解决这个问题,你可以将不平衡的分片进一步分区,但这个过程很有挑战性,而且在迁移数据时可能会使你的数据库瘫痪。

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

分片架构

你可以使用三种架构实现分片。

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

你选择的架构取决于你的使用情况。

基于密钥的分片

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

散列函数可以采取一个以上的分片密钥。正因为如此,基于密钥的分片适用于可能有共享密钥的数据记录。通过算法分配数据,可以最大限度地减少创建数据库热点的可能性,即一个分片包含的数据比另一个多。

然而,由于分布只依赖于散列函数,不可能在逻辑上将数据分组。因此,需要从多个分片中获取数据的数据库操作可能效率很低,因为它们需要从每个分片中读取数据。

基于范围的分片

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

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

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

基于范围的分片会导致数据库热点。考虑一个用户数据库,其中大多数用户的ID位于2,001和4,000之间。这个过程将它们分配到一个分片上,随着时间的推移,会产生不平衡的现象。因此,基于范围的分片对均匀分布的数据来说效果最好。

基于目录的分片

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

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

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

小结

数据库分片是一种扩展技术,它将表分割成更小的子集,并将其分配到不同的服务器上,称为分片。你可以通过各种方式实现分片,如基于密钥的分片、基于范围的分片和基于目录的分片。

虽然分片提高了数据库的可扩展性、可靠性和可用性,但它的实现非常复杂。此外,一旦你创建了一个分片,要把数据库恢复到未分片的状态并不容易。正因为如此,只有当你确定其他可扩展性选项不起作用时,才使用分片进行优化。

评论留言