暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

技术干货|浅谈MPP数据库之数据分片技术

原创 GBASE数据库 2023-12-27
797
随着信息化的发展,高效、安全地存储和管理海量数据的重要性日益凸显。为了解决单台服务器容量不足、性能瓶颈等问题,分布式数据库得以广泛应用。

分布式数据库是当前信息时代的重要数据存储和处理解决方案之一。它可以将数据分散存储在不同的服务器上,从而提高数据的读写性能和可扩展性。而分片则是分布式数据库中的一种关键技术。其负责将数据按照指定的规则分散在不同的节点上,从而实现数据的快速存储和查询。本文旨在介绍分布式数据库分片相关知识,解释分片的含义、作用、实现方式及优缺点等。

为什么要进行数据分片

一台服务器的硬件资源是有限的,能够处理的数据量也是有限的。随着数据量的增大,对硬件资源的需求会越来越多,此时就需要增加硬件资源来处理不断增加的数据。常见的增加硬件资源的方式通常有两种,一种是在一台服务器上增加CPU、内存、磁盘等资源,称为Scale up,也就是纵向扩展;另一种是增加服务器个数,称为Scale out,即横向扩展。


图片

纵向扩展的目的是通过增加服务器的存储计算资源来支撑更大的数据量。

横向扩展的目的是通过增加服务器数量,并将对存储和计算资源的需求分散到多台服务器上,从而减少每台服务器对资源的需求。

相对来说纵向扩展更容易触及服务器硬件资源的上限,因此横向扩展更加灵活,扩展性更强。

当采用横向扩展时,数据将会分散到不同的服务器上存储,也要在不同的服务器上进行计算。此时数据将按照一定的规则被切分成多份,每份作为一个分片放到不同的服务器上,从而实现减少每台服务器对存储资源的需求,这就是分片技术。

在选择分片规则的时候,还需要考虑尽量使切分后的数据在某些计算场景下能够独立进行计算,并能将每个分片的计算结果合并成最终的结果。这样既做到了数据分散存储,又能做到分散计算,从而减少每台服务器对计算资源的需求。否则,如果数据虽然已经按分片存储在不同的服务器,而计算时又必须放在一起才能计算的话,则依然是达不到横向扩展的目的。

如何将数据分片

数据分片有很多种方法,比较常见的如HASH分片,是将HASH值划分到不同的分片中。例如:某个HASH函数计算出的HASH值的取值范围为0-65535,如果将数据切分为128个分片,那么每个分片包括65536/128=512个HASH值。此时,使用该HASH函数对表中某列的数据进行计算得到HASH值,然后根据HASH值决定将数据放到哪个分片中,每个数据分片中数据的HASH值则是这512个值中的一个。

图片

HASH分片需要考虑的问题

  • 数据重分布:当分片规则发生变化时,就需要对数据进行重新分片,也是对数据进行重分布的过程。例如,当分片数量增加或者减少,则每个分片拥有的HASH值需要重新分配,此时就需要将不属于该分片的数据迁移到其它分片。在迁移动作完成之前,有些依赖于分片规则的计算暂时不能进行。而为了尽量少迁移数据,在HASH值重新分配的时候,应该尽量减少从一个分片迁移到其它分片的HASH值。

  • HASH列选择:一张表的数据需要选择按照某一列或某几列的HASH值进行切分,切分后通常不会再更换为使用其它方式切分,因为更换其它切分方式需要将数据进行重分布,成本较高。因此HASH列的选择变得非常重要。通常选择经常作为关联条件,分组列等列作为HASH列,来避免进行关联计算时需要对该表数据进行数据重分布。

  • 数据倾斜:当某列数据的分散度不够,大量数据具有相同的值,那么这些相同数据的HASH值也相同。如果使用该列数据进行HASH分片,这些相同值的数据就会全部分布到同一个数据分片内,导致该分片的数据量远远大于其它数据分片的数据量。如果不进行特殊的处理,则无论是在存储空间上还是计算时都会比其它分片占用更多的资源,导致存储和计算的倾斜。

  • 多列HASH:类似多列主键,一张表通过多个列的值才能更好的区分每条记录,并且在与其它表进行关联时常常使用多列等值条件。此时,可以使用多个列的值来计算HASH并决定数据所属的分片,可以避免使用单列的数据倾斜以及关联计算时需要的重分布。

  • 数据按HASH进行分片存储在不同服务器上之后,还需要考虑数据入库。由于数据需要根据其HASH值来决定存放到哪个分片,因此,数据在入库时需要先计算HASH值,然后再决定该数据存储到哪个分片,因此在数据入库时会增加一些处理成本。

分片的影响

由于每个分片的数据相当于按照其HASH值进行了分组,因此在进行等值关联、分组聚合时,可以充分利用该特点,每个分片的数据单独进行计算,减少了计算量。


  • 对等值过滤的影响:当表的过滤条件中包含HASH列的等值条件时,只需要使用条件中的常量值计算HASH并确定该值所在的数据分片,然后只在该数据分片上进行过滤来获取满足条件的值,避免了其它分片上的计算。


图片


  • 对关联的影响:当两表t1、t2进行等值关联时,如果关联列是两表的HASH列,由于HASH值相等的数据都在同一个分片上,因此,t1表和t2表可以分片和分片进行关联,并将结果汇总生成最终结果。此时,t1表的数据分片t1_n1与t2表的数据分片t2_n1进行关联计算即可。当分片足够多时,每个分片的数据量更少,分片与分片关联时的计算量也变小,能够更好的减少CPU工作量,从而提升性能。


图片


  • 对分组聚合的影响:当分组列中包含HASH列时,每个分片的数据可以单独进行分组计算并合并成最终结果,分组的计算量也相应减少。


如果数据没有进行分片,在进行上述计算时,有些算法也会先将数据进行HASH分组后再进行并行计算,因此数据分片存储也相当于预先将数据进行了分组从而节省了运行时计算。因此数据分片除了将存储计算资源分散外,也同时提升了计算性能(这也符合数据结构和算法关系的描述),而除了数据分片,通过改善数据存储方式来提升计算性能的方法还有很多,因此也有越来越多的数据库系统能够通过分析该系统上实际运行的业务情况,在存储层对数据进行整理和重组以改变数据存储结构来优化计算性能,其中包括分片,重分布,排序,增加统计信息等。


分区(partition)与分片(sharding)

分区也是将数据按规则分开进行存储,但分区的目的通常不是为了横向扩展,而是通过将数据按照某种规则进行分类存储,从而达到支撑某些计算的优化。常见的分区方式有HASH分区、RANGE分区、LIST分区等。表的数据按照某列进行分区后,在该列上的某些计算会得到大幅优化。例如采用RANGE分区后,对该表的查询,如果在该分区列上存在过滤条件的话,在计划优化阶段就可以对分区进行裁剪,使计算引擎在计算时直接省略掉该分区数据的读取和过滤,既减少了磁盘IO,也减少了CPU的计算。对于数据需要在内存中进行缓存的,还会节省内存占用或者减少缓存的换入换出。


图片


多分片技术

上文提到,分片不单单是为了数据分开存储以分散存储和计算资源,从而降低单台服务器对资源的需求,分片更能对计算进行性能优化。因此,就不一定设计为每台服务器只有一个数据分片。将数据按照合适的大小进行分片,并使单台服务器可以同时处理多个数据分片,在优化计算性能方面有更多好处。由于每个分片的数据可以单独处理,因此无论是多进程还是多线程并发处理不同分片时,都能避免数据访问的冲突,并且,由于每个分片数据量足够小,在分片能够单独处理时,能大幅减少每个分片的计算量。

在每个分片数据量不大的情况下,同一个计算节点支持多分片也可以使得节点的资源利用率更高。在一些情况下,单个分片可能的存储和计算需求并不是很大,因此将多个分片分配到同一个计算节点上就可以更好地利用节点的资源,提高性能。特别是在存储计算分离的场景,多分片更能用于负载均衡的调节。

数据分片大小并没有一个明确的标准,因为这取决于特定的应用场景和需求。有时候较小的数据分片可以优化数据过滤效果,减少计算,从而减少计算资源使用,并提高数据的处理速度。但是,太小的数据分片会增加数据管理开销,需要更多的元数据存储,在过滤效果不佳的场景,读写数据时会增加更多的磁盘IO。因此,在实施数据分片时要考虑到实际场景,精细地权衡不同的因素来确定最佳的数据分片大小。

写到最后

数据分片是分布式数据库中非常重要的技术,也是提高系统性能和可扩展性的关键技术之一。不同的应用场景需要选择不同的分片方案,才能达到最佳的分片效果。在分片方案中,既需要考虑数据分片的规则、分片个数、分片的大小,还需要考虑分片内数据的组织方式、分片内数据的元数据内容,在满足数据分散存储的基础上,尽可能的为提升系统计算性能做好准备。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论