一种数据分区路由方法、装置及系统
技术领域
本发明涉及计算机领域,更具体地,涉及一种数据分区路由方法、装置及系统。
背景技术
在分布式存储系统领域,存储系统通常以集群形态呈现给用户。集群形态的优势是可以水平扩展,自适应弹性伸缩,同时能够提供数据冗余存储功能。正因为如此,分布式存储系统在各大互联网企业,大数据领域有着广泛的应用。
在分布式存储集群中,数据集被分成指定数量的数据分区(Partition),数据分区之间交集为空。当存储数据时,被存储的数据条目会按照既定规则存放到唯一的一个数据分区对应的存储节点(也可称为机器节点、物理节点)中。例如存在N个数据分区时,键值为Key的数据条目可以存放到号码为Hash(key)%N的数据分区对应的存储节点,其中,Hash(key)表示key的哈希值,“%”表示取模运算。
通常在一个分布式集群中,为了提高数据可靠性与安全性,数据分区是多备份存储的,也即是一个数据分区会被存储为多个备份,其中一个备份为该数据分区的主分区,其余备份按逻辑称之为该数据分区的副本分区。
分布式存储系统领域广泛使用的数据分区算法是基于一致性哈希算法。该方案是分别将数据分区的哈希值和存储节点的机器ID的哈希值映射到同一个一维值域空间中,首尾相连形成环,机器ID的哈希值分布在环中。如图1所示,假定存储节点的机器ID的哈希值为N0,第二存储节点的机器ID的哈希值为N1,第三存储节点的机器ID的哈希值为N2,Hash环的Hash空间被哈希值N0、N1和N2划分成3个区间,哈希值落在[N0,N1]上的数据分区保存在存储节点,哈希值落在[N1,N2]上的数据分区保存在第二存储节点,哈希值落在[N2,N0]上的数据分区保存在第三存储节点。
数据分区路由表描述的是数据分区与存储节点之间的映射关系。给定数据分区的编号,根据数据分区路由表能够唯一确定一个存储节点。在上述示例中,在数据分区路由表中,需要为哈希值落在[N0,N1]上的数据分区建立到存储节点的路由,为哈希值落在[N1,N2]上的数据分区建立到第二存储节点的路由,为哈希值落在[N2,N0]上的数据分区建立到第三存储节点的路由。数据分区路由表具有可逆性有利于数据恢复,所谓的可逆性是指:数据分区路由表在状态S1下,经过某种操作OP变为状态S2后,再经过OP的逆操作,该数据分区路由表的状态可以变回为S1。在数据分区路由表变化时,路由变化的数据分区需要从源存储节点迁移到目标存储节点。
存储系统中有的存储节点资源较多,有的存储节点资源较少。传统的数据分区路由方法没有考虑存储节点的资源状况,会引起数据存储的不均衡。此外,传统的数据分区路由方法不能保证数据分区路由表的可逆性,而且在数据分区路由表变化时,数据的迁移量较大。
发明内容
本发明实施例提供了一种数据分区路由方法,包括:
根据第一集合中的第一存储节点的负载能力、所述第一集合中多个第一存储节点的总负载能力及第二集合的数据分区数目,确定所述第一存储节点可负载的第一数据分区个数;其中,所述第一集合是存储系统中第一存储节点的集合,所述第二集合是所述存储系统中待路由数据分区的集合;
根据所述第一存储节点可负载的第一数据分区个数,从所述第二集合中选择相应个数的数据分区分配给所述第一存储节点,建立选择的数据分区到所述第一存储节点的路由。
本发明实施例还提供了一种数据分区路由系统,包括路由初始化模块,所述路由初始化模块包括:
负载计算单元,用于根据第一集合中的第一存储节点的负载能力、所述第一集合中多个第一存储节点的总负载能力及第二集合的数据分区数目,确定所述第一存储节点可负载的第一数据分区个数;其中,所述第一集合是存储系统中第一存储节点的集合,所述第二集合是所述存储系统中待路由数据分区的集合;
路由建立单元,根据所述第一存储节点可负载的第一数据分区个数,从所述第二集合中选择相应个数的数据分区分配给所述第一存储节点,建立选择的数据分区到所述第一存储节点的路由。
本发明实施例还提供了一种数据分区路由装置,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上所述的数据分区路由方法的处理。
本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的数据分区路由方法的处理。
本发明实施例的上述方案根据存储节点的负载能力来确定存储节点可负载的数据分区数目,可以尽量使数据分区在存储节点合理分布。
附图说明
图1是相关技术基于一致性哈希算法进行数据分区分配的示意图;
图2是本发明实施例一数据分区路由方法的流程图;
图3是本发明实施例一数据分区路由系统中初始化模块的单元图;
图4是本发明实施例二数据分区路由初始化的方法的流程图;
图5是本发明实施例二新增节点时数据分区路由重构方法的流程图;
图6是本发明实施例二删除节点时数据分区路由重构方法的流程图;
图7是图3的初始化模块中的路由建立单元的结构图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下文中将结合附图对本发明的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
实施例一
本实施例提供一种分布式存储系统的数据分区路由方法。
存储节点的负载能力用于描述存储节点能够存储数据分区的能力。集群中不同存储节点的硬件配置或者可用资源不同,能够负载的数据分区(即能够保存的数据分区)的数量也是不同的。
存储节点通常包括以下类型的资源:
CPU资源,可以用逻辑核(logical core)的个数表示,单位是1个核;
内存(MEMORY)资源,可以用内存容量表示,单位MB;
磁盘(DISK)资源,可以用磁盘容量表示,单位MB或者IOPS;
网络(NETWORK)资源,可以用网络带宽表示,单位MB/s。
对于不同类型的需求,关注的节点资源类型不一样,对应的负载能力也不同。例如,对于快速缓存(Cache)型的存储引擎,只关注CPU、MEMORY和NETWORK资源,无需关注DISK资源。而CPU资源、MEMORY资源和NETWORK资源在计算负载能力时的权重也可以不同。
本实施例描述初始状态下的数据分区路由方法,如图2所示,本实施例的数据分区路由方法包括:
步骤110,根据第一集合中的第一存储节点的负载能力、所述第一集合中多个第一存储节点的总负载能力及第二集合的数据分区数目,确定所述第一存储节点可负载的第一数据分区个数;
本实施例中,第一存储节点是存储系统中参与数据分区存储的存储节点,第一集合是存储系统中第一存储节点的集合,第二集合是存储系统中待路由数据分区的集合。第一集合包括多个第一存储节点,本实施例在描述对第一存储节点的处理时,表示对第一集合的每一个第一存储节点均按照所描述的方法进行处理。当然,不同的第一存储节点的资源可能不同,处理的结果如计算出的可负载的第一数据分区个数可能是不同的。上述第一数据分区个数,本步骤计算出来的就是所述第一存储节点可负载的数据分区的个数。因为后续实施例在新增或者删除存储节点时,还会计算重构后的第一存储节点可负载的数据分区的个数,为了区别于重构后计算出的个数,所以这里称为第一数据分区个数。第一集合中的第一存储节点也可以用存储节点Ni,表示,i=1,2,…,I,I为第一集合中存储节点的个数,存储节点Ni可负载的第一数据分区个数表示为Ci。第一集合中多个第一存储节点的总负载能力通过将第一集合中的I个存储节点的负载能力累加得到,也即是存储系统(或叫存储集群)中参与数据分区存储的存储节点的负载能力之和。
本实施例中,将存储节点的资源按存储引擎类型量化出一个值,以描述节点的负载能力,具体可以按照以下方式得到:根据所述第一存储节点使用的存储引擎的类型确定用于计算存储节点负载能力的资源类型及其权重;按照所述权重,对所述第一存储节点具有的所述资源类型的资源数量进行加权累加,得到所述第一存储节点的负载能力。
例如,存储引擎为cache类型,某一存储节点有6个CPU逻辑核、10个GB的内存和20MB/s的网络带宽,CPU资源的资源系数(即权重)为2,内存资源和网络资源的资源系数均为4,不考虑磁盘资源。则该存储节点的负载能力的值等于6×2+10×4+20×4=132。
本实施例中,在确定所述第一存储节点可负载的第一数据分区个数时,是根据所述第一数据分区个数占所述数据分区数目的比例与所述第一存储节点的负载能力占所述总负载能力的比例一致的要求,计算所述第一数据分区个数。也即根据所述第一存储节点的负载能力占所述总负载能力的比例,来计算所述第一存储节点可负载的第一数据分区个数(同比例关系)。假定某个第一存储节点的负载能力占总负载能力的比例为1/100,而数据分区总数为1000个,则该第一存储节点可负载的第一数据分区个数为10,也即应为该第一存储节点分配的数据分区的数量为10。实际运算时,在不能整除时可以做一些近似处理。
上述负载能力的计算可以通过为不同的存储引擎定义不同的节点资源量化模板来实现,节点资源量化模板可以认为是一个函数,定义了存储节点负载能力的计算规则,向节点资源量化模板输入一存储节点的资源拥有量后,节点资源量化模板即可输出该存储节点的负载能力的值。
步骤120,根据所述第一存储节点可负载的第一数据分区个数,从所述第二集合中选择相应个数(即第一数据分区个数)的数据分区分配给所述第一存储节点,建立选择的数据分区到所述第一存储节点的路由。
本步骤可以在建立数据分区路由时执行,第一存储节点用存储节点Ni表示,存储节点Ni可负责的第一数据分区个数用Ci表示时,就是对第一集合中的存储节点Ni,从第二集合中选择Ci个数据分区,建立该Ci个数据分区到存储节点Ni的路由,i=1,2,…,I。在确定存储节点Ni可负载的第一数据分区个数之后,可以按约定方式对存储节点Ni和待路由的数据分区排序,依次完成分配并建立相应的路由。本实施例对从第二集合中选择数据分区分配给第一存储节点的具体方式不做限定,而在实施例二中,将对其中一种较佳的实现方式加以描述。
本实施例的数据分区路由方法根据第一存储节点的负载能力确定第一存储节点可负载的数据分区的个数,从而使存储节点保存的数据量与其资源相适配,因而允许存储系统有不同资源配置的存储节点,根据其资源配置情况负载不同数量的数据分区。资源多的存储节点保存更多的数据分区,可以使数据的存储更为平衡。
本实施例还提供了一种数据分区路由系统,包括路由初始化模块,如图3所示,所述路由初始化模块包括:
负载计算单元10,用于根据第一集合中的第一存储节点的负载能力、所述第一集合中多个第一存储节点的总负载能力及第二集合的数据分区数目,确定所述第一存储节点可负载的第一数据分区个数;其中,所述第一集合是存储系统中第一存储节点的集合,所述第二集合是所述存储系统中待路由数据分区的集合;
路由建立单元20,根据所述第一存储节点可负载的第一数据分区个数,从所述第二集合中选择相应个数的数据分区分配给所述第一存储节点,建立选择的数据分区到所述第一存储节点的路由。
本实施例中,
所述负载计算单元按照以下方式得到所述第一存储节点的负载能力:根据所述第一存储节点使用的存储引擎的类型确定用于计算存储节点负载能力的资源类型及其权重;按照所述权重,对所述第一存储节点具有的所述资源类型的资源数量进行加权累加,得到所述第一存储节点的负载能力。
本实施例中,
所述负载计算单元根据第一集合中的第一存储节点的负载能力、所述第一集合中多个存储节点的总负载能力及第二集合中的数据分区数目,确定所述第一存储节点可负载的第一数据分区个数,包括:根据所述第一数据分区个数占所述数据分区数目的比例与所述第一存储节点的负载能力占所述总负载能力的比例一致的要求,计算所述第一数据分区个数。
本实施例还提供了一种数据分区路由装置,可以设置在分布式存储系统中的一台或多台服务器上,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现本实施例数据分区路由方法的处理。
本实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现本实施例数据分区路由方法的处理。
实施例二
按照实施例一的数据分区路由方法确定存储系统中第一存储节点可负载的第一数据分区个数之后,需要建立数据分区路由,本实施例提供了一种基于第一存储节点可负载的第一数据分区个数,初始化数据分区路由的方法。以及在增加存储节点、删除存储节点等情况下,重构数据分区路由的方法。
本实施例的数据分区路由初始化方法,在给定一个存储节点集合和待分配数据分区集合时,按照本实施例方法,可以得到一个唯一的数据分区路由表。
为存储节点选择数据分区时,存在2个问题,一是按照怎样的存储节点顺序来依次分配,二是对于一个存储节点,按照什么规则为该存储节点选择数据分区,以分配给该存储节点。
对于第一个问题,本实施例将需要分配数据分区的存储节点按照节点ID(可以是存储节点的IP地址、域名或者其他任何可以标识存储节点的信息)的哈希值排序即按升序或降序排列,形成一个存储节点列序,依次为该存储节点序列中的存储节点选择数据分区,即先为该存储节点序列的第一个存储节点选择数据分区,再为该存储节点序列的第二个存储节点选择数据分区,依此类推。
对于第二个问题,本实施例按照存储节点的节点ID与待选择数据分区的分区ID(如数据分区的编号,通常采用唯一的递增编号)的HASH值,排序(降序或升序),形成待分配的数据分区序列。然后,按照该存储节点能够负载的数据分区的个数,从数据分区序列的头或尾开始,选择相应个数的数据分区分配给该存储节点。
如图4所示,本实施例采用以下方法根据第一存储节点可负载的第一数据分区个数,从第二集合中选择相应个数的数据分区分配给所述第一存储节点,建立选择的数据分区到所述第一存储节点的路由:
步骤210,将第一集合中的多个第一存储节点排序,得到一个存储节点序列;
较佳地,可以将第一集合中的第一存储节点按照节点ID哈希值的大小顺序排列,得到存储节点序列,如果第一集合中有I个第一存储节点,则将该I个存储节点按照节点ID哈希值的大小顺序排列(也即排序)。
步骤220,依次为该存储节点序列中的第一存储节点选择数据分区,其中,为当前的第一存储节点选择数据分区时,将所述第二集合中当前未分配的数据分区排序,根据当前的第一存储节点可负载的第一数据分区个数,从排序得到的数据分区序列的头或尾开始,选择相应个数(即第一数据分区个数)的数据分区分配给当前的第一存储节点。
在一个示例中,为当前的第一存储节点选择数据分区可以通过以下多步处理来完成:
第一步,根据当前的第一存储节点的节点标识及第二集合中当前未分配的每一数据分区的分区标识分别计算出一个哈希值;
本步骤中,假定第二集合中当前未分配的数据分区的个数为K,该K个数据分区记为Pk,相应的分区标识为Pk-ID,k=1,2,……,K,将当前的第一存储节点记为存储节点Ni。则本实施例需要根据存储节点Ni的节点标识Ni-ID和K个分区标识Pk-ID分别计算出K个哈希值,记为H(Ni-ID,Pk-ID),其中,H(Ni-ID,Pk-ID)是对存储节点Ni的节点标识Ni-ID和数据分区Pk的节点标识Pk-ID按预定方式计算得到的哈希值。一种示例性的方式是,先计算Ni-ID的哈希值,再计算Pk-ID的哈希值,将两个哈希值拼接在一起,再计算拼接后得到数据的哈希值,得到H(Ni-ID,Pk-ID),3次计算哈希值的方法可以不相同也可以相同。在另一示例中,直接将Ni-ID和Pk-ID拼接在一起,计算拼接后数据的哈希值,得到H(Ni-ID,Pk-ID)。在又一示例中,先计算Ni-ID的哈希值,再计算Pk-ID的哈希值,将两个哈希值拼接在一起作为H(Ni-ID,Pk-ID),这里的算法可以有多种,不再一一列举。
第二步,将当前未分配的数据分区按照对应哈希值的大小顺序排序,得到一个数据分区序列;
在本步骤中,所谓将当前未分配的数据分区按照对应哈希值的大小顺序排序,即是对K个H(Ni-ID,Pk-ID)排序,假定排在第1位的哈希值为H(Ni-ID,P3-ID),这是用数据分区P3的分区标识P3-ID和Ni-ID计算出来的哈希值,则将数据分区P3排在数据分区序列的第1位,假定排在第2位的哈希值为H(Ni-ID,P1-ID),这是用数据分区P1的分区标识P1-ID和Ni-ID计算出来的哈希值,则将数据分区P1排在数据分区序列的第2位,依此类推,可得到上述数据分区序列。
第三步,根据当前的第一存储节点可负载的第一数据分区个数,从排序得到的数据分区序列的头或尾开始,选择相应个数的数据分区分配给当前的第一存储节点。
本步骤完成后,更新第二集合中当前未分配的数据分区,将已分配给当前的第一存储节点的数据分区删除。
步骤230,建立选择的数据分区到相应第一存储节点的路由。
本步骤建立数据分区路由的操作可以在为第一集合中所有第一存储节点选择数据分区之后再执行,对每一个第一存储节点,获取记录的为该第一存储节点选择的数据分区,建立所述选择的路由分区到该第一存储节点的路由。但也可以在为当前的第一存储节点选择数据分区后,就建立选择的数据分区到当前的第一存储节点的路由。
建立数据分区路由可以通过在数据分区路由表中建立数据分区与存储节点的映射关系来完成。按照上述方式,为第一集合中的多个第一存储节点选择数据分区并建立相应的数据分区路由后,即完成了数据分区路由的初始化,得到一张数据分区路由表。
当数据分区包括主分区、第一副本分区和第二副本分区时,可以分别主分区、第一副本分区和第二副本分区作为待选择数据分区集合,按照上述方法分别建立主分区、第一副本分区和第二副本分区到存储节点的路由。
按照本实施例的上述方法,在给定一个第一存储节点集合和待分配的数据分区集合时,可以得到一个唯一的数据分区路由表。
存储系统中增加存储数据分区的存储节点时需要触发数据分区路由的更新,以反映最新的数据分区分布。新增加存储节点后,原有存储节点上的数据分区会被部分移动到新的节点上。
本实施例还提供了一种初始化完成后,存储系统新增存储节点时,重构数据分区路由的方法,原有的存储节点仍称为第一存储节点,新增的存储节点称为第二存储节点,如图5所示,包括:
步骤310,确定重构后原有的第一存储节点可负载的第二数据分区个数,保留相应个数(即第二数据分区个数)的数据分区到所述第一存储节点的路由,删除其他数据分区到所述第一存储节点的路由;
本实施例中,根据所述第一存储节点的负载能力、所有第一存储节点和所有第二存储节点共同组成的第三集合中存储节点的总负载能力及所述数据分区数目,确定重构后所述第一存储节点可负载的第二数据分区个数,具体可以按照实施例一中描述的比例一致的要求来计算。将已分配给所述第一存储节点的数据分区排序,保留排序后的数据分区序列中从头或尾开始的数量为第二数据分区个数的数据分区到所述第一存储节点的路由,删除其他数据分区到所述第一存储节点的路由。
假定原有I个第一存储节点,新增J个第二存储节点,则第三集合中存储节点的总负载能力等于该I个第一存储节点和J个第二存储节点的负载能力之和。在数据分区数目不变时,因为总负载能力提高,根据变化后的总负载能力计算得到的至少部分第一存储节点可负载的第二数据分区个数会减少,因而需要删除部分数据分区到第一存储节点的路由,将被删除路由的这部分数据分区重新分配给新增的存储节点。
将已分配给所述第一存储节点的数据分区排序时,可以根据所述第一存储节点的节点标识及已分配给所述第一存储节点的每一数据分区的分区标识分别计算出一个哈希值,将已分配给所述第一存储节点的数据分区按照对应哈希值的大小顺序排列。但不局限于此。
步骤320,确定重构后新增的第二存储节点可负载的第三数据分区个数,从被删除路由的数据分区中选择相应个数(即第三数据分区个数)的数据分区分配给所述第二存储节点,建立选择的数据分区到所述第二存储节点的路由。
本实施例中,确定重构后所述第二存储节点可负载的第三数据分区个数,包括:根据所述第二存储节点的负载能力、所有第一存储节点和所有第二存储节点共同组成的第三集合中存储节点的总负载能力及所述数据分区数目,确定重构后所述第二存储节点可负载的第三数据分区个数。即也是按照存储节点的负载能力和总负载能力确定存储节点可负载的数据分区的个数,具体可以按照实施例一描述的比例一致的要求来计算。在所述第二存储节点有多个时,本步骤表示每一个第二存储节点均按照上述方式计算出其可负载的第三数据分区个数,但负载能力不同的第二存储节点可负载的第三数据分区个数可以不同。
本实施例中,从被删除路由的数据分区中选择相应个数的数据分区分配给所述第二存储节点,建立选择的数据分区到所述第二存储节点的路由,包括:对所有第二存储节点排序,依次为排序得到的存储节点序列中的第二存储节点选择数据分区,其中,为当前的第二存储节点选择数据分区时,将被删除路由的所有数据分区组成的第四集合中当前未分配的数据分区排序,根据当前的第二存储节点可负载的第三数据分区个数,从排序得到的数据分区序列的头或尾开始,选择相应个数(即第三数据分区个数)的数据分区分配给当前的第二存储节点,并建立选择的数据分区到当前的第二存储节点的路由。本步骤中,存储节点序列中的存储节点是新增的第二存储节点,而待路由数据分区的集合是由被删除路由的数据分区组成,选择数据分区(或者分配数据分区)的方法与初始化时是类似的。
当第二存储节点有多个时,可以按照节点标识的哈希值的大小将多个第二存储节点顺序排列。为当前的第二存储节点选择数据分区时,将被删除路由的所有数据分区组成的第四集合中当前未分配的数据分区排序,也可以根据当前的第二存储节点的节点标识及所述第四集合中当前未分配的每一数据分区的分区标识分别计算出一个哈希值,将所述第四集合中当前未分配的数据分区按照对应哈希值的大小顺序排列。
上述重构方法尽量保持了已有的数据分区到存储节点的路由,因而在数据分区路由变化时,需要迁移的数据量较小。
存储系统中的存储节点减少时,被删除的存储节点上的数据分区将会分配给剩余的存储节点。
本实施例还提供了一种在存储系统删除数据分区时,重构数据分区路由的方法,如图6所示,包括:
步骤410,保留重构前数据分区到剩余的第一存储节点的路由,删除重构前数据分区到被删除的第一存储节点的路由;
步骤420,确定重构后剩余的第一存储节点可负载的第三数据分区个数;
本实施例中,根据剩余的第一存储节点的负载能力、所有剩余的第一存储节点组成的第五集合中存储节点的总负载能力及所述数据分区数目,确定重构后剩余的第一存储节点可负载的第三数据分区个数。具体可以按照实施例一描述的比例一致的要求计算。本步骤描述对第一存储节点的处理时,表示对剩余的每一个第一存储节点均按上述方式计算其可负载的第三数据分区个数。在剩余的第一存储节点有I’个时,第五集合中存储节点的总负载能力等于该I’个第一存储节点的负载能力之和。由于删除存储节点之后,需要将之前路由到被删除存储节点的数据分区分配给剩余的存储节点,因此至少部分剩余存储节点负载的数据分区的个数会增加。
步骤430,计算所述第三数据分区个数比相应的第一数据分区个数多出的数据分区个数,从被删除路由的数据分区中选择相应个数(即多出的数据分区个数)的数据分区分配给所述剩余的第一存储节点,建立选择的数据分区到所述剩余的第二存储节点的路由。
本实施例中,对剩余的第一存储节点排序,依次为排序得到的存储节点序列中的第一存储节点选择数据分区,其中,为当前的第一存储节点选择数据分区时,将被删除路由的所有数据分区组成的第六集合中当前未分配的数据分区排序,从排序得到的数据分区序列的头或尾开始选择ΔC个数据分区,并建立选择的数据分区到当前的第一存储节点的路由,其中,ΔC是当前的第一存储节点可负载的第三数据分区个数减去当前的第一存储节点可负载的第一数据分区个数得到的差值。
本实施例中,在剩余的第一存储节点有多个时,可以按照节点标识的哈希值的大小将剩余的第一存储节点顺序排列。而为当前的第一存储节点选择数据分区时,将第六集合中当前未分配的数据分区排序,可以根据当前的第一存储节点的节点标识及第六集合中当前未分配的每一数据分区的分区标识分别计算出一个哈希值,将第六集合中当前未分配的数据分区按照对应哈希值的大小顺序排列。
上述重构方法也是尽量保持了已有的数据分区到存储节点的路由,因而在数据分区路由变化时,需要迁移的数据量较小。
此外,如果存储节点的资源发生变化,存储节点的负载能力也会发生变化,会发生某些存储节点可负载的数据分区增加了,有些存储节点可负载的数据分区减少了。因而需要触发数据分区路由表重构,重构处理的原则类似增加节点和减少节点。具体可以通过以下方式来实现:
第一步,重新评估每个存储节点负载能力之后,将所有存储节点放到一个集合中,根据每一存储节点负载能力(指新的负载能力)占该集合中所有存储节点的负载能力之和,以及待路由的数据分区数目,重新计算一下每个存储节点可负载的分区个数;
第二步,对可负载的数据分区个数减少的每一存储节点,从路由到该存储节点的数据分区中删除部分数据分区(先排序再选择要删除的数据分区),数量等于该存储节点减少的可负载数据分区的个数,然后将所有被删除的数据分区组成待路由的分区集合;
第三步,对可负载的数据分区个数增加的存储节点,按节点标识的哈希值大小排序,依次对排序得到的存储节点序列中的存储节点选择数据分区,其中,为当前的存储节点选择数据分区时,根据当前存储节点的节点标识和待路由数据分区集合中当前未分配的每一数据分区的分区标识分别计算一哈希值,将当前未分配的数据分区按照对应哈希值的大小排序,然后,选择前C个数据分区或后C个数据分区,建立选择的数据分区到该节点的路由,C是该存储节点增加的可负载分区的个数。
按照本实施例方法利重构数据分区路由后,需要迁移的数据分区少,而且数据迁移时涉及的存储节点的数量最少。
根据本实施例的上述方法可以看到,在存储系统中增加了存储节点而导致重构的数据分区路由表发生变化后,如果存储系统将增加的存储节点删除,则重构的数据分区路由表会回到增加存储节点之的状态。也即在即存储系统中的存储节点相同(负载能力不变)、待路由数据分区数目相同的情况下,得到的数据分区路由表是唯一的,因此本实施例方法满足数据分区路由表具有可逆性的要求。
本实施例的数据分区路由系统和实施例一的数据分区路由系统一样,包括路由初始化模块,路由初始化模块中的负载计算单元与实施例一相同,而如图7所示,路由初始化模块中的路由建立单元包括:
节点排序子单元40,用于将第一集合中的多个第一存储节点排序,得到一存储节点序列;
分区选择子单元50,用于依次为该存储节点序列中的第一存储节点选择数据分区,其中,为当前的第一存储节点选择数据分区时,将所述第二集合中当前未分配的数据分区排序,根据当前的第一存储节点可负载的第一数据分区个数,从排序得到的数据分区序列的头或尾开始,选择相应个数的数据分区分配给当前的第一存储节点
路由建立子单元60,用于建立选择的数据分区到当前的第一存储节点的路由。
本实施例中,
所述节点排序子单元将第一集合中的多个第一存储节点排序,包括:按照节点标识的哈希值的大小将第一集合中的多个第一存储节点顺序排列。
本实施例中,
所述分区选择子单元为当前的第一存储节点选择数据分区时,将所述第二集合中当前未分配的数据分区排序,包括:根据当前的第一存储节点的节点标识及所述第二集合中当前未分配的数据分区的分区标识分别计算出一个哈希值,将所述第二集合中当前未分配的数据分区按照对应哈希值的大小顺序排列。
此外,本实施例的数据分区路由系统还包括用于在存储系统新增存储节点时重构数据分区路由的第一路由重构模块,及用于在存储系统删除存储节点时重构数据分区路由的第二路由重构模块,其中:
所述第一路由重构模块包括:
路由删除单元,用于根据所述第一存储节点的负载能力、所有第一存储节点和所有第二存储节点共同组成的第三集合中存储节点的总负载能力及所述数据分区数目,确定重构后所述第一存储节点可负载的第二数据分区个数,将已分配给所述第一存储节点的数据分区排序,保留排序后的数据分区序列中从头或尾开始的数量为第二数据分区个数的数据分区到所述第一存储节点的路由,删除其他数据分区到所述第一存储节点的路由;
负载计算单元,用于根据所述第二存储节点的负载能力、所述第三集合中存储节点的总负载能力及所述数据分区数目,确定重构后所述第二存储节点可负载的第三数据分区个数;
路由创建单元,用于对所有第二存储节点排序,依次为排序得到的存储节点序列中的第二存储节点选择数据分区,其中,为当前的第二存储节点选择数据分区时,将被删除路由的所有数据分区组成的第四集合中当前未分配的数据分区排序,根据当前的第二存储节点可负载的第三数据分区个数,从排序得到的数据分区序列的头或尾开始,选择相应个数的数据分区分配给当前的第二存储节点,并建立选择的数据分区到当前的第二存储节点的路由。
所述第二路由重构模块包括:
路由删除单元,用于保留重构前的数据分区到剩余存储节点的路由,删除重构前的数据分区到被删除存储节点的路由;
负载计算单元,用于根据剩余的第一存储节点的负载能力、所有剩余的第一存储节点组成的第五集合中存储节点的总负载能力及所述数据分区数目,确定重构后剩余的第一存储节点可负载的第三数据分区个数;
路由创建单元,用于对剩余的第一存储节点排序,依次为排序得到的存储节点序列中的第一存储节点选择数据分区,其中,为当前的第一存储节点选择数据分区时,将被删除路由的所有数据分区组成的第六集合中当前未分配的数据分区排序,从排序得到的数据分区序列的头或尾开始选择ΔC个数据分区,并建立选择的数据分区到当前的第一存储节点的路由,其中,ΔC是当前的第一存储节点可负载的第三数据分区个数减去当前的第一存储节点可负载的第一数据分区个数得到的差值。
本实施例还提供一种数据分区路由装置,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时可实现本实施例方法所述的任何处理。
本实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时可实现本实施例方法所述的任何处理。
本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些物理组件或所有物理组件可以被实施为由处理器,如中央处理器、数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其他存储器技术、CD-ROM、数字多功能盘(DVD)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。