掌桥专利:专业的专利平台
掌桥专利
首页

一种分布式KV的分区管理方法

文献发布时间:2024-04-18 20:02:40


一种分布式KV的分区管理方法

技术领域

本申请涉及计算机存储技术领域,更具体地,涉及一种分布式KV的分区管理方法。

背景技术

在大数据时代,数据的类型和格式越来越多样化,非结构化和半结构化数据的存储需求也随之增加,这些数据包括文本、图像、音频、视频等形式,不适合传统的关系型数据库的结构化存储方式,因此,应运而生一种分布式KV存储为这些数据提供了更好的支持,其可以根据数据的特点进行灵活存储和访问。

分布式KV存储具有灵活的数据模型、简单的访问接口和高可扩展性等优点,使其在NoSQL和New SQL产品中得到广泛应用,它可以根据数据的特点进行自由的Key值对存储,适应不同数据类型和结构的需求,同时,分布式KV存储可以通过水平扩展的方式来应对大规模数据的存储和处理需求;目前市场上存在多个分布式KV存储产品,如TiKV、Cassandra、Tendis等。这些产品都提供了可靠的分布式存储解决方案,可以满足大规模数据存储的需求,它们通过分区的方式对数据进行管理,采用不同的分区策略,如hash分区和range分区;其中Hash分区通过对Key进行哈希计算,将Key值对分散到不同的分区中,虽然有效避免了热点问题,但是,由于哈希计算的随机性,导致Key值对在全局上无序,不适合范围查询的场景,相比之下,Range分区将一段连续范围的Key划分到指定的分区,提高了范围查询的效率,但是,Range分区需要复杂的分区管理和分裂合并策略,容易形成热点并需要进行数据迁移或分裂操作。

总而言之,Hash分区在范围查询和数据局部性方面存在局限性,而Range分区则面临热点问题和分区管理的复杂性,这些因素可能导致某些类型的数据在分布式KV存储中无法得到良好的存储效果。

因此,如何完善分布式KV的分区管理方法是目前有待解决的技术问题。

发明内容

本发明提供一种分布式KV的分区管理方法,用以解决某些类型的数据在分布式KV存储中无法得到良好的存储效果的技术问题。

本发明提出了一种分布式KV的分区管理方法,包括:

步骤1,对所有的Key进行排序,以便后续的划分和映射操作;

步骤2,部署抽样方式或哨兵方式对Key进行标识和处理,为每个range分配一个唯一的range_id;

步骤3,使用hash映射算法将range_id映射到不同的分区进行存储;

步骤4,计算要查询的分区列表,并向相应的服务器发起查询。

优选的,所述range的key数量趋近于一次网络IO的通信数量。

优选的,所述步骤S2中的抽样方式包括:配置抽样间隔sample_step,对字符串按固定间隔抽样,通过ascii码转换为64位数字,相同前缀的key会换算为同一个range_id值,range_id的计算方式如下:

For(idx=0;idx

Charc=key[idx];

Range_id+=c-‘ ’;

}

实现了把一个固定小范围的键对应到同一个range_id,完成了范围的划分。

优选的,所述步骤S2中的哨兵方式包括:设置一个pivot和per_range,通过计算key与pivot的差值计算range_id,key和pivot都通过ascii码转换为uint64表示的数字,也就是抽样间隔为1。换算为数字之后的key,通过与pivot比较,使得相近的key落在同一个range_id,range_id计算方式如下:

For(idx=0;idx

Charc=key[idx];

Value+=c-‘ ’;

}

range_id=(value-pivot)/num_per_range;

实现了把一个固定小范围的键对应到同一个range_id,完成了范围的划分。

优选的,所述步骤S3中,根据范围的划分规则,计算出每个范围的range_id,使用并uint64来表示。

优选的,把所述uint64表示的range_id进行hash映射到partition_id,散列到不同分区,partition_id=hash(range_id)%partition_num。

优选的,选择固定的分区数量,使得range_id与partition_id的计算不受集群节点数量的影响。

优选的,存储引擎并更新partition_id与server_node之间的映射关系。

优选的,存储引擎为每个partition维护一个内部db实例,扩缩容过程中发生的分区迁移,以partition_id为单位执行整个逻辑db的搬迁。

优选的,在范围查询时根据start_key和end_key的range_id计算要查询的分区列表,并向相应的服务器发起查询,然后将返回的查询结果进行合并,以得到最终的查询结果。

通过应用以上技术方案,本申请的一种分布式KV的分区管理方法具有以下技术效果:

(1)设计了先range后hash的分区方案,提供与range分区无差别的范围查询能力。

(2)增加了range_id到partition_id的hash映射,使得分区管理变得简单,除特殊的扩缩容场景外,不再需要分区合并与分裂操作,节省了cpu和磁盘IO消耗。

(3)把一次范围查询的请求并发到有限的server节点,提升并发度的同时,不扩散请求广播范围,提高了范围查询的性能。

(4)设计支持两种不同的range划分方式——抽样和哨兵模式,为不同的数据类型提供更适配的支持,key规则有序的可使用哨兵模式,而相对离散的适合抽样模式。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明一种分布式KV的分区管理方法的流程示意图;

图2为本发明一种分布式KV的分区管理方法的key与分区和server节点的映射关系示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请实施例提供一种分布式KV的分区管理方法,本方案的技术思路是提出一个可兼顾range和hash分区优点的分区方案,分布式键值存储需要把数据和负载均衡划分到各个节点,也就是对数据进行分区,然后以分区为单位进行均衡,常用的分区方案为range分区和hash分区,Hash分区数据均衡,有效避免热点分区,且多分区并行访问效率高,分区管理也简单易行,一般固定分区数量,使用一致性hash算法实现,但是在范围查询的场景下,需要广播查询所有分区节点,带来大量的网络IO开销,因此hash分区一般不提供范围查询功能;Range分区全局排序后划分分区,对范围查询友好,范围查询操作只需查询固定的一个或多个分区,但是Range分区具有动态调整的需求,分区过大容易成为热点,就需要执行分裂操作,而分区过多的场景则需要执行合并,这也产生了按分区监控数据流量的需求,并且分区合并与分裂操作带来额外的写放大与cpu消耗,通过本实施例的技术方案将两者的益处相结合,并改善了其缺点,产生了一加一大于二的技术效果。

根据上述需求,参阅图1-2所示,本实施例提出一种本申请实施例提供一种分布式KV的分区管理方法,包括:

步骤1,对所有的Key进行排序,以便后续的划分和映射操作;

步骤2,部署抽样方式或哨兵方式对Key进行标识和处理,为每个range分配一个唯一的range_id;

步骤3,使用hash映射算法将range_id映射到不同的分区进行存储;

步骤4,计算要查询的分区列表,并向相应的服务器发起查询。

具体而言,在存储引擎中,key的排序方法通常是根据特定的规则或算法来确定的,不同的排序方法可能会在性能、排序结果的准确性和排序的复杂度上有所差异,因此,在设计存储引擎时,需要根据具体的业务需求选择合适的排序方法,包括但不限于字典序排序法、数值排序法、时间排序法、自定义排序法。

可以理解的是,这种范围划分和映射操作的技术效果是将键均匀地分布在不同的分区中,实现了数据的分布和负载均衡,通过范围划分和哈希映射,可以将查询操作在分布式环境中进行并行处理,提高查询的效率和吞吐量。此外,范围划分和映射操作还可以简化数据的管理和维护,使得数据的访问更加高效和可扩展。

在本申请的一些实施例中,range的key数量趋近于一次网络IO的通信数量。

可以理解的是,当范围的键数量趋近于一次网络IO通信的数量时,可以减少网络IO开销、提高查询效率、降低延迟,并且提高系统的吞吐量。这些技术效果可以改善分布式系统的性能和可扩展性。

在本申请的一些实施例中,步骤S2中的抽样方式包括:配置抽样间隔sample_step,对字符串按固定间隔抽样,通过ascii码转换为64位数字,相同前缀的key会换算为同一个range_id值,range_id的计算方式如下:

For(idx=0;idx

Charc=key[idx];

Range_id+=c-‘ ’;

}

实现了把一个固定小范围的键对应到同一个range_id,完成了范围的划分。

在本申请的一些实施例中,步骤S2中的哨兵方式包括:设置一个pivot和per_range,通过计算key与pivot的差值计算range_id,key和pivot都通过ascii码转换为uint64表示的数字,也就是抽样间隔为1。换算为数字之后的key,通过与pivot比较,使得相近的key落在同一个range_id,range_id计算方式如下:

For(idx=0;idx

Charc=key[idx];

Value+=c-‘ ’;

}

range_id=(value-pivot)/num_per_range;

实现了把一个固定小范围的键对应到同一个range_id,完成了范围的划分。

具体而言,可以使用抽样方式或哨兵方式对键进行标识和处理。抽样方式可以选择一部分键来代表整个键空间,而哨兵方式则是在键空间中选择一些特定的键作为哨兵点,无论是抽样方式还是哨兵方式,目的都是为每个范围(range)分配一个唯一的range_id(范围ID)。

在本申请的一些实施例中,步骤S3中,根据范围的划分规则,计算出每个范围的range_id,使用并uint64来表示。

可以理解的是,字符串类型的键会被自动划分到不同的范围(range)中。划分范围的目的是将键空间分割成多个连续的子范围。然后,根据范围的划分规则,计算出每个范围的range_id(范围ID)。这个range_id用于表示范围的唯一标识符,并且通常使用无符号64位整数(uint64)来表示。

在本申请的一些实施例中,把uint64表示的range_id进行hash映射到partition_id,散列到不同分区,partition_id=hash(range_id)%partition_num。

具体而言,使用hash(哈希映射算法)将range_id(范围ID)映射到特定的分区(partition),哈希映射算法使用range_id的哈希值,并通过取模运算(%)将哈希值映射到给定的分区数(partition_num)范围内。具体地,使用哈希函数对range_id进行哈希计算,然后取哈希值与分区数取模,得到的结果就是partition_id(分区ID)。这个partition_id就表示了该键应该被散列到的特定分区。

在本申请的一些实施例中,hash与集群的弹性扩缩容相同,选择固定的分区数量,使得range_id与partition_id的计算不受集群节点数量的影响。

具体而言,通过选择固定的分区数量,可以简化集群的弹性扩缩容操作,不管集群中的节点数量增加还是减少,分区数量保持不变,范围ID与分区ID的计算不会受到节点数量变动的影响,这样可以减少了在节点变动时需要重新计算范围与分区的复杂性,并且固定的分区数量允许在集群中添加或删除节点时保持范围与分区的映射关系不变,这样可以实现集群的弹性扩缩容,使得集群可以根据负载需求进行水平扩展或收缩,而无需重新计算范围与分区的映射关系,提高了集群的可扩展性和灵活性。

可以理解的是,选择固定的分区数量,并使范围ID与分区ID的计算不受集群节点数量的影响,可以简化集群的扩缩容操作,提高集群的可扩展性,实现均衡负载和数据分布,并简化系统配置和管理,这些技术效果有助于提高系统的稳定性、性能和可维护性。

在本申请的一些实施例中,存储引擎并更新partition_id与server_node之间的映射关系。

在本申请的一些实施例中,存储引擎为每个partition维护一个内部db实例,扩缩容过程中发生的分区迁移,以partition_id为单位执行整个逻辑db的搬迁。

具体而言,通过为每个分区维护一个内部数据库实例,可以实现平滑的扩缩容操作,当需要添加或删除分区时,存储引擎可以单独处理每个分区的迁移,而不会影响其他分区的正常运行,这样可以减少系统的停机时间和对整体系统的影响,提高系统的可用性和稳定性;通过分区迁移,可以实现均衡的负载分布,当进行扩容操作时,新的分区将被分配给新的节点,从而平衡负载并避免某些节点过载,而在缩容操作中,分区会被迁移到其他节点上,以确保负载均衡。这样可以提高系统的性能和吞吐量;在分区迁移过程中,存储引擎会确保数据的一致性和完整性,在进行分区迁移之前,存储引擎会将数据复制到目标节点上的新的分区,然后,在迁移完成后,存储引擎会验证数据的一致性,并确保所有的数据都已成功迁移,这样可以保证系统中的数据一致性和完整性;通过为每个分区维护一个内部数据库实例,并以分区ID为单位执行分区迁移,简化了系统的管理和维护,分区迁移可以在后台进行,不会对系统的正常运行造成影响。同时,在扩缩容操作中,存储引擎可以自动处理分区迁移,减少了手动操作和配置的需求,降低了管理和维护的复杂性。

可以理解的是,通过为每个分区维护一个内部数据库实例,并以分区ID为单位执行分区迁移,可以实现平滑的扩缩容操作,均衡的负载分布,保证数据的一致性和完整性,并简化系统的管理和维护。这些技术效果有助于提高系统的可用性、性能和可维护性。

在本申请的一些实施例中,在范围查询时根据start_key和end_key的range_id计算要查询的分区列表,并向相应的服务器发起查询,然后将返回的查询结果进行合并,以得到最终的查询结果。

具体而言,范围查询时根据起始键(start_key)和结束键(end_key)的范围ID(range_id)计算要查询的分区列表,并向相应的服务器发起查询,然后将返回的查询结果进行合并,以得到最终的查询结果;由于范围查询被分解为多个子查询,并同时在不同的分区上执行,可以实现并行查询,每个分区在相应的服务器上进行查询,从而加速查询速度,通过并行查询,可以充分利用分布式系统的资源,提高查询的效率和响应时间;此外,根据范围ID计算要查询的分区列表,可以实现均衡的负载分布,将查询请求分发到不同的分区和服务器上,避免某些节点或分区过载,这样可以提高系统的整体性能,并确保各个节点和分区的负载均衡;并且在每个分区上执行查询后,将返回的查询结果进行合并,可以得到最终的查询结果;并且,通过合并结果,可以避免将所有数据传输到一个节点上进行聚合,减少了网络传输和数据处理的开销,这样可以提高数据合并的效率,减少查询结果的生成时间;另外,通过根据范围ID计算分区列表,可以实现灵活的范围查询,根据查询需求,可以选择性地指定要查询的范围ID,从而只查询特定的分区,这样可以提高查询的精确性和灵活性,减少不必要的数据传输和处理

可以理解的是,通过根据范围ID计算要查询的分区列表,并进行并行查询和结果合并,可以加速查询速度,实现负载均衡,提高数据合并的效率,并实现灵活的范围查询。这些技术效果有助于提高系统的性能、可扩展性和查询灵活性。

以范围查询为例,说明一次返回查询的流程:

1.启动集群时,配置文件中指定range_id计算方式,配置num_per_range与pivot或sample_step,server节点计算pivot的uint64值。

2.管理节点根据节点数量把固定数量分区均衡到server节点,并生成分区路由同步给server。

3.客户端读写数据时,分别计算start_key与end_key所属range_id,查询partition_list,然后查询路由模块,获取要每个partition所属的server节点信息。

4.客户端向指定server节点发送读写请求,获取到所有server节点返回的结果后,合并返回给调用者。

综上,通过应用以上技术方案,本申请的一种分布式KV的分区管理方法具有以下技术效果:

(1)设计了先range后hash的分区方案,提供与range分区无差别的范围查询能力。

(2)增加了range_id到partition_id的hash映射,使得分区管理变得简单,除特殊的扩缩容场景外,不再需要分区合并与分裂操作,节省了cpu和磁盘IO消耗。

(3)把一次范围查询的请求并发到有限的server节点,提升并发度的同时,不扩散请求广播范围,提高了范围查询的性能。

(4)设计支持两种不同的range划分方式——抽样和哨兵模式,为不同的数据类型提供更适配的支持,key规则有序的可使用哨兵模式,而相对离散的适合抽样模式。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施场景的方法。

最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不驱使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

相关技术
  • 一种适用于高比例分布式光伏配电网的分区方法
  • 一种基于分布式数据库的分区权限管理方法
  • 一种分布式存储系统中分区管理方法、设备及系统
技术分类

06120116587370