• 带你一起理解什么是数据库分片?


    如果你想将你的关系数据库变得可扩展和高可用,你应该记住哪些权衡点呢?

    • 数据库分片是将数据划分为分区的过程,然后可以存储在多个数据库实例中。
    • 它使用一些键来对数据进行分区。此键是要存储的数据的属性。

    假设数据库中有 1000 个用户,而您有 5 个数据库服务器。您希望对用户 ID 上的数据进行分片。因此,您可以通过以下方式对数据进行分区

    • 用户 ID 000–199 ->数据库 1。
    • 用户 ID 200–399 -> 数据库 2。
    • 用户 ID 400–599 -> 数据库 3.
    • 用户 ID 600–799 -> 数据库 4.
    • 用户 ID 800–999 -> 数据库 5.

    现在,如果用户 ID 546 想要执行读/写操作,他将仅连接到数据库实例 3。由于只有 200 个用户 ID,查询处理速度很快。

    注意:这是基于范围的分片的示例。

    分片架构的类型

    基于范围的分片

    • 在此方法中,我们根据键的范围对数据进行分区。
    • 它非常容易实现
    • 数据可能不会均匀分布在分片之间。
    • 在下面的示例中,有 5 个元组和 3 个分片。

     

    基于键的分片/基于哈希的分片

    • 在此方法中,我们生成键的哈希值(此处键是数据的属性之一)。此哈希值确定我们将用于存储数据的分片。
    • 使用简单哈希函数分发数据可能会导致分布偏斜。为了克服这个问题,我们可以使用一致哈希。
    • 在下面的示例中,有 6 个元组和 3 个分片。我们使用了一个简单的哈希函数h(x) = x%3

     

    基于目录的分片

    • 在这种方法中,我们创建一个查找表,该查找表使用共享键来检查哪个分片保存哪些数据。查找将每个键映射到分片。
    • 它比基于范围和键的分片更灵活。
    • 查找表会变成单点故障。

     

    水平分区和分片的区别

    • 在水平分区中,我们将表拆分为同一数据库实例中的多个表,而在分片中,我们将表拆分为跨多个数据库实例的多个表。
    • 在水平分区中,我们使用相同的数据库实例,因此分区表的名称必须不同。在分片中,由于表存储在不同的数据库实例中,因此表名可以相同。

    分片的优势

    • 高可用性 即使一个分片崩溃,其他分片仍在运行,仍然可以处理查询。因此,数据库作为一个整体保持部分功能。
    • 提供安全性 用户只能访问某些分片。因此,您可以在不同的分片上实现不同的访问控制机制。
    • 更快的查询处理 由于每个服务器中的数据集大小都很小,因此索引的大小也很小。这样可以加快查询处理速度。
    • 提高读取和写入吞吐量 只要在一个分片上完成操作,读取和写入容量都会增加。
    • 高可扩展性 对数据进行分区并将它们存储在不同的分片中,在数据和内存方面提供了可扩展性(因为它将负载分散到多台机器上 每个分片中的内存使用量较少,并且网络带宽不会饱和)

    分片的缺点

    • 复杂性 服务器必须知道如何将查询路由到适当的分片。如果我们添加用于在服务器中查找分片的代码,则会使服务器更加复杂。
    • 事务和回滚 您无法处理对不同分片中存在的两个不同表的查询。因此,跨分片的交易是不可能的。因此,回滚也是不可能的。
    • 如果我们想连接来自两个不同分片的两个表,那么查询需要转到两个不同的分片,提取数据并通过网络连接数据。这是一项非常昂贵的操作。
    • 基础设施成本 分片需要通过单个数据库服务器获得更多的计算机和计算能力。如果没有适当的优化,那么成本的增加可能会很大。

    分层分片

    增加/减少分片的数量是非常困难的。因此,您只能拥有固定数量的分片。

    由于分片的数量是固定的,因此其中一个分片可能会变得太大。为了解决这个问题,我们可以对大分片进行分片。每个分片都有一个管理器,用于将请求映射到正确的迷你分片。它被称为分层分片。

    在下面的示例中,在第一级,我们有 3 个分片,我们使用基于目录的分片。我们再次对分片 0 进行分区并使用基于键的分片。

     

    实现高可用性的主从架构

    如果我们想在数据库实例下线的情况下从分片查询数据,我们可以使用主从架构。

    在主从架构中,有多个从站正在复制主站。每当有书面请求时,它总是在主服务器上,每当有读请求时,它就会均匀地分布在从站上。如果主站发生故障,从站从站会在他们中间选择一个主站。

  • 相关阅读:
    【毕设选题】opencv 图像识别 指纹识别 - python
    学习-Java输入输出之InputStream类之字节数据输入处理
    19-渐变
    Redis哨兵模式(Docker)
    网络文件共享服务介绍
    前端缓存机制——强缓存、弱缓存、启发式缓存
    deforum + kandinsky = 视频工作流
    使用 XML 配置定义和管理 Spring Bean
    Kubernetes网络组件介绍
    最新基于机器学习模型单图换脸离线版软件包及使用方法,本地离线版本模型一键运行(免费下载)
  • 原文地址:https://blog.csdn.net/m0_74931226/article/details/127841450