随着信息化的发展,数据量飞速增长,如何高效、安全地存储和管理这些数据成为必须要考虑问题。为了解决单台服务器容量不足、性能瓶颈等问题,分布式数据库得以广泛应用。
分布式数据库是当前信息时代的重要数据存储和处理解决方案之一。它可以将数据分散存储在不同的服务器上,从而提高数据的读写性能和可扩展性。而分片则是分布式数据库中的一种关键技术。其负责将数据按照指定的规则分散在不同的节点上,从而实现数据的存储和查询,本文旨在介绍GBase 8a MPP Cluster分片相关知识,解释分片的含义、作用等。
为什么要进行数据分片
一台服务器的硬件资源是有限的,能够处理的数据也是有限的,随着数据量的增大,对硬件资源的需求会越来越多,此时就需要增加硬件资源来处理不断增加的数据。常见的增加硬件资源的方式通常有两种,一种是在一台服务器上增加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列的等值条件时,只需要使用条件中的常量值计算HASH并确定该值所在的数据分片,然后只在该数据分片上进行过滤来获取满足条件的值,避免了其它分片上的计算。
对关联的影响 当两表t1,t2进行等值关联时,如果关联列是两表的HASH列,那么由于HASH值相等的数据都在同一个分片上,因此,t1表和t2表可以分片和分片进行关联,并将结果汇总生成最终结果,此时,t1表的数据分片t1_n1与t2表的数据分片t2_n1进行关联计算即可,当分片足够多时,每个分片的数据量更少,分片与分片关联时的计算量也变小,能够更好的减少CPU工作量,从而提升性能。 对分组聚合的影响 当分组列中包含HASH列时,每个分片的数据可以单独进行分组计算并合并成最终结果,分组的计算量也相应减少。 分区(Partition)与分片(Sharding) 多分片技术 上文提到,分片不单单是为了数据分开存储以分散存储和计算资源,从而降低单台服务器对资源的需求,分片更能对计算进行性能优化,因此,就不一定设计为每台服务器只有一个数据分片,将数据按照合适的大小进行分片后,并使单台服务器可以同时处理多个数据分片,在优化计算性能方面有更多好处。由于每个分片的数据可以单独处理,因此无论是多进程还是多线程并发处理不同分片时,都能避免数据访问的冲突,并且,由于每个分片数据量足够小,在分片能够单独处理时,能大幅减少每个分片的计算量。 写到最后






