使用分布式数据库,还需要考虑做分库分表吗?

随着数据存储需求的不断增加,分布式数据库成为了处理大规模数据的一种重要方式。分布式数据库可以将数据分散到多个计算节点上,并利用分布式计算的能力来提高数据处理的效率和可用性。然而,在使用分布式数据库的过程中,是否需要进行分库分表呢?

分库分表是指将数据库中的数据按照一定规则划分到多个数据库或表中,以减轻单个数据库或表的负担,提高数据查询和更新的效率。在单机数据库中,分库分表是一种常见的优化方式,可以解决单机数据库在数据规模增大时所面临的性能瓶颈问题。但是,在分布式数据库中,是否需要进行分库分表就需要根据具体情况进行判断了。

分布式数据库大多采用的是分片架构(sharding),即将数据按照一定规则分片存储到多个计算节点上,那么分库分表的工作已经在架构中完成了,不需要再进行额外的分库分表操作。

对于分布式数据库,sharding的分区机制就可以满足大多数场景的需求,不一定非要再进行分库分表。分布式数据库中的sharding功能,本质上就是通过把数据集合分区到多个节点上,实现数据和请求的均衡,从而解决单机的存储和计算能力瓶颈。

相比额外引入分库分表中间件,直接利用分布式数据库自身的sharding分区可以带来以下优势:

  1. 避免了额外的分表中间件层,系统架构更简单

  2. 数据分区自动平衡,避免手动调节分库分表

  3. 查询直接路由到指定分区,避免跨库跨表join

  4. 数据持久化和备份由分布式数据库统一管理

  5. 支持弹性扩容节点,自动重新平衡分区

以OceanBase数据库为例,OceanBase 数据库采用 Shared-Nothing 架构,各个节点之间完全对等,每个节点都有自己的 SQL 引擎、存储引擎、事务引擎,运行在普通 PC 服务器组成的集群之上,具备高可扩展性、高可用性、高性能、低成本、与主流数据库高兼容等核心特性。

OceanBase 数据库的一个集群由若干个节点组成。这些节点分属于若干个可用区(Zone),每个节点属于一个可用区。可用区是一个逻辑概念,表示集群内具有相似硬件可用性的一组节点,它在不同的部署模式下代表不同的含义。例如,当整个集群部署在同一个数据中心(IDC)内的时候,一个可用区的节点可以属于同一个机架,同一个交换机等。当集群分布在多个数据中心的时候,每个可用区可以对应于一个数据中心。每个可用区具有 IDC 和地域(Region)两个属性,描述该可用区所在的 IDC 及 IDC 所属的地域。一般地,地域指 IDC 所在的城市。可用区的 IDC 和 Region 属性需要反映部署时候的实际情况,以便集群内的自动容灾处理和优化策略能更好地工作。根据业务对数据库系统不同的高可用性需求,OceanBase 集群提供了多种部署模式,参见 高可用架构概述。

在 OceanBase 数据库中,一个表的数据可以按照某种划分规则水平拆分为多个分片,每个分片叫做一个表分区,简称分区(Partition)。某行数据属于且只属于一个分区。分区的规则由用户在建表的时候指定,包括hash、range、list等类型的分区,还支持二级分区。例如,交易库中的订单表,可以先按照用户 ID 划分为若干一级分区,再按照月份把每个一级分区划分为若干二级分区。对于二级分区表,第二级的每个子分区是一个物理分区,而第一级分区只是逻辑概念。一个表的若干个分区可以分布在一个可用区内的多个节点上。每个物理分区有一个用于存储数据的存储层对象,叫做 Tablet ,用于存储有序的数据记录。

OceanBase 数据库可以把普通的表的数据按照一定的规则划分到不同的区块内,同一区块的数据物理上存储在一起。这种划分区块的表叫做分区表,其中的每一个区块称作分区。OceanBase 数据库的 MySQL 模式中,单个表最多支持创建的分区个数为 8192 个。

如下图所示,一张表被划分成了 5 个分区,分布在 2 台机器上:

使用分布式数据库,还需要考虑做分库分表吗?_第1张图片

分布式数据库是可以通过分区(Partition)代替大部分分库分表的场景的,两者目的都是为了解决单机数据库处理能力的存储和计算瓶颈。分区主要目的是:

  1. 分散数据库requests,缓解单机IO压力,提高吞吐。

  2. 分片存储数据,解决单机容量限制,实现横向扩展。

  3. 通过Hash或Range方式将数据均匀分配到不同节点,避免热点。

  4. 可方便地添加节点,实现存储和计算的弹性伸缩。

  5. 当节点故障时,通过重分片使得数据自动恢复。

  6. 可根据节点配置差异,存储计算能力 heterogeneous。

所以,分区是实现数据库扩展性的核心手段。分布式数据库本身也是通过分区来实现分布存储和计算的。 

你可能感兴趣的:(分布式,数据库,架构)