首页 / 专利库 / 专利权 / 发明 / 存储系统中的节点扩容方法和存储系统

存储系统中的节点扩容方法和存储系统

阅读:290发布:2021-04-11

专利汇可以提供存储系统中的节点扩容方法和存储系统专利检索,专利查询,专利分析的服务。并且一种存储系统中的 节点 扩容方法和存储系统。该存储系统包括第一节点,第一节点配置数据分区组和元数据分区组,所述数据分区组包含多个数据分区,所述元数据分区组包括多个元数据分区,所述数据分区组对应的数据的元数据是所述元数据分区组对应的元数据的子集。当第二节点加入所述存储系统时,所述第一节点将所述元数据分区组分裂成至少两个子元数据分区组,将所述至少两个子元数据分区组中的第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点。可以降低存储节点间的带宽开销。,下面是存储系统中的节点扩容方法和存储系统专利的具体信息内容。

1.一种存储系统中的节点扩容方法,其特征在于,所述存储系统包括第一节点;
配置所述第一节点的数据分区组和元数据分区组,所述数据分区组包含多个数据分区,所述元数据分区组包括多个元数据分区,所述数据分区组对应的数据的元数据是所述元数据分区组对应的元数据的子集;
当第二节点加入所述存储系统时,将所述元数据分区组分裂成至少两个子元数据分区组;
将所述至少两个子元数据分区组中的第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点。
2.根据权1所述的方法,其特征在于,将所述元数据分区组分裂成至少两个子元数据分区组之前,还包括:
获取扩容后元数据分区组布局和扩容前元数据分区组布局,其中,
所述扩容后元数据分区组布局包括:在所述第二节点加入所述存储系统之后,所述存储系统中每个节点配置的所述子元数据分区组的数量,以及,在所述第二节点加入所述存储系统之后,所述子元数据分区组包含的元数据分区的数量,
所述扩容前元数据分区组布局包括:在所述第二节点加入所述存储系统之前,所述第一节点配置的所述元数据分区组的数量,以及,在所述第二节点加入所述存储系统之前,所述元数据分区组包含的元数据分区的数量;
所述将所述元数据分区组分裂成至少两个子元数据分区组包括:
根据所述扩容后元数据分区组布局和所述扩容前元数据分区组布局,对所述元数据分区组进行分裂,分裂后的子元数据分区组的数量是至少两个。
3.根据权1或权2所述的方法,其特征在于,在所述将所述第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点之后还包括:
将所述数据分区组分裂成至少两个子数据分区组,所述子数据分区组对应的数据的元数据是所述至少两个子元数据分区组中任意一个子元数据分区组对应的元数据的子集。
4.根据权1-3任一所述的方法,其特征在于,还包括:
当所述第二节点加入所述存储系统后,保持所述数据分区组对应的数据继续存储在所述第一节点中。
5.根据权1所述的方法,其特征在于,所述数据分区组对应的数据的元数据是所述至少两个子元数据分区组中任意一个子元数据分区组对应的元数据的子集。
6.一种节点扩容装置,其特征在于,所述装置位于存储系统中,包括:
配置模,用于配置所述存储系统中的第一节点的数据分区组和元数据分区组,所述数据分区组包含多个数据分区,所述元数据分区组包括多个元数据分区,所述数据分区组对应的数据的元数据是所述元数据分区组对应的元数据的子集;
分裂模块,用于当第二节点加入所述存储系统时,将所述元数据分区组分裂成至少两个子元数据分区组;
迁移模块,用于将所述至少两个子元数据分区组中的第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点。
7.根据权6所述的装置,其特征在于,还包括获取模块,
所述获取模块,用于获取扩容后元数据分区组布局和扩容前元数据分区组布局,所述扩容后元数据分区组布局包括:在所述第二节点加入所述存储系统之后,所述存储系统中每个节点配置的所述子元数据分区组的数量,以及,在所述第二节点加入所述存储系统之后,所述子元数据分区组包含的元数据分区的数量,所述扩容前元数据分区组布局包括:在所述第二节点加入所述存储系统之前,所述第一节点配置的所述元数据分区组的数量,以及,在所述第二节点加入所述存储系统之前,所述元数据分区组包含的元数据分区的数量;
所述分裂模块具体用于根据所述扩容后元数据分区组布局和所述扩容前元数据分区组布局,对所述元数据分区组进行分裂,分裂后的子元数据分区组的数量是至少两个。
8.根据权6或权7所述的装置,其特征在于,所述分裂模块还用于在所述将所述第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点之后,将所述数据分区组分裂成至少两个子数据分区组,所述子数据分区组对应的数据的元数据是所述至少两个子元数据分区组中任意一个子元数据分区组对应的元数据的子集。
9.根据权6-8任一所述的装置,其特征在于,所述配置模块还用于当所述第二节点加入所述存储系统后,保持所述数据分区组对应的数据继续存储在所述第一节点中。
10.一种存储节点,其特征在于,所述存储节点位于存储系统中,所述存储节点包括处理器和存储器,所述存储器中存储有程序,所述处理器运行所述程序以执行权1-权4任一所述的方法。
11.一种存储系统,其特征在于,包括第一节点和第三节点;
所述第一节点,用于配置所述第一节点的数据分区组,所述数据分区组包含多个数据分区;
所述第三节点,用于配置所述第三节点的元数据分区组,所述元数据分区组包含多个元数据分区;
所述配置后的数据分区组对应的数据的元数据是所述配置后的元数据分区组对应的元数据的子集;
当第二节点加入所述存储系统时,所述第三节点还用于将所述元数据分区组分裂成至少两个子元数据分区组;以及将所述至少两个子元数据分区组中的第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点。
12.根据权11所述的存储系统,其特征在于,
所述第三节点还用于获取扩容后元数据分区组布局和扩容前元数据分区组布局,所述扩容后元数据分区组布局包括:在所述第二节点加入所述存储系统之后,所述存储系统中每个节点配置的所述子元数据分区组的数量,以及,在所述第二节点加入所述存储系统之后,所述子元数据分区组包含的元数据分区的数量,所述扩容前元数据分区组布局包括:在所述第二节点加入所述存储系统之前,所述第三节点配置的所述元数据分区组的数量,以及,在所述第二节点加入所述存储系统之前,所述元数据分区组包含的元数据分区的数量;
当所述第二节点加入所述存储系统时,所述第三节点具体用于根据所述扩容后元数据分区组布局和所述扩容前元数据分区组布局,对所述元数据分区组进行分裂,分裂后的子元数据分区组的数量是至少两个。
13.根据权11或权12所述的存储系统,其特征在于,
所述第三节点还用于在所述将所述第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点之后,将所述数据分区组分裂成至少两个子数据分区组,所述子数据分区组对应的数据的元数据是所述至少两个子元数据分区组中任意一个子元数据分区组对应的元数据的子集。
14.根据权11-13任一所述的存储系统,其特征在于,
当所述第二节点加入所述存储系统后,所述第一节点还用于保持所述数据分区组对应的数据继续存储在所述第一节点中。
15.根据权11所述的存储系统,其特征在于,所述数据分区组对应的数据的元数据是所述至少两个子元数据分区组中任意一个子元数据分区组对应的元数据的子集。

说明书全文

存储系统中的节点扩容方法和存储系统

技术领域

[0001] 本申请涉及存储领域,并且更具体地,涉及一种存储系统中的节点扩容方法和存储系统。

背景技术

[0002] 分布式存储系统场景下,当存储系统的空闲空间不足时需要进行扩容。当新节点加入存储系统,原来的节点会迁移一部分分区及其分区对应的数据至新节点中。数据在存储节点之间迁移必定会消耗带宽。发明内容
[0003] 本申请提供了一种存储系统中的节点扩容方法以及存储系统,可以节省存储节点间的带宽。
[0004] 第一方面,提供了一种存储系统中的节点扩容方法。所述存储系统包括一个或多个第一节点。对于每个第一节点来说,既存储了数据也存储了该数据的元数据。按照该方法,第一节点配置该节点的数据分区组和元数据分区组,所述数据分区组包含多个数据分区,所述元数据分区组包括多个元数据分区,所述数据分区组对应的数据的元数据是所述元数据分区组对应的元数据的子集。子集的含义是,数据分区组所包含的数据分区的数量小于元数据分区组所包含的元数据分区的数量,并且所述元数据分区组所包含的一部分元数据分区对应的元数据是用于描述所述数据分区组对应的数据,而另一部分元数据分区对应的元数据是用于描述其他数据分区组对应的数据的。当第二节点加入所述存储系统时,所述第一节点将所述元数据分区组分裂成至少两个子元数据分区组,将所述至少两个子元数据分区组中的第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点。
[0005] 按照第一方面提供的方法,当第二节点加入时,将第一节点分裂后的子元数据分区组及其对应的元数据迁移至所述第二节点,由于元数据的数据量大大少于数据的数据量,相对于现有技术中将数据迁移至第二节点来说,节省了节点间的带宽。
[0006] 另外,由于对第一节点的数据分区组和元数据分区组进行了配置,使得配置后的所述数据分区组对应的数据的元数据是所述元数据分区组对应的元数据的子集,那么即使在扩容后元数据分区组被分裂成至少两个子元数据分区组,也仍然能在一定程度上保证数据分区组对应的数据的元数据是任意一个子元数据分区组对应的元数据的子集,将其中一个子元数据分区组及其对应的元数据迁移至第二节点之后,所述数据分区组对应的数据仍然是由同一个节点中存储的元数据来描述的,避免了在对数据进行修改,特别是执行垃圾回收时在不同的节点上修改元数据。
[0007] 结合第一方面的第一种实现,在第二种实现中,所述第一节点获取扩容后元数据分区组布局和扩容前元数据分区组布局,所述扩容后元数据分区组布局包括所述第二节点加入所述存储系统后所述存储系统中每个节点配置的所述子元数据分区组的数量,以及所述子元数据分区组包含的元数据分区的数量,所述扩容前元数据分区组布局包括所述第二节点加入所述存储系统之前所述第一节点配置的所述元数据分区组的数量,以及所述元数据分区组包含的元数据分区的数量。所述第一节点根据所述扩容后元数据分区组布局和所述扩容前元数据分区组布局,将所述元数据分区组分裂成至少两个子元数据分区组。
[0008] 结合第一方面的以上任意一种实现,在第三种实现中,在迁移之后,所述第一节点将所述数据分区组分裂成至少两个子数据分区组,所述子数据分区组对应的数据的元数据是所述子元数据分区组对应的元数据的子集。将数据分区组分裂成更小粒度的子数据分区组,是为了下一次扩容做准备,使得子数据分区组对应的数据的元数据始终是所述子元数据分区组对应的元数据的子集。
[0009] 结合第一方面的以上任意一种实现,在第四种实现中,当所述第二节点加入所述存储系统时,所述第一节点保持所述数据分区组及其所述数据分区组对应的数据继续存储在所述第一节点中。由于只迁移元数据不迁移数据,而元数据的数据量通常远小于数据的数据量因此节点之间的带宽被节省了。
[0010] 结合第一方面的第一种实现,在第五种实现中,更加明确了所述数据分区组对应的数据的元数据是所述至少两个子元数据分区组中任意一个子元数据分区组对应的元数据的子集。从而保证所述数据分区组对应的数据仍然是由同一个节点中存储的元数据来描述的,避免了在对数据进行修改,特别是执行垃圾回收时在不同的节点上修改元数据。
[0011] 第二方面,提供了一种节点扩容装置用于实施第一方面及其任意一种实现提供的方法。
[0012] 第三方面,提供了一种存储节点用于实施第一方面及其任意一种实现提供的方法。
[0013] 第四方面,提供了一种节点扩容方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令用于执行第一方面及其任意一种实现所描述的方法。
[0014] 第五方面,提供了一种存储系统,所述存储系统至少包括第一节点和第三节点。并且,在所述存储系统中,数据和描述该数据的元数据分别存储在不同的节点中,例如数据存储在所述第一节点中,所述数据的元数据存储在所述第二节点中。第一节点,用于配置数据分区组,所述数据分区组对应所述数据,第三节点用于配置元数据分区组,所述配置后的数据分区组对应的数据的元数据是所述配置后的元数据分区组对应的元数据的子集。当第二节点加入所述存储系统时,所述第三节点将所述元数据分区组分裂成至少两个子元数据分区组,将所述至少两个子元数据分区组中的第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点。
[0015] 在第五方面提供的存储系统中,虽然数据和所述数据的元数据存储在不同节点中,但由于对其数据分区组和元数据分区组进行了与第一方面相同的配置,在迁移以后仍然能满足任意一个数据分区组对应的数据的元数据均存储在一个节点中,不需要到两个节点去获取或修改元数据。
[0016] 第六方面,提供了一种节点扩容方法,应用于所述第五方面提供的存储系统中,由所述存储系统中的第一节点执行第五方面所提供的功能。
[0017] 第七方面,提供了一种节点扩容装置,位于第五方面提供的存储系统中,用于执行第五方面所提供的功能。
[0018] 第八方面,提供了一种存储系统中的节点扩容方法。所述存储系统包括一个或多个第一节点。对于每个第一节点来说,既存储了数据也存储了该数据的元数据。并且所述第一节点包括至少两个元数据分区组和至少两个数据分区组,每个元数据分区组对应的元数据分别用于描述其中一个数据分区组对应的数据。所述第一节点配置所述元数据分区组和所述数据分区组,使得元数据分区组包含的元数据分区的数量等于数据分区组包含的数据分区的数量。当第二节点加入所述存储系统时,将所述至少两个元数据分区组中的第一元数据分区组以及所述第一元数据分区组对应的元数据迁移至所述第二节点。而所述至少两个数据分区组对应的数据继续保持在所述第一节点中。
[0019] 在第八方面提供的存储系统中,在迁移以后仍然能满足任意一个数据分区组对应的数据的元数据均存储在一个节点中,不需要到两个节点去获取或修改元数据。
[0020] 第九方面,提供了一种节点扩容方法,应用于所述第八方面提供的存储系统中,由所述存储系统中的第一节点执行第八方面所提供的功能。
[0021] 第十方面,提供了一种节点扩容装置,位于第五方面提供的存储系统中,用于执行第八方面所提供的功能。附图说明
[0022] 图1是可应用本发明实施例的技术方案的场景的示意图。
[0023] 图2是本发明实施例的存储单元的示意图。
[0024] 图3是本发明实施例提供的一种元数据分区组和数据分区组的示意图。
[0025] 图4是本发明实施例提供的另一种元数据分区组和数据分区组的示意图。
[0026] 图5是本发明实施例提供的扩容前的元数据分区的布局示意图。
[0027] 图6是本发明实施例提供的扩容后的元数据分区的布局示意图。
[0028] 图7是本发明实施例提供的节点扩容方法的流程示意图。
[0029] 图8是本发明实施例提供的节点扩容装置的结构示意图。
[0030] 图9是本发明实施例提供的存储节点的结构示意图。

具体实施方式

[0031] 本申请实施例在扩容时将元数据迁移至新加入的节点,而保持数据继续存储在原有的节点中。并且通过配置始终保证数据分区组对应的数据的元数据是元数据分区组对应的元数据的子集,使得一个数据分区组对应的数据仅被一个节点中存储的元数据所描述。从而达到节省带宽的目的。下面将结合附图,对本申请中的技术方案进行描述。
[0032] 本申请实施例的技术方案可以应用于各种存储系统。在下文中以分布式存储系统为例描述本申请实施例的技术方案,但本申请实施例对此并不限定。在分布式存储系统中,数据分散存储在多台存储节点上,多台存储节点分担了存储负荷,这种存储方式不但提高了系统的可靠性、可用性和存取效率,还易于扩展。存储设备例如是存储服务器,或者是存储控制器和存储介质的组合。
[0033] 图1是可应用本申请实施例的技术方案的场景的示意图。如图1所示,客户端服务器(client server)101和存储系统100通信,存储系统100包括交换机103和多个存储节点(或简称“节点”)104等。其中,交换机103是可选设备。每个存储节点104可以包括多个硬盘或者其他类型的存储介质(例如固态硬盘或者叠瓦式磁记录),用于存储数据。下面分四个部分介绍本申请实施例。
[0034] 一、存储数据的过程。
[0035] 为了保证数据均匀存储在各个存储节点104中,在选择存储节点时通常采用分布式哈希表(Distributed Hash Table,DHT)方式进行路由,但本申请实施例对此并不限定。也就是说,在本申请实施例的技术方案中,可以采用存储系统中的各种可能的路由方式。按照分布式哈希表方式,将哈希环均匀地划分为若干部分,每个部分称为一个分区(partition),每个分区对应一段设定大小的存储空间。可以理解的是,分区越多,每个分区所对应的存储空间越小,分区越少,每个分区所对应的存储空间越大。在实际应用中,分区的数目往往较大(本实施例以4096个分区为例),为了管理方便,将这些分区划分为多个分区组,每个分区组所包含的分区的数量相同。在不能绝对平均的情况下,只要保证每个分区组包含的分区的数量基本相同即可。例如,将4096个分区划分为144个分区组,其中,分区组
0包含分区0-分区27,分区组1包含分区28-分区57……,分区组143包括分区4066-分区
4095。分区组有自己的标识,用于唯一识别该分区组。同样的,分区也有自己标识,用于唯一识别该分区。标识可以是编号,也可以是字符串,或者编号与字符串的组合。在本实施例中,每个分区组对应一个存储节点104,“对应”的含义是指凡是通过哈希值定位到的同一个分区组的数据都会存储到同一个存储节点104中。
[0036] 客户端服务器101发送写请求给任意一个存储节点104,所述写请求中携带待写入的数据以及所述数据的虚拟地址。虚拟地址是指该数据待写入的逻辑单元(Logical Unit,LU)的标识和偏移量,虚拟地址是对客户端服务器101可见的地址。所述接收到写请求的存储节点104根据该数据的虚拟地址进行哈希运算得到哈希值,该哈希值可以唯一确定一个目标分区。当目标分区确定下来之后,该目标分区所在的分区组也确定下来了,根据分区组与存储节点的对应关系,所述接收到写请求的存储节点可以将所述写请求转发给所述分区组对应的存储节点。一个分区组对应一个或多个存储节点。所述对应的存储节点(为了和其他存储节点104相区别,这里称为第一存储节点)将所述写请求写入它的缓存,待条件满足时再进行持久化存储。
[0037] 在本实施例中,每个存储节点都包含有至少一个存储单元,存储单元是一段逻辑空间,实际的物理空间仍然来自多个存储节点。请参考图2,图2是本实施例提供的存储单元的结构示意图。存储单元是包含多个逻辑的集合。逻辑块是一个空间概念,其大小以4MB为例,但不限定为4MB。一个存储节点104(仍然以第一存储节点为例)以逻辑块的形式对存储系统100中的其他存储节点104的存储空间进行使用或管理。来自不同存储节点104的硬盘上的逻辑块可以构成一个逻辑块集合,存储节点104再根据设定的独立硬盘冗余阵列(Redundant Array of Independent Disks,RAID)类型将这个逻辑块集合划分为数据存储单元和校验存储单元。包含数据存储单元和校验存储单元的逻辑块集合被称为存储单元。其中,数据存储单元中包括至少两个逻辑块,用于存储数据分配,校验存储单元中包括至少一个校验逻辑块,用于存储校验分片。包含数据存储单元和校验存储单元的逻辑块集合被称为存储单元。假设从6个存储节点中各取出一个逻辑块构成逻辑块集合,然后第一存储节点根据RAID类型(以RAID6为例)对该逻辑块集合中的逻辑块进行分组,例如逻辑块1、逻辑块2、逻辑块3和逻辑块4组成数据存储单元,逻辑块5和逻辑块6组成校验存储单元。可以理解的是,按照RAID6的冗余保护机制,任意两个数据单元或者校验单元失效时,可以根据剩下的数据单元或者校验单元重构出失效的单元。
[0038] 当第一存储节点的缓存中的数据达到设定阈值时,可以根据所述设定的RAID类型将这些数据切分为多个数据分片,并计算获得校验分片,将所述数据分片以及校验分片存储到存储单元中。这些数据分片和对应的校验分片构成一个分条。一个存储单元可以存储多个分条,并不限于图2所示的3个分条。例如,当第一存储节点中待存储的数据达到32KB(8KB*4)时,将所述数据划分为4个数据分片,每个数据分片为8KB,然后计算获得2个校验分片,每个校验分片也为8KB。第一存储节点再将各个分片发送给其所在的存储节点进行持久化存储。从逻辑上看,所述数据是写入了第一存储节点的存储单元中,从物理上看,数据最终仍然是存储在多个存储节点中的。对于每个分片而言,它所在的存储单元的标识以及位于所述存储单元内部的位置是所述分片的逻辑地址,该分片位于存储节点中的实际地址是所述分片的物理地址。
[0039] 二、存储元数据的过程
[0040] 当数据存储至存储节点之后,为了将来能查找这些数据,还需要存储这些数据的描述信息,我们把这些描述数据的描述信息称之为元数据。存储节点在收到读请求时,通常根据该读请求中携带的虚拟地址找到待读取数据的元数据,再进一步根据所述元数据获取所述待读取数据。元数据包括但不限于:每个分片的逻辑地址与物理地址之间的对应关系,所述数据的虚拟地址与该数据所包含的各个分片的逻辑地址之间的对应关系。该数据所包含的各个分片的逻辑地址的集合也就是该数据的逻辑地址。
[0041] 与存储数据的过程类似,元数据所在的分区也是根据读请求或写请求中携带的虚拟地址确定的,具体的,对所述虚拟地址进行哈希运算得到哈希值,通过所述哈希值可以唯一确定一个目标分区,从而进一步确定所述目标分区所在的目标分区组,然后将待存储的元数据发送到所述目标分区组所对应的存储节点(例如第一存储节点)。当所述第一存储节点中待存储的元数据达到设定阈值(例如,32KB)时,将所述元数据划分为4个数据分片,然后计算获得2个校验分片。再将这些分片发送给多个存储节点。
[0042] 在本实施例中,数据的分区和元数据的分区相互独立。换言之,数据有自己的分区机制,元数据也有自己的分区机制。但数据的分区的总数和元数据的分区的总数是相同的。例如,数据的分区的总数是4096个,元数据的分区的总数也是4096个。为了描述方便,本发明实施例中将对应数据的分区称为数据分区,对应元数据的分区称为元数据分区。将对应数据的分区组称为数据分区组,对应元数据的分区组称为元数据分区组。由于元数据分区和数据分区都是根据读请求或写请求中携带的虚拟地址确定的,因此一个元数据分区对应的元数据是用于描述与其具有相同标识的数据分区对应的数据的。例如,元数据分区1对应的元数据用于描述数据分区1对应的数据,元数据分区2对应的元数据用于描述数据分区2对应的数据,元数据分区N对应的元数据用于描述数据分区N对应的数据,其中,N为大于或等于2的整数。数据和该数据的元数据可以存储在同一个存储节点中,也可以存储在不同的存储节点中。
[0043] 元数据存储之后,存储节点在收到读请求时,就可以通过读取元数据获知待读取数据的物理地址。具体的,当任意一个存储节点104收到客户端服务器101发送的读请求时,该节点104对所述读请求中携带的虚拟地址进行哈希计算获得哈希值,从而获得该哈希值对应的元数据分区及其元数据分区组。假设所述元数据分区组对应的存储单元归属于第一存储节点,那么所述接收读请求的存储节点104会将所述读请求转发给第一存储节点。所述第一存储节点从所述存储单元中读取出待读取数据的元数据。第一存储节点再根据所述元数据从多个存储节点中获取组成该待读取数据的各个分片,验证无误后再聚合成所述待读取的数据返回给客户端服务器101。
[0044] 三、扩容
[0045] 随着存储系统100中存储的数据越来越多,其存储空间也日渐减少,因此需要增加存储系统100中的存储节点的数量,这个过程被称为扩容。当新的存储节点(简称:新节点)加入存储系统100之后,存储系统100会将旧的存储节点(简称:旧节点)的分区以及分区对应的数据迁移至新节点中。例如,假设存储系统100原来有8个存储节点,扩容之后变成16个存储节点,那么原来的8个存储节点就需要分别迁移一半分区以及这些分区对应的数据至新加入的8个存储节点中。为了节省存储节点之间的带宽资源,目前有一种做法是,只迁移元数据分区及其对应的元数据,不迁移数据分区。元数据迁移至新的存储节点之后,由于元数据记录有数据的逻辑地址与物理地址之间的对应关系,即使客户端服务器101向新节点发送读请求,也可以通过所述对应关系找到该数据在旧节点中的位置从而读出该数据。例如,如果将元数据分区1对应的元数据迁移至新节点,当客户端服务器101向所述新节点发送读请求要求读取数据分区1对应的数据时,虽然数据分区1对应的数据并没有迁移至所述新节点,但仍然可以根据元数据分区1对应的元数据找到待读取数据的物理地址,从旧节点读取该数据。
[0046] 另外,节点扩容时通常是以分区组为单位来迁移分区及其数据的。如果元数据分区组所对应的元数据比用来描述数据分区组所对应的数据的元数据少,就会导致同一个存储单元被至少两个元数据分区组引用,由此带来管理上的不便。
[0047] 通常,元数据分区组包含分区的数量通常会小于数据分区组包含分区的数量。请参考图3,图3中每个元数据分区组包含32个分区,每个数据分区组包含64个分区。示例性的,数据分区组1包含分区0-分区63。分区0-分区63对应的数据都存储在存储单元1中,元数据分区组1包含分区0-分区31,元数据分区组2包含分区32-分区63。可见,元数据分区组1和元数据分区组2这两个所包含的所有的分区都是用于描述存储单元1中的数据的。在扩容之前,元数据分区组1和元数据分区组2分别指向存储单元1。新节点加入以后,假设将旧节点中的元数据分区组1及其对应的元数据迁移至所述新的存储节点,那么迁移之后旧节点中不再有元数据分区组1,其指向关系被删除(用虚线箭头表示),新节点中的元数据分区组1指向所述存储单元1。另外,旧节点中的元数据分区组2没有被迁移,仍然指向所述存储单元1。那么,在扩容之后存储单元1同时被旧节点中的元数据分区组2以及新节点中的元数据分区组1所引用。当存储单元1中的数据发生变化时就需要到两个存储节点(旧节点和新节点)中查找相应的元数据并进行修改,这就会造成管理上的复杂,尤其是垃圾回收操作的复杂程度。
[0048] 为了解决上述问题,在本实施例中,元数据分区组所包含的分区的数量被设置为大于或等于数据分区组所包含的分区的数量。换言之,一个元数据分区组所对应的元数据多于或等于用于描述一个数据分区组所对应的数据的元数据。例如,每个元数据分区组包含64个分区,每个数据分区组包含32个分区。如图4所示,元数据分区组1包含分区0-分区63,数据分区组1包括分区0-分区31,数据分区组2包含分区32-分区63。数据分区组1对应的数据存储在存储单元1中,数据分区组2对应的数据存储在存储单元2中。扩容之前,旧节点中的元数据分区组1分别指向存储单元1和存储单元2。扩容之后,将元数据分区组1及其对应的元数据迁移至新的存储节点,那么新节点中的元数据分区组1分别指向存储单元1和存储单元2,由于旧节点中已经不存在所述元数据分区组1了,所以其指向关系被删除(用虚线箭头表示)。可见,无论是对于存储单元1还是对于存储单元2,都只被一个元数据分区组引用,简化了管理的复杂度。
[0049] 因此,在本实施例中在扩容前会对元数据分区组和数据分区组进行配置,使得元数据分区组所包含的分区的数量被设置为大于数据分区组所包含的分区的数量。扩容之后,将旧节点中的元数据分区组分裂成至少两个子元数据分区组之后将至少一个子元数据分区组及其对应的元数据迁移至新节点。然后再将旧节点中的数据分区组分裂成至少两个子数据分区组,使得子元数据分区组所包含的分区的数量被设置为大于或等于子数据分区组所包含的分区的数量,从而为下一次扩容做准备。
[0050] 下面以一个具体的例子来说明扩容的过程,请参见图5,图5是扩容前各个存储节点的元数据分区组分布图。
[0051] 在本实施例中可以预先设定每个存储节点分配的分区组的数量。当存储节点包含多个处理单元时,为了使得读写请求均匀地分散在各个处理单元上,本发明实施例也可以设定每个处理单元对应一定数量的分区组,处理单元是指节点内的CPU。如表1所示:
[0052]存储节点的数量 处理单元的数量 分区组的数量
3 24 144
4 32 192
5 40 240
6 48 288
7 56 336
8 64 384
9 72 432
10 80 480
11 88 528
12 96 576
13 104 624
14 112 672
15 120 720
[0053] 表1
[0054] 表1描述的是节点与节点的处理单元,以及与分区组之间的关系,例如每个节点有8个处理单元,每个处理单元分配的分区组为6,那么每个节点所分配的分区组的数量为48。
假设,存储系统100在扩容前有3个存储节点,其所拥有的分区组的数量为144。按照前面的描述,存储系统100初始化时即配置了分区总数,例如分区总数为4096个分区。如果要将
4096平均分布在144个分区组中,那么每个分区组需拥有4096/144=28.44个。然而,每个分区组所包含的分区的数量必须是整数,并且是2的N次方,其中N是大于或等于0的整数。因此,这4096个分组并不能绝对平均地分布在144个分区组中。可以确定的是,28.44小于32(2的5次方),并且大于16(2的4次方),因此这144个分区组中的X个第一分区组包含32个分区,Y个第二分区组包含16个分区。其中,X,Y满足下述方程式:32X+16Y=4096,以及X+Y=144。
[0055] 通过上述两个方程式计算得出X=112,Y=32。这意味着,144个分区组中有112个第一分区组和32个第二分区组,其中每个第一分区组包含32个分区,每个第二分区组包含16个分区。然后根据第一分区组的总数和处理单元的总数计算每个处理单元配置的第一分区组数量(112/(3*8)=4…16),再根据第二分区组的总数和处理单元的总数计算每个处理单元配置的第二分区组(32/(3*8)=1…8)。由此得出每个处理单元至少配置了4个第一分区组和2个第二分区组,剩下的8个第二分区尽量均匀地分布在3个节点上(如图5所示)。
[0056] 请参考图6,图6是扩容后各个存储节点的元数据分区组分布图。假设存储系统100新加入2个存储节点,那么此时存储系统100有5个存储节点。根据表1,5个存储节点共有40个处理单元,每个处理单元配置有6个分区组,那么5个存储节点共有240个分区组。分区总数为4096个分区。如果要将4096平均分布在240个分区组中,那么每个分区组需拥有4096/240=17.07个。然而,每个分区组所包含的分区的数量必须是整数,并且是2的N次方,其中N是大于或等于0的整数。因此,这4096个分组并不能绝对平均地分布在240个分区组中。可以确定的是,17.07小于32(2的5次方),并且大于16(2的4次方),因此这240个分区组中的X个第一分区组包含32个分区,Y个第二分区组包含16个分区。其中,X,Y满足下述方程式:32X+
16Y=4096,以及X+Y=240。
[0057] 通过上述两个方程式计算得出X=16,Y=224。这意味着,240个分区组中有16个第一分区组和224个第二分区组,其中每个第一分区组包含32个分区,每个第二分区组包含16个分区。然后根据第一分区组的总数和处理单元的总数计算每个处理单元配置的第一分区组数量(16/(5*8)=0…16),再根据第二分区组的总数和处理单元的总数计算每个处理单元配置的第二分区组(224/(5*8)=5…24)。由此得出只有16个处理单元配置了一个第一分区组,每个处理单元至少配置了5个第二分区组,剩下的24个第二分区尽量均匀地分布在5个节点上(如图6所示)。
[0058] 根据扩容前3个节点的分区布局示意图以及扩容后5个节点的分区布局示意图,可以将扩容前的3个节点中的一部分第一分区组分裂成两个第二分区组,再根据图6所示的每个节点的分区分布,从3个节点中迁移一些第一分区组和第二分区组至节点4和节点5。例如,根据图5所示,扩容前存储系统100中有112个第一分区组,而扩容后有16个第一分区组,因此在112个第一分区组中有96个第一分区组需要分裂。96个第一分区组分裂成192个第二分区组,因此分裂之后3个节点上共有16个第一分区组和224个第二分区,然而每个节点再分别迁移一部分第一分区组和一部分第二分区组到节点4和节点5中。以节点1的处理单元1为例,根据图5所示,扩容前处理单元1配置有4个第一分区组和3个第二分区组,根据图5所示扩容后处理单元1配置有1个第一分区组和5个分区组。这说明,处理单元1中有3个第一分区组需迁移出去,或者分裂成多个第二分区组后再迁移出去。至于这3个第一分区组有多少是直接迁移至新加入的节点,有多少是分裂之后再迁移至新加入的节点,本实施例不对此进行任何限制,只要迁移后满足图6所示的分区分布即可。其余各节点的各个处理单元也按照同样的思路进行迁移和分裂。
[0059] 在上述例子中,扩容前的3个存储节点先将部分第一分区组分裂成第二分区组之后再迁移至新节点,在另一种实施方式中也可以先将部分第一分区组迁移至新节点之后再进行分裂,同样能够达到图6所示的分区分布。
[0060] 需要说明的是,上面的描述以及图5的示例是针对元数据分区组而言的,然而对于数据分区组,每个数据分区组所包含的数据分区的数量需小于元数据分区组所包含的元数据分区的数量。因此,迁移完成之后数据分区组需要进行分裂,分裂之后的子数据分区组所包含的分区的数量需小于子元数据分区组所包含的元数据分区的数量。分裂的目的是使得当前的元数据分区组对应的元数据始终包含用于描述当前的数据分区组对应的数据的元数据。由于上述例子中有的元数据分区组包含32个元数据分区,有的元数据分区组包含16个元数据分区,因此,分裂后所得的子数据分区组所包含的数据分区组的数量可以是16,或者8,或者4,或者2,总之不能超过16。
[0061] 四、垃圾回收
[0062] 当存储系统100中的垃圾数据较多时,可以启动垃圾回收。本实施例中,垃圾回收是以存储单元为单位进行的。选择一个存储单元作为垃圾回收的对象,将这个存储单元中的有效数据迁移至一个新的存储单元中,然后再释放原来的存储单元所占用的存储空间。所述选择出的存储单元需要满足一定条件,例如该存储单元包含的垃圾数据到达第一设定阈值,或者该存储单元是所述多个存储单元中包含垃圾数据最多的存储单元,或者该存储单元包含的有效数据低于第二设定阈值,或者该存储单元是所述多个存储单元中包含有效数据最少的存储单元。为了方便描述,本实施例将所述选择出的进行垃圾回收的存储单元称为第一存储单元或者存储单元1。
[0063] 参考图3,以对存储单元1执行垃圾回收为例来说明通常垃圾回收的方法。垃圾回收的执行主体是存储单元1所归属的存储节点(继续以第一存储节点为例),第一存储节点从存储单元1中读取有效数据,将这些有效数据写入一个新的存储单元。然后,将存储单元1中的所有数据标记为无效,并且向每个分片所在的存储节点发送删除请求以删除分片。最后,第一存储节点还需要修改用于描述存储单元1中的数据的元数据。由图3可知,元数据分区组2所对应的元数据以及元数据分区组1所对应的元数据均是用于描述存储单元1中的数据的元数据,并且元数据分区组2和元数据分区组1分别位于不同的存储节点中。因此,第一存储节点需要分别在两个存储节点中修改元数据,在修改的过程中会在节点之间产生多次读请求以及写请求,严重消耗节点间的带宽资源。
[0064] 参考图4,以对存储单元2执行垃圾回收为例来说明本发明实施例的垃圾回收方法。垃圾回收的执行主体是存储单元2所归属的存储节点(以第二存储节点为例),第二存储节点从存储单元2中读取有效数据,将这些有效数据写入一个新的存储单元。然后,将存储单元2中的所有数据标记为无效,并且向每个分片所在的存储节点发送删除请求以删除分片。最后,第二存储节点还需要修改用于描述存储单元2中的数据的元数据。由图4可知,存储单元2只被元数据分区组1引用,也就是说只有元数据分区组1对应的元数据用于描述存储单元2中的数据。因此,第二存储节点只需要向元数据分区组1所在的存储节点发送请求以修改元数据。和示例一相比,由于第二存储节点只需要在一个存储节点上修改元数据,大大节省了节点间的带宽资源。
[0065] 下面结合流程图来介绍本实施例提供的节点扩容方法。请参考图7,图7是节点扩容方法的方法流程图。该方法应用在图1所示的存储系统中,所述存储系统包括多个第一节点。第一节点是指扩容前所述存储系统已经存在的节点,具体可参见图1或图2所示的节点104。每个第一节点都可以按照图7所示的步骤执行所述节点扩容方法。
[0066] S701,配置第一节点的数据分区组和元数据分区组。所述数据分区组包括多个数据分区,所述元数据分区组包括多个元数据分区。配置后的数据分区组对应的数据的元数据是元数据分区组所对应的元数据的子集。这里的子集有两层含义,一是所述元数据分区组对应的元数据包含了用于描述所述数据分区组所对应的数据的元数据,二是所述元数据分区组所包含的元数据分区的数量大于所述数据分区组所包含的数据分区的数据。举个例子,数据分区组包含M个数据分区,分别是数据分区1、数据分区2……数据分区M。元数据分区组包含N个元数据分区,N大于M,分别是元数据分区1、元数据分区2……,元数据分区M……元数据分区N。根据前面的描述,元数据分区1对应的元数据用于描述数据分区1对应的数据,元数据分区2对应的元数据用于描述数据分区2对应的数据,元数据分区M对应的元数据用于描述数据分区M对应的数据。因此所述元数据分区组包含所有用于描述M个数据分区对应的数据的元数据,除此之外,所述元数据分区组还包含用于描述其他数据分区组对应的数据的元数据。
[0067] S701中所描述的第一节点就是扩容部分描述的旧节点。另外,需要说明的是,所述第一节点的数据分区组可以是一个也可以是多个,同理,所述第一节点的数据分区组也可以是一个或多个。
[0068] S702,当第二节点加入所述存储系统时,将所述元数据分区组分裂成至少两个子元数据分区组。当所述第一节点包含一个元数据分区组时,这一个元数据分区组需要分裂成至少两个子元数据分区组。当所述第一节点包含多个元数据分区组时,可能只有部分元数据分区组需要分裂,而剩余的元数据分区组继续保持原有的元数据分区。至于哪些元数据分区组需要分裂,如何分裂,可以根据扩容后元数据分区组布局和扩容前元数据分区组布局来确定。所述扩容后元数据分区组布局包括所述第二节点加入所述存储系统后所述存储系统中每个节点配置的所述子元数据分区组的数量,以及所述子元数据分区组包含的元数据分区的数量,所述扩容前元数据分区组布局包括所述第二节点加入所述存储系统之前所述第一节点配置的所述元数据分区组的数量,以及所述元数据分区组包含的元数据分区的数量。具体实现可参考扩容部分中与图5、图6相关的描述。
[0069] 分裂这个动作,在实际实现时是指映射关系的改变。具体而言,分裂之前原有的元数据分区组的标识与所述元数据分区组所包含的每个元数据分区的标识之间具有映射关系,分裂之后增加至少两个子元数据分区组的标识,并且删除原有的元数据分区组所包含的元数据分区的标识与所述原有的元数据分区组的标识之间的映射关系,创建所述原有的元数据分区组所包含的一部分元数据分区的标识与其中一个子元数据分区组的标识之间的映射关系,以及所述原有的元数据分区组所包含的另一部分元数据分区的标识与另一个子元数据分区组的标识之间的映射关系。
[0070] S703,将一个子元数据分区组及其对应的元数据迁移至所述第二节点。第二节点是扩容部分描述的新节点。
[0071] 其中,分区组的迁移是指归属关系的改变,具体的,将子元数据分区组迁移至所述第二节点具体是指将所述子元数据分区组与所述第一节点之间的对应关系修改为与所述第二节点的对应关系。而元数据的迁移是指数据的实际移动,具体的,将子元数据分区组对应的元数据迁移至所述第二节点是指将所述元数据复制到所述第二节点,并且删除所述第一节点保留的所述元数据。
[0072] 由于S701中对第一节点的数据分区组和元数据分区组进行了配置,使得配置后的述数据分区组对应的数据的元数据是所述元数据分区组对应的元数据的子集,因此即使所述元数据分区组分裂成至少两个子元数据分区组,所述数据分区组对应的数据的元数据仍然是其中一个子元数据分区组对应的元数据的子集。那么当其中一个子元数据分区组及其对应的元数据迁移至第二节点之后,所述数据分区组对应的数据仍然是由一个节点中存储的元数据来描述的,这就避免了在对数据进行修改,特别是执行垃圾回收时在不同的节点上修改元数据。
[0073] 为了保证下一次扩容时,数据分区组对应的数据的元数据仍然是子元数据分区组所对应的元数据的子集,在S703之后还可以执行S704:将所述第一节点中的所述数据分区组分裂成至少两个子数据分区组,所述子数据分区组对应的数据的元数据是所述子元数据分区组对应的元数据的子集。此处分裂的定义与S702中的分裂相同。
[0074] 在图7所提供的节点扩容方法中,数据和所述数据的元数据是存储在同一个节点中的,然而在另一种场景中数据和所述数据的元数据存储在不同的节点中,那么对于某个节点来说,虽然它可能也包括数据分区组和元数据分区组,但是该元数据分区组所对应的元数据可能并非所述数据分区组所对应的数据的元数据,而是其他节点上存储的数据的元数据。对于这种场景,每个第一节点仍然需要对该节点中的数据分区组和元数据分区组进行配置,经过配置后的元数据分区组所包含的元数据分区的数量大于数据分区组所包含的数据分区的数量即可。当第二节点加入所述存储系统之后,每个第一节点再按照S702的描述对元数据分区组进行分裂,将分裂后的一个子元数据分区组迁移至所述第二节点。由于每个第一节点都对其数据分区组和元数据分区组进行了这样的配置,在迁移以后仍然能满足一个数据分区组对应的数据由同一个节点中存储的元数据来描述。举一个具体的例子,第一节点中存储有数据,而该数据的元数据存储在第三节点中。那么第一节点对该数据对应的数据分区组进行配置,第三节点对该元数据对应的元数据分区组进行配置。经过配置,数据分区组对应的数据的元数据是所述配置后的元数据分区组对应的元数据的子集。当第二节点加入所述存储系统时,所述第三节点再将所述元数据分区组分裂成至少两个子元数据分区组,并且将所述至少两个子元数据分区组中的第一子元数据分区组及其所述第一子元数据分区组对应的元数据迁移至所述第二节点。
[0075] 另外,在图7所提供的节点扩容方法中,数据分区组所包含的数据分区的数量小于元数据分区组所包含的元数据分区的数量。在另一种场景中,数据分区组所包含的数据分区的数量等于元数据分区组所包含的元数据分区的数量,当数据分区组所包含的数据分区的数量等于元数据分区组所包含的元数据分区的数量时,如果第二节点加入所述存储系统,不需要对元数据分区组进行分裂,而是直接将第一节点中的多个元数据分区组中的一部分元数据分区组及其对应的元数据迁移至所述第二节点。同样的,对于这种场景也可以分为两种情况。情况1,如果数据和所述数据的元数据存储在同一个节点中,那么每个第一节点都需要将元数据分区组所对应的元数据仅包含该节点中数据分区组所对应的数据的元数据。情况2,如果数据和所述数据的元数据存储在不同的节点中,那么每个第一节点都需要将元数据分区组所包含的元数据分区的数量配置成等于数据分区组所包含的数据分区的数量。无论是情况1还是情况2,都不需要对元数据分区组进行分裂,直接将该节点中的多个元数据分区组中的一部分元数据分区组及其对应的元数据迁移至所述第二节点即可。但这种场景不适用于仅包含一个元数据分区组的节点。
[0076] 另外,在本实施例提供的节点扩容方法所适用的各种场景中,数据分区组及其对应的数据都不需要迁移至第二节点,如果所述第二节点接收到读请求,也可以根据其存储的元数据找到待读取数据的物理地址,从而读取到该数据。由于元数据的数据量大大小于数据的数据量,避免将数据迁移至第二节点可以大大节省节点之间的带宽。
[0077] 本实施例还提供了一种节点扩容装置,如图8所示,图8是所述节点扩容装置的结构示意图。该装置包括配置模块801,分裂模块802,迁移模块803。
[0078] 配置模块801,用于配置存储系统中的第一节点的数据分区组和元数据分区组,所述数据分区组包含多个数据分区,所述元数据分区组包括多个元数据分区,所述数据分区组对应的数据的元数据是所述元数据分区组对应的元数据的子集。具体的,可参考图7所示的S701的描述。
[0079] 分裂模块802,用于当第二节点加入所述存储系统时,将所述元数据分区组分裂成至少两个子元数据分区组。具体的,可参考图7所示的S702的描述,以及扩容部分中与图5、图6相关的描述。
[0080] 迁移模块803,用于将所述至少两个子元数据分区组中的一个子元数据分区组及其对应的元数据迁移至所述第二节点。具体的,可参考图7所示的S703的描述。
[0081] 可选的,所述装置还包括获取模块804,用于获取扩容后元数据分区组布局和扩容前元数据分区组布局,所述扩容后元数据分区组布局包括所述第二节点加入所述存储系统后所述存储系统中每个节点配置的所述子元数据分区组的数量,以及所述子元数据分区组包含的元数据分区的数量,所述扩容前元数据分区组布局包括所述第二节点加入所述存储系统之前所述第一节点配置的所述元数据分区组的数量,以及所述元数据分区组包含的元数据分区的数量。所述分裂模块802具体用于根据所述扩容后元数据分区组布局和所述扩容前元数据分区组布局,将所述元数据分区组分裂成至少两个子元数据分区组。
[0082] 可选的,所述分裂模块802还用于在所述将至少一个子元数据分区组及其对应的元数据迁移至所述第二节点之后,将所述数据分区组分裂成至少两个子数据分区组,所述子数据分区组对应的数据的元数据是所述子元数据分区组对应的元数据的子集。
[0083] 可选的,配置模块801还用于当所述第二节点加入所述存储系统时,保持所述数据分区组对应的数据继续存储在所述第一节点中。
[0084] 本实施例还提供了一种存储节点,所述存储节点可以是存储阵列,也可以是服务器。当存储节点是存储阵列时,该存储节点包括存储控制器和存储介质。所述存储控制器的结构可以参考图9的结构示意图。当存储节点是服务器时,也可以参考图9的结构示意图。由此,无论存储节点是哪种形态的设备,都至少包括了处理器901和存储器902。所述存储器902中存储有程序903。处理器901、存储器902和通信接口之间通过系统总线连接并完成相互间的通信。
[0085] 处理器901是单核或多核中央处理单元,或者为特定集成电路,或者为被配置成实施本发明实施例的一个或多个集成电路。存储器902可以为高速RAM存储器,也可以为非易失性存储器(non-volatile memory),例如至少一个硬盘存储器。存储器902用于存储计算机执行指令。具体的,计算机执行指令中可以包括程序903。当所述存储节点运行时,处理器901运行所述程序903以执行图7所示的S701-S704的方法流程。
[0086] 上述图8所示的配置模块801、分裂模块802、迁移模块803以及获取模块804的功能可以由处理器901运行程序903执行,或者由处理器901单独执行。
[0087] 在上述实施例中,可以全部或部分地通过软件硬件固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、存储节点或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、存储节点或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的存储节点、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘(Solid State Disk,SSD))等。
[0088] 应理解,在本申请实施例中,术语“第一”等仅仅是为了指代对象,并不表示相应对象的次序。
[0089] 本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
[0090] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0091] 在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0092] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0093] 另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0094] 所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,存储节点,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
[0095] 以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈