如果你想将你的关系数据库变得可扩展和高可用,你应该记住哪些权衡点呢?
- 数据库分片是将数据划分为分区的过程,然后可以存储在多个数据库实例中。
- 它使用一些键来对数据进行分区。此键是要存储的数据的属性。
假设数据库中有 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 进行分区并使用基于键的分片。
实现高可用性的主从架构
如果我们想在数据库实例下线的情况下从分片查询数据,我们可以使用主从架构。
在主从架构中,有多个从站正在复制主站。每当有书面请求时,它总是在主服务器上,每当有读请求时,它就会均匀地分布在从站上。如果主站发生故障,从站从站会在他们中间选择一个主站。