分区原理

在 SequoiaDB 巨杉数据库中,通过将集合数据拆分成若干小的数据集进行管理,从而达到并行计算和减小数据访问量的目的。根据管理方式的不同,可以分为以下两种分区类型:

  • 数据库分区:用于描述数据在集合与复制组之间的关系
  • 表分区:用于描述数据在集合与集合之间的关系

数据库分区

在 SequoiaDB 集群环境中,可以通过将一个集合中的数据划分成若干不相交的子集,再将这些子集切分到复制组中,以达到并行计算的目的。这种数据切分的方法称为数据库分区(又称为水平分区),而这些不相交的子集称为分区。

数据库分区示意图

  • 分区内的所有数据记录都是完整的记录
  • 一个分区只能存在于集群中的某一个复制组中,但一个复制组却可以承载多个分区
  • 通过切分操作可以将分区从一个复制组移动到另一个复制组中
  • 当同时访问多个分区的数据时,可以同时在分区所在的不同复制组中进行并行计算,从而提高处理速度和性能

表分区

在 SequoiaDB 集群环境中,可以通过将一个集合中的数据划分成若干不相交的子集,再将这些子集映射到另外的集合上,这种数据切分的方法称为表分区(又称为垂直分区)。这些不相交的子集称为分区,被数据划分的集合称为主集合,分区映射的集合称为子集合。

表分区示意图

  • 分区内的所有数据记录都是完整的记录
  • 一个分区只能映射到一个子集合中
  • 通过集合挂载操作可以将分区从一个子集合中映射到另外一个子集合中
  • 当需要访问某个特定范围内的记录时,只会访问所属分区的子集合,避免访问所有分区数据从而减少数据访问量

分区方式

分区方式是指将集合中的数据划分为不同分区的算法。分区方式包括范围分区(Range)和散列分区(Hash)。

范围分区方式

范围分区方式是指根据集合数据的取值范围,对集合中的数据进行切分的分区方式。

范围分区方式示意图

通过范围分区方式,可以直观地了解到集合数据的分区情况。如上图所示,在[201801,201901)之间的数据落在分区1中,在[201901,202001)之间的数据落在分区2中。

范围分区方式较为典型的场景是访问一定范围内数据的场景。例如,当访问某一时间段的记录时,数据库只会访问对应时间段的分区数据,而不会访问其他时间段的分区数据,使系统访问的数据量极大减少,提高系统性能。

散列分区方式

散列分区方式是指先对集合数据做一次散列运算,再按照散列运算结果的 hash 值对数据进行切分的分区方式。

散列分区方式示意图

在字段取值相对离散的情况下(如集合中的唯一键),通过散列分区方式,每个 hash 值对应的数据量基本相同。而在范围分区方式中,相同范围内的数据量不一定是相同的。

散列分区方式较为典型的场景是访问集合中所有数据的场景。例如,当遍历集合数据时,数据库就会访问所有分区的数据,可以发挥所有分区上各个节点的并行计算的能力。因为每个分区中的数据量基本相同,所以分区所在节点的 I/O 负载情况基本相同,不容易出现数据热点问题。

分区键

在不同的分区方式中,作为数据划分依据的字段称为分区键。在范围分区方式中,分区键是用于划分数据范围的字段;在散列分区中,分区键是用于计算 hash 值的字段。每个分区键可以包含一个或多个字段。

分区类型与分区方式的关系

不同的分区类型可以选择使用不同的分区方式去划分数据。数据库分区既可以使用范围分区方式,也可以使用散列分区方式;表分区只能使用范围分区方式。

回到顶部