发明内容
本发明的目的在于提供一套基于多级映射的大规模多副本分布式存储系统的应用方法,解决现有技术中存在的大规模分布式存储系统中的数据散列不均衡,不支持副本及节点权重等问题。
为了实现上述目的,本发明采用的技术方案如下:
基于多级映射的大规模多副本分布式存储系统,包括用于存储资源的存储节点集群,分别与该存储节点集群连接的对存储节点集群进行管理的管理节点和根据散列机制获取资源存储位置的客户端,以及连接该管理节点和客户端并接受管理节点管理、为客户端提供散列映射规则的规则节点集群。
具体地说,所述存储节点集群包括至少一个存储节点,规则节点集群包括至少一个规则节点。
基于多级映射的大规模多副本分布式存储系统的应用方法,包括以下步骤:
(a)系统初始化;
(b)客户端检查是否需要更新散列映射规则,如果需要更新,则更新至与规则节点相同的散列映射规则;
(c)客户端通过GUID生成算法确定待上传资源的GUID,并根据GUID结合散列映射规则计算出存储节点位置,将待上传资源存储至存储节点中;;
(d)客户端得到需要获取资源的GUID,并根据散列映射规则计算出需要获取资源的副本对应的存储节点地址,然后由与存储节点地址对应的存储节点查找该需要获取的资源,再向客户端回复查找结果。
进一步地,所述步骤(a)具体包括:
(a1)以初始化方式启动管理节点;
(a2)以初始化方式启动存储节点集群和规则节点集群,且存储节点集群启动完毕之后,管理节点通过与所有存储节点保持大周期心跳,来获取所有存储节点的配置;
(a3)管理节点对散列映射规则进行初始化;
(a4)管理节点根据散列映射规则,依次向存储节点发送当前散列映射规则中的模数及初始化命令,存储节点保存该模数,并进行相应的初始化;
(a5)管理节点将初始化后的散列映射规则发送至规则节点集群,进行规则节点集群存储的散列映射规则的初始化。
其中,所述散列映射规则包括:
第一级:将总资源的GUID空间通过取模运算分散为至少两个存储聚集;
第二级:根据存储节点的权重,确定存储聚集的多个副本在每个存储节点中的分配情况,即定位表。
所述步骤(a3)具体包括:首先,对散列映射规则的第一级进行初始化;
其次,通过管理节点计算或管理者手动设置每个存储节点应该存储的存储聚集比例;最后,根据存储聚集比例,将存储聚集依次按带状分配给存储节点,直到分配完成。
再进一步地,所述步骤(b)的具体方法如下:首先,客户端向规则节点集群中的任一规则节点发送自身缓存的散列映射规则的版本号;其次,规则节点将客户端发来的版本号与自身当前存储的散列映射规则的版本号进行对比,相同,则不更新,反之则向客户端发送更新内容,使客户端完成散列映射规则的更新。
更进一步地,所述步骤(c)的具体方法如下:
(c1)客户端根据GUID生成算法,生成所需存储资源的GUID;
(c2)客户端通过GUID结合散列映射规则计算出该存储资源副本的所有存储节点地址,并随机向其中一个存储节点发起连接,并将该存储节点作为本次上传的发起节点;
(c3)客户端向该发起节点发送所需上传资源的GUID以及该资源所有副本对应的存储节点地址;
(c4)该发起节点与存储资源副本的其他存储节点建立连接,并将GUID发送给这些存储节点;
(c5)当发起节点连接的存储节点数量达到上传的副本数量的最小值时,发起节点则向客户端回复确认信息,客户端开始上传资源,并由发起节点转发给其他存储节点。
另外,所述步骤(c)还包括:步骤(c2)中,当客户端随机向其中一个存储节点发起连接产生错误时,则随即选取另一个重试,如果全部连接错误,则更新规则并回到步骤(c1)重试;步骤(c5)中,当发起节点连接上的存储节点数量没有达到副本数量要求时,则回到步骤(c1)重新生成新的GUID;步骤(c5)中,客户端在上传资源时,如果发起节点失效,则客户端回到步骤(c2)重试,如果其他存储节点失效,则由发起节点判断副本数量是否达标,如果不达标,则回复客户端上传失败并回到步骤(c1)重新生成新的GUID。
更进一步地,所述步骤(d)的具体方法如下:
(d1)客户端得到需要获取的资源的GUID,并据该GUID结合散列映射规则计算出存储该资源的副本的所有存储节点地址;
(d2)客户端随机向其中一个存储节点发起连接;
(d3)客户端向连接上的存储节点发送需要获取的资源的GUID;
(d4)存储节点查找该资源对应的GUID,如果找到对应的GUID,则向客户端回复对应资源的数据,如没有找到对应的GUID,则向客户端回复出错,客户端回到步骤(d2)。
与现有技术相比,本发明具有以下有益效果:
1.本发明通过资源的GUID结合散列映射规则进行运算,得出资源的存储位置,将数据均匀散列在各个存储节点上,使得整个系统不会产生存储热点,进而极大地提升了系统的存储利用率;同时,资源的定位是分布式的在客户端上进行的,不需要系统中的某个专用服务器,因此除去了系统的中心节点,从而为系统的扩展、提高系统伸缩性提供了可实现的基础。
2.本发明中,系统可以很好的接受新的存储节点的加入和退出,新节点的加入可以减轻老旧节点的负载,扩充系统容量,在需要淘汰掉老旧节点时,也可将老旧节点上的数据均匀迁移到其他节点上,不会造成局部热点,且数据的迁移不会影响到数据的可用性,系统规模的扩大,也不会对系统的管理成本造成太多的提高;
3.本发明支持副本机制,系统不会因为存储节点的失效而导致存储在节点上的数据丢失,且在恢复数据的过程中数据仍然可用,这样不仅可以分担用户对同一资源的访问压力,还可以使数据的存储更为可靠;
4.本发明支持节点权重,系统中每个节点都有不同的权重,系统根据各个节点的权重对其负载进行安排,这样有效地保证了系统中每个节点的负载在同一水平上;
5.本发明在支持系统自治的同时给管理员提供了手动控制系统的接口,降低了管理的难度;
6.本发明以极小的客户端存储和初始化代价同时实现了数据的平均散列,系统的高度扩展,内容的快速定位等,性价比很高。
具体实施方式
下面结合附图和实施例对本发明作进一步说明,本发明的实施方式包括但不限于下列实施例。
实施例1
如图1所示,基于多级映射的大规模多副本分布式存储系统,包括用于存储资源的存储节点集群,分别与该存储节点集群连接的对存储节点集群进行管理的管理节点和根据散列机制获取资源存储位置的客户端,以及连接该管理节点和客户端并接受管理节点管理、为客户端提供散列映射规则的规则节点集群。
以下为对系统中各部分的详细说明:
存储节点集群,由所有的存储节点构成,系统中的所有资源都存储在该集群中的存储节点上,存储节点和管理节点之间维持大周期1分钟以上的心跳,以汇报自身情况,即磁盘使用情况及当前压力,并接受管理节点统一管理。
规则节点集群,由所有的规则节点构成,每个规则节点都保存有当前系统的最新映射存储规则,该集群负责响应客户端更新规则的请求,并接受管理节点的统一管理,当管理节点对规则进行更新之后,其会以版本更新的方式通知所有的规则节点更新规则,作为优选:对规则集群采用DNS重定位或者反向路由的方式进行访问,以分散压力。
管理节点,该节点是系统的中心控制节点,作为优选:我们采用双机热备的方法,防止单点失效的发生,虽然该节点是系统的中心,但其只与存储节点维持大周期的心跳,并不对外服务,因此其压力非常小,其可以通过自动,或管理员手动的方式,对系统的负载均衡进行总体的控制,并在每次对系统的负载作出调整后,通知规则节点集群进行规则更新。
客户端通过资源的全局唯一标识符GUID结合散列映射规则进行运算,得到资源的具体存储位置,对资源进行访问,客户端会缓存规则,只有在其没有规则或定位资源出现错误时,客户端才会向规则集群更新规则。
具体地说,上述散列映射规则分为两级,第一级规则将GUID空间通过取模运算分散为数量较少的、较为平均的多个存储聚集;第二级规则是一张定位表,行代表存储聚集的索引号,每行有多列,每列对应一个存放存储聚集副本的存储节点。
第一级散列映射规则可以表示为以下形式:
其中B为存储聚集的集合,K为任意初始值,n为2的指数,I为资源的GUID的集合,资源的GUID通过取模运算规则,被分散为
个存储聚集,存储聚集是资源的GUID的集合,存储聚集x表示为以下形式:
作为优选,我们建议选用较好的GUID生成算法,使分配到存储聚集的资源数量更为平均,而资源的均匀分配也能更好的达到负载均衡。
如图2所示,第二级规则为一张定位表,图中令每个存储聚集的副本数为2,其中K=1,n=1,因此模数为2,该定位表有2行,bx代表存储聚集x,d x代表存储节点x的地址。
进一步地,定义在该散列映射规则上的运算有两种,存储聚集变换运算和存储聚集扩展运算。
存储聚集变换运算作用在上述散列映射规则的第二级规则的定位表上,该运算的语义为:将某个存储节点上的某个存储聚集迁移到另一个存储节点上,表现为第二级规则中定位表的变化为:将某个存储聚集索引号所对应的某个副本的地址从一个值更新为另一个值。如图2和图3所示,该运算的效果为:将1号存储聚集在d 4上的副本迁移到了d 2上。
存储聚集扩展运算主要作用在上述散列映射规则的第一级规则上,因两级规则的依赖关系,第二级规则也会随第一级规则的变化相应变化,该运算的语义为:将每个存储聚集一分为二,以达到增加存储聚集数量,缩小单个存储聚集大小的目的,表现为第一级规则n值的递增,以及第二级规则中对应表的扩展。
第一级规则中n值的递增表明了模数的翻倍。模数翻倍后,以前的每个存储聚集都变为了两个。令存储聚集为x,其在通过该运算前的集合表示为:
在通过该运算后变为如下两个集合:
这里:
通过该方法,原来的存储聚集x被划分为了互不相交的两个存储聚集,且保存在原来的存储节点上。
如图2、4所示,随着第一级规则中模数的翻倍,第二级规则中的对应表需要进行扩展,根据以上的集合表示,可很容易构造出扩展后的对应表。
通过上述两级,可以充分的发挥散列映射规则的灵活性,以达到系统负载均衡的目的。当某个存储节点负载较重时,可以手动或自动对系统施加存储聚集变换,将其上的某个存储聚集迁移到负载较轻的存储节点上;如该存储节点上只剩下一个存储聚集,可以先执行存储聚集扩展,将存储聚集变为多个之后再执行存储聚集变换。
以上规则有一个限制,即某个存储聚集的两个副本不能存储在同一个存储节点上,在散列映射规则上不能做到这个限制,因此需要在算法上加以实现。
由于散列映射规则的体积会随着系统规模的扩大而增大,为了尽可能的减少客户端在更新散列映射规则时的等待时间,提升用户体验,采用如下两种策略:
策略一,客户端对散列映射规则的更新采用基于版本的增量更新策略,只有在客户端并没有缓存规则或缓存的规则过于老旧时,进行散列映射规则的全量更新,尽可能的减少传输量,以加快散列映射规则更新速度,降低散列映射规则节点集群的压力。
策略二,首先,在对应表中,存储节点的地址使用IP二进制表示法,以压缩散列映射规则本身的体积,另外,在进行全量更新时,散列映射规则需要经过压缩,以减少传输过程的耗费。
此外,散列映射规则的每次更新,均只改变系统中极少量的定位信息,大部分定位信息仍然可以使用,系统并不需告知客户端更新散列映射规则,客户端只需要在感知到散列映射规则失效之后,对其进行更新即可。
在不考虑网络分区的情况下,上述基于多级映射的大规模多副本分布式存储系统的应用方法,从整体上看包括以下几个步骤:
(a)系统初始化;
(b)客户端检查是否需要更新散列映射规则,如果需要更新,则更新至与规则节点相同的散列映射规则;
(c)客户端通过GUID生成算法确定待上传资源的GUID,并根据GUID和散列映射规则计算出存储节点位置,将待上传资源存储至存储节点之中;
(d)客户端得到需要获取资源的GUID,并根据散列映射规则计算出需要获取资源的副本对应的存储节点地址,然后由与存储节点地址对应的存储节点查找该需要获取的资源,再向客户端回复查找结果。
下面对上述整体步骤进行一一说明。
(一)系统初始化,具体步骤如下:
(1)以初始化方式启动管理节点的主机和备机,此时,散列映射规则的模数为0;
(2)以初始化方式启动存储节点集群和规则节点集群,此时,所有存储节点上没有存储聚集,规则节点上的模数为0,版本为0,在存储节点启动完成时,管理节点会收到所有存储节点的心跳,得到整个系统中存储节点的配置,以反映其能力;
(3)管理员初始化系统中第一级规则的K值和n值,并让管理节点针对系统中每个存储节点的能力即权重,计算出合理的存储聚集分配情况,即对应表,对应表也可以由管理员手动设置;
对应表的初始化算法如下:
(1)计算系统中所有存储节点的权重,并得到权重总和,权重的算法可根据磁盘空间、CPU、网卡等的配置计算;
(2)用每个存储节点的权重除以总权重得到该存储节点应该存储的存储聚集比例;
(3)根据存储节点应该存储的存储聚集比例,将所有存储聚集的副本依次按带状分配给存储节点,在每次分配时,避免在同一个存储节点上放置一个存储聚集的多个副本,直到分配完成;
(4)管理员令管理节点根据得到的两级散列映射规则的信息,对系统进行初始化,管理节点根据对应表的设置,依次向存储节点发送当前的映射中的模数及存储聚集初始化的命令,存储节点保存该模数,并初始化对应的存储聚集,每个存储聚集的初始序列号在这里被设置为0;
(5)管理节点向规则节点集群发送初始化规则,规则节点集群将版本号自增,在初始化规则完成后,系统开始对外服务;
(二)客户端检查是否需要更新散列映射规则,如果需要更新,则更新至与规则节点相同的散列映射规则。客户端内散列映射规则的更新步骤如下:
(1)客户端向规则节点集群中的任一规则节点发送自身缓存规则的版本号,如果自身一开始没有规则的缓存,发送版本号0;
(2)规则节点将客户端发来的版本号与自身最新的版本号进行对比,如果该版本号为0,表明客户端没有规则,需要全量更新,如果该版本号过于老旧,也应该全量更新,其他情况下,使用增量更新,全量更新发送压缩后的散列映射规则以及最新版本号,增量更新发送两个版本之间的变化序列以及最新版本号,判断版本过于老旧的算法须结合具体实现进行优化;
(3)客户端接收到回复之后,或者将全量规则解压进行缓存,或者利用规则节点发来的变化序列更新本地缓存规则;
(三)客户端通过GUID生成算法和散列映射规则确定待上传资源的GUID,并将待上传资源存储至存储节点之中,具体如下:
(1)客户端根据GUID生成算法,生成所需存储资源的GUID;
(2)客户端通过GUID结合散列映射规则计算出资源的副本应该被存储的存储节点地址,并随机向其中一个存储节点发起连接,该存储节点作为本次上传的发起节点,当发起节点连接无误时,客户端向发起节点发送其需要上传资源的GUID以及该资源的所有副本对应的所有存储节点地址,当发起节点连接错误时,随机选取另一个存储节点重试,如果全部存储节点都连接错误,则更新规则并回到步骤(1)重新生成新的GUID;
(3)发起节点和与其对应的其他存储节点建立连接,并将GUID发送给与其对应的其他存储节点,所有存储节点都进行GUID和模数的取模运算,得到一个存储聚集号,并将该存储聚集号与自身所有的存储聚集号进行比较,验证客户端定位的准确性;
(4)如果连接上的存储节点数量达到上传的副本数量的最小值,且所有对应的存储节点确认定位准确,发起节点则向客户端回复确认信息,客户端开始上传资源,并由发起节点转发给其他存储节点,如果对应的存储节点定位不准确,则客户端更新规则到步骤(2);在上传过程中,如果发起节点失效,客户端回到步骤(2)重试,如果其他存储节点失效,则由发起节点判断副本数量是否达标,如果不达标,回复客户端上传失败并回到步骤(1)重新生成新的GUID;
(5)客户端上传完最后一段数据时,发起节点告知其他存储节点上传完成,其他存储节点均将当前存储聚集的存储序列号自增并回复给发起节点,发起节点得到所有序列号并选取其中最大的,作为该资源在存储聚集中的序列号,并发送给其他存储节点,存储节点接收该序列号并更新存储聚集保存的序列号,为该资源打上该序列号标签,并向发起节点回复确认;
(6)发起节点在收到超过要求副本数量的确认之后,回复客户端上传成功,如没有收到超过要求副本数量的确认,则向客户端回复上传失败,进行资源删除。
在该上传过程中,出现不能恢复的错误时,发起节点只需要断开和其他存储节点的连接即可,存储节点感知到连接异常断开也只需直接删除掉该资源即可,序列号有两个作用,一个是作为资源是否上传完成的标识,用于垃圾清理,另一个是使各个存储聚集副本中的资源维持相同的单调不减序列,便于在存储节点出错时进行增量恢复。
(四)客户端得到需要获取资源的GUID,并计算出需要获取资源的副本对应的存储节点地址,然后由与存储节点地址对应的存储节点查找该需要获取的资源,再向客户端回复查找结果。具体步骤如下:
(1)客户端得到需要获取的资源的GUID,并据该GUID结合散列映射规则计算出资源的副本应该被存储的存储节点地址;
(2)客户端随机向其中一个存储节点发起连接,当发起连接错误时,随机选取另一个存储节点重试,如果全部都连接错误,更新规则并回到步骤(1)重试;
(3)客户端向连接上的存储节点发送需要获取的资源的GUID,存储节点进行GUID和模数的取模运算,得到一个存储聚集号,并将该存储聚集号与自身所有的存储聚集号进行比较,以验证客户端定位的准确性,当存储节点发现客户端定位错误时,回绝客户端请求,并告知规则过期,客户端更新规则后回到步骤(1)重试;
(4)在通过验证之后,存储节点在对应存储聚集中查找该对应资源的GUID,如找到相应的GUID,则向客户端回复对应资源的数据;如没有找到相应的GUID,则向客户端回复出错,客户端回到步骤(2)。
以上述应用方法为基础,本发明还提供了相应的故障恢复方法,流程如下:存储节点向规则节点集群获取规则,找到保存该存储聚集副本的其他存储节点,向这些存储聚集确认对应GUID的存在情况,如发现该GUID确认存在,则向其他存储节点获取该资源,如不存在,则结束会话。
按照上述实施例,便可很好地实现本发明。