CN105657064A - 基于虚拟节点存储优化的Swift负载均衡方法 - Google Patents
基于虚拟节点存储优化的Swift负载均衡方法 Download PDFInfo
- Publication number
- CN105657064A CN105657064A CN201610171589.0A CN201610171589A CN105657064A CN 105657064 A CN105657064 A CN 105657064A CN 201610171589 A CN201610171589 A CN 201610171589A CN 105657064 A CN105657064 A CN 105657064A
- Authority
- CN
- China
- Prior art keywords
- dummy node
- grouping
- dummy
- node
- classification
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/1097—Protocols in which an application is distributed across nodes in the network for distributed storage of data in networks, e.g. transport arrangements for network file system [NFS], storage area networks [SAN] or network attached storage [NAS]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/1001—Protocols in which an application is distributed across nodes in the network for accessing one among a plurality of replicated servers
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/1001—Protocols in which an application is distributed across nodes in the network for accessing one among a plurality of replicated servers
- H04L67/1004—Server selection for load balancing
- H04L67/1008—Server selection for load balancing based on parameters of servers, e.g. available memory or workload
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/50—Network services
- H04L67/56—Provisioning of proxy services
- H04L67/566—Grouping or aggregating service requests, e.g. for unified processing
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D30/00—Reducing energy consumption in communication networks
- Y02D30/50—Reducing energy consumption in communication networks in wire-line communication networks, e.g. low power modes or reduced link rate
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种基于虚拟节点存储优化的Swift负载均衡方法,该方法可以动态均衡云存储服务组件Swift中各存储服务器的负载。与传统负载均衡方法不同的是,该方法既非单一的全局负载均衡,也非单一的局部负载均衡,而是通过采用分组、合并的机制,实现全局和局部相结合的动态负载均衡。该方法既能保证云存储系统的负载保持平衡状态,提升存储资源的利用率,又能提高云存储系统的存取效率,更加适用于大规模、分布式云存储服务需求。
Description
技术领域
本发明涉及一种基于虚拟节点存储优化的Swift负载均衡方法,该方法可以用于实现大规模、分布式的存储系统,属于互联网技术领域。
背景技术
Swift是开源云计算平台OpenStack中的云存储服务组件,是目前业界非常重要的一种云存储解决方案。Swift的对象存取策略主要采取两层映射机制,该机制在对象与存储服务器之间增加一个虚拟节点层,一起形成两层映射:(1)对象层与虚拟节点层之间的映射,该映射主要通过一致性哈希算法完成;(2)虚拟节点层与存储服务器层之间的映射,该映射主要根据存储服务器的物理位置,将虚拟节点分散地分布于服务器集群中。其中第一层映射较为复杂,也是影响整个Swift存取性能的关键。在两层映射关系下,Swift中对象的存取过程如图1所示,主要分为两步:第一步,利用哈希函数对请求中的对象进行哈希,根据哈希计算的结果找到对应的虚拟节点;第二步,根据第二层映射找到该虚拟节点对应的存储服务器,进而完成对象的存储或读取。
一致性哈希算法(ConsistentHash)在Swift存取过程中起到非常重要的作用,其原理如图2所示:该算法维护一个逻辑环(Ring环),它可视为一个环形的Hash空间,对象和虚拟节点都将映射到此Hash空间中。当有存储对象的请求到来时,利用哈希函数将对象映射到环上某一点,并以该位置为起点,沿环顺时针方向遇到的第一个虚拟节点为该对象所对应的虚拟节点。如图2所示,对象Object2在环上的位置是L2,则Object2映射到虚拟节点Vnode3。Swift将虚拟节点均匀地分布在Ring环上,确保每个虚拟节点可存储的对象个数相等。但是,由于每个对象所占存储空间大小存在差异,所以这样做并不能保证存储服务器的空间利用率负载均衡。此外,当在Ring环上顺时针方向遇到的第一个虚拟节点不满足存储条件时,Swift将继续沿顺时针方向直至找到合适的虚拟节点为止,最坏情况下将绕环一周,影响对象的存取效率。
由于Swift存储对象具有随机性,并且不同存储服务器的性能不同,为了避免因存储服务器负载不均而使个别存储服务器出现存储瓶颈,Swift在存储对象时需要对各存储服务器进行负载均衡。实现负载均衡的关键在于,如何以尽可能小的开销来平衡各服务器的负载,从而提高存储系统的资源利用率。从Swift存储的负载均衡需求来看,目前已有的一些动态负载均衡方法,在效率、可扩展性和性能等方面仍存在欠缺。例如,基于加权最小连接(weightedleast-connections)的方法,用权值来反映各服务器间的性能差异,并采用请求的连接数作为衡量负载量的标准,在分配请求时尽可能使服务器的连接数与性能权值成比例,但该方法并没有考虑请求之间的差异。而基于双加权最小连接的方法虽然考虑了请求之间的差异,并因此增加了表示请求的权值,但该方法对于Swift而言,由于比较次数过多,致使效率较低。
发明内容
发明目的:针对现有技术中存在的问题与不足,本发明提供一种基于虚拟节点存储优化的Swift负载均衡方法。该方法综合考虑了存储服务器的性能差异和对象所占空间的大小差异,通过采用分组、合并的机制,可实现全局和局部相结合的动态负载均衡,提升云存储系统的资源利用率和提高云存储系统的存取效率,更加适用于大规模、分布式云存储服务需求。
技术方案:一种基于虚拟节点存储优化的Swift负载均衡方法,包括如下步骤:
(1)与虚拟节点相关参数的初始化。为了达到存储负载均衡的效果,Swift存储系统需要记录虚拟节点的相关参数,包括虚拟节点的相对空闲度、虚拟节点所属类别、虚拟节点类别链表、虚拟节点的组别数、虚拟节点所属组别号等。在Swift存储系统开始运行时,需要对这些参数进行初始化。
(2)对象的存储过程。该过程将主要根据系统中虚拟节点是否已经进行过分组,而分情况实施。若系统中虚拟节点尚未进行过分组,紧接着判断采用虚拟节点分组时间点判别方法,判断当前时刻是否需要对虚拟节点进行分组。如果无需分组,直接进行对象存储;如果需要分组,则先按照虚拟节点的分组过程对虚拟节点进行分组。一旦系统中虚拟节点进行过分组,判断对象被映射到的分组是否能够存储该对象。如果能够存储,将对象存储在合适的存储服务器;否则,先按照分组合并过程将对象被映射到的分组与另一个分组进行合并,然后在合并后的分组中完成对象存储。
(3)对象的检索过程。当系统收到读取某一对象的请求时,首先根据Swift中的Ring环找到该对象对应的虚拟节点,然后查询该虚拟节点所对应的存储服务器。如果在存储服务器中找到所请求的对象,则直接读取;否则,先找出该虚拟节点所在的分组,然后遍历分组内所有虚拟节点对应的存储服务器,直至找到所请求的对象。
第一,与虚拟节点相关的参数及其计算。本方法在实现负载均衡时的主要依据是与虚拟节点有关的一些参数,这些参数主要包括:虚拟节点的相对空闲度、虚拟节点所属类别、虚拟节点类别链表、虚拟节点的组别数、虚拟节点所属组别号等。
虚拟节点的相对空闲度。假定Ring环上共有n个虚拟节点,以其中一个虚拟节点为起始点,顺时针进行编号为虚拟节点0、虚拟节点1、…、虚拟节点n-1,则编号为i(0≤i≤n-1)的虚拟节点Vni的相对空闲度RFi是指其剩余空间占总存储空间的百分比,取值范围为区间[0%,100%]。具体采用公式1进行计算:
其中,表示编号为i的虚拟节点Vni的存储空间大小,mi表示编号为i的虚拟节点目前已存储的对象个数,Mj表示编号为i的虚拟节点存储的第j(0≤j≤mi)个对象的大小。当编号为i的虚拟节点新增一个大小为a的存储对象时,则其相对空闲度RFi采用公式2进行更新:
相对空闲度反映了虚拟节点的存储负载状态,相对空闲度高代表负载高,相对空闲度低则代表负载低。同时,用长度为n的数组Vnode_left_percentage来记录Ring环上n个虚拟节点的相对空闲度,其中Vnode_left_percentage[i]表示编号为i的虚拟节点的相对空闲度,初始化时将该数组所有元素初值设为100%。
虚拟节点所属类别。它是在对虚拟节点进行分组时的重要参考因素,区分类别的基础是虚拟节点的相对空闲度。假定类别数目为cn(此处以cn=10为例),首先将相对空闲度取值区间[0%,100%]划分成cn个等间隔的子区间,得到10个子区间(90%,100%]、(80%,90%]、(70%,80%]、(60%,70%]、…、[0%,10%],记为子区间9、子区间8、子区间7、…、子区间0。相对空闲度落在同一子区间中的所有虚拟节点视为同一类别,则总共得到10个类别,记为类别9、类别8、类别7、…、类别0。用长度为cn(此处cn=10)的数组Vnode_counts_by_key来记录属于某一类别的虚拟节点个数,如Vnode_counts_by_key[0]代表类别0(对应子区间[0%,10%])的虚拟节点个数。该数组在初始化时Vnode_counts_by_key[cn-1]=n,其余数组元素全为0。
虚拟节点类别链表。用10个链表List0,List1,…,List9存储属于对应类别号下的所有虚拟节点编号。在初始化时,List9中存储虚拟节点编号0、1、2、…、n-1(表示初始时所有虚拟节点都属于类别9),其他9个链表均初始化为空表。
虚拟节点的组别数。对虚拟节点进行分组的原则是:保证每个分组中虚拟节点所属的类别尽可能最多,同时每个类别在所有分组中只能出现一次。虚拟节点的组别数gn表示所有虚拟节点的当前分组总数,在初始时其值设为0,表示初始时尚未进行虚拟节点分组。当前的所有gn个组别记为分组0、分组1、…、分组gn-1,并且用VNG0、VNG1、…、VNGgn-1表示属于这些分组的虚拟节点编号集合(集合中元素是虚拟节点的编号)。
虚拟节点所属组别号。用长度为n的数组Vnode_map记录各虚拟节点所属的组别号,Vnode_map[i]代表编号为i的虚拟节点所属的组别号。该数组在初始化时将所有元素置为-1。
第二,判别对虚拟节点进行分组的时间点。存储系统并不需要一开始就对虚拟节点进行分组,因为在初始状态时虚拟节点的相对空闲度都为100%,此时可认为虚拟节点的负载量是均衡的(所有虚拟节点的负载量都为0)。随着存储对象的不断增加,虚拟节点的相对空闲度会逐渐发生变化,为了使多个虚拟节点实现负载均衡,需要在一定条件下对虚拟节点进行分组。确定虚拟节点分组时间点的标准是:保证每个分组至少包含两种类别的虚拟节点,并且在同一分组中属于一种类别的虚拟节点只有1个。
在系统开始运行后的短期内,所有虚拟节点的相对空闲度值将集中在子区间(90%,100%],即所有虚拟节点都属于类别9,此时也不满足虚拟节点分组时间点的鉴别标准。所以,对虚拟节点进行分组只会发生在系统运行一段时间之后,具体采用如下方法判别对虚拟节点进行分组的合理时间点:
(21)创建与Vnode_counts_by_key相同的数组Vnode_counts_by_key_bk,将当前Vnode_counts_by_key中的值复制到Vnode_counts_by_key_bk中。
(22)遍历数组Vnode_counts_by_key_bk,选出非零的最小值Min_count,然后将Vnode_counts_by_key_bk中所有非零元素都减去Min_count。
(23)若此时数组所有元素都为0,则返回True,结束;若此时数组只有一个元素不为0,其余都为0,则返回False,结束;否则转至步骤(22)。
若上述步骤(23)返回True,表示当前时刻是对虚拟节点进行分组的时间点,则按照以下的虚拟节点分组过程进行分组;若返回False,则意味着当前时刻不需要为虚拟节点分组。
第三,虚拟节点的分组过程。一旦当前时刻被判定为虚拟节点分组时间点,就需要对虚拟节点进行分组。分组的具体过程如下:
(31)定义长度为cn(此处cn=10)的布尔型数组CBool,其10个元素均初始化为0。
(32)从数组Vnode_counts_by_key中选出非零最小值,赋给临时变量mc;同时对于该数组中每一个值非零的元素所对应的类别j(0≤j≤cn-1),设置CBool[j]=1。
(33)建立mc个字典结构Ggn,Ggn+1,…,Ggn+mc-1,它们代表新增加的mc个分组。每个字典结构包含多个字典元素,每个字典元素是一个“key(键):value(值)”对,其中键为类别号,值为与该类别号对应的虚拟节点类别链表。
(34)遍历布尔型数组CBool,对于其中每一个值为1的数组元素CBool[k],进行如下操作:首先建立mc个字典元素DE(k,0),DE(k,1),…,DE(k,mc-1);然后从虚拟节点类别链表Listk中依次取出mc个虚拟节点编号,不妨记为Vn0、Vn1、…Vnmc-1,将它们分别加入字典元素DE(k,0),DE(k,1),…,DE(k,mc-1)中,即在每个字典元素的虚拟节点编号链表中加入1个虚拟节点编号;最后将这mc个字典元素对应加入到mc个字典结构Ggn,Ggn+1,…,Ggn+mc-1中,即把编号为Vnt(0≤t≤mc-1)的虚拟节点加入新的分组gn+t,同时对数组Vnode_map进行更新,Vnode_map[Vnt]=gn+t。
(35)对数组Vnode_counts_by_key进行更新,使该数组中所有非零元素的值都减去mc。
(36)对虚拟节点组别数gn进行更新,gn=gn+mc。
(37)若此时Vnode_counts_by_key数组中元素不全为0,则跳转至步骤(32);否则,结束分组,同时保存由gn个字典结构组成的集合G={G0,G1,…,Ggn-1},它的元素包含了gn个分组的信息。
第四,分组合并过程。随着Swift存储系统中所存储的对象不断增多,可能会出现某个分组内所有虚拟节点的相对空闲度都比较低的情况,这意味着该分组的负载已经很高。这时,需要在所有分组中选出一个负载较低的分组,与该分组进行合并。假定在当前时刻,分组m(0≤m≤gn-1,该分组由字典结构Gm描述,对应虚拟节点编号集合VNGm)需要与另一个分组进行合并,具体方法如下:
(41)遍历除分组m外的所有分组,找出其中包含有当前相对空闲度最大的虚拟节点的一个分组k(0≤k≤gn-1且k≠m)。
(42)将分组m中的所有虚拟节点都加入分组k,相对应地将字典结构Gm中所有字典元素并入字典结构Gk。在并入时,若两个字典元素的key(键)值相同,则只保留一个字典元素,并且需要将它们的value(值)部分进行合并。
(43)删除Gm,并将组别号大于m的所有分组的组别号减去1,同时对数组Vnode_map中虚拟节点所属组别号进行对应更新。
(44)最后对虚拟节点组别数gn进行更新,gn=gn-1。
第五,对象的存储过程。该过程将主要根据系统中虚拟节点是否已经进行过分组,而分情况实施。假定待存储对象大小为Obj_size,对象存储具体过程如下:
(51)通过哈希函数将待存储对象映射到Ring环上的位置Loc,从位置Loc开始沿Ring环以顺时针方向寻找第一个虚拟节点,不妨记为Vnt(0≤t≤n-1)。
(52)根据gn是否大于0,判断系统中虚拟节点是否已经进行过分组,若是,转至步骤(56);否则,转至步骤(53)。
(53)采用虚拟节点分组时间点判别方法,判断当前时刻是否需要对虚拟节点进行分组,若是,则转至步骤(55);否则,转至步骤(54)。
(54)将对象直接存储在虚拟节点Vnt对应的存储服务器中,转至步骤(510)。
(55)按照虚拟节点的分组过程对虚拟节点进行分组。分组结束之后,虚拟节点Vnt被分配到某一分组(该分组由相应的字典结构描述,并有对应的虚拟节点编号集合)。
(56)假定虚拟节点Vnt属于分组m,即Vnt∈VNGm。为简便计,将数组Vnode_left_percentage简记为VNLP,采用公式3进行判断:
若公式3取值为True,则将该对象存储在Vnt对应的存储服务器中,结束;若公式3取值为False,转至步骤(57)。
(57)在分组m中寻找虚拟节点Vnj,满足之后判断是否成立。若成立,则将对象存储在Vnj对应的存储服务器中,转至步骤(510);否则转至步骤(58)。
(58)按照分组合并过程选取分组k与分组m进行合并,假定合并之后得到分组s(0≤s≤gn-1,该分组由字典结构Gs描述,对应虚拟节点编号集合VNGs)。
(59)在分组s中寻找虚拟节点Vnk,满足将对象存储在Vnk对应的存储服务器中。
(510)由于对象被存储到虚拟节点中,需要重新计算该虚拟节点的相对空闲度。如果因为相对空闲度改变而引起虚拟节点类别变化,将该虚拟节点从它当前所在的类别链表中移除,并加入到新类别所对应的类别链表中。结束。
第六,对象的检索过程。在存储系统中对一个对象进行检索的具体过程如下:
(61)通过哈希函数将待检索对象映射到Ring环上的位置Loc,从位置Loc开始沿Ring环以顺时针方向寻找第一个虚拟节点,不妨记为Vnt(0≤t≤n-1)。
(62)查询虚拟节点Vnt所对应的存储服务器,若它存储了该对象,则该对象被检索到,结束;否则,转至步骤(63)。
(63)该对象一定存储在Vnt所属分组的其他虚拟节点对应的存储服务器中。假定虚拟节点Vnt属于分组m,即Vnt∈VNGm。遍历集合VNGm内所有虚拟节点,查询它们所对应的存储服务器,直到找到对象,结束。
有益效果:本发明与现有技术相比,具有以下优点:
1.保持了Swift原有存取机制的优良扩展性和分散性,可保证Swift存储系统在运行过程中不但各组内保持负载均衡,而且各组之间也保持负载均衡。
2.采取对虚拟节点进行分组的方法,将存储系统负载均衡的处理规模从针对所有虚拟节点,缩减至主要针对每个分组内的虚拟节点。
3.当有存储对象的请求到来时,若首选虚拟节点不满足存储条件,也不需要绕环寻找,而只需在组内寻找合适的节点。
4.采取全局和局部相结合的动态负载均衡方法,充分提高云存储系统的存取效率,尤其适用于大规模、分布式云存储服务需求。
附图说明
图1是Swift的对象存取过程;
图2是采用一致性哈希将对象映射到Ring环上虚拟节点的原理;
图3是对虚拟节点分组时间点进行判别的流程示例图;
图4是对虚拟节点进行分组的流程示例图。
具体实施方式
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
基于虚拟节点存储优化的Swift负载均衡算法,包括:
第一,与虚拟节点相关的参数及其计算。本方法在实现负载均衡时的主要依据是与虚拟节点有关的一些参数,这些参数主要包括:虚拟节点的相对空闲度、虚拟节点所属类别、虚拟节点类别链表、虚拟节点的组别数、虚拟节点所属组别号等。
虚拟节点的相对空闲度。假定Ring环上共有n个虚拟节点,以其中一个虚拟节点为起始点,顺时针进行编号为虚拟节点0、虚拟节点1、…、虚拟节点n-1,则编号为i(0≤i≤n-1)的虚拟节点Vni的相对空闲度RFi是指其剩余空间占总存储空间的百分比,取值范围为区间[0%,100%]。具体采用公式1进行计算:
其中,表示编号为i的虚拟节点Vni的存储空间大小,mi表示编号为i的虚拟节点目前已存储的对象个数,Mj表示编号为i的虚拟节点存储的第j(0≤j≤mi)个对象的大小。当编号为i的虚拟节点新增一个大小为a的存储对象时,则其相对空闲度RFi采用公式2进行更新:
相对空闲度反映了虚拟节点的存储负载状态,相对空闲度高代表负载高,相对空闲度低则代表负载低。同时,用长度为n的数组Vnode_left_percentage来记录Ring环上n个虚拟节点的相对空闲度,其中Vnode_left_percentage[i]表示编号为i的虚拟节点的相对空闲度,初始化时将该数组所有元素初值设为100%。
虚拟节点所属类别。它是在对虚拟节点进行分组时的重要参考因素,区分类别的基础是虚拟节点的相对空闲度。假定类别数目为cn(此处以cn=10为例),首先将相对空闲度取值区间[0%,100%]划分成cn个等间隔的子区间,得到10个子区间(90%,100%]、(80%,90%]、(70%,80%]、(60%,70%]、…、[0%,10%],记为子区间9、子区间8、子区间7、…、子区间0。相对空闲度落在同一子区间中的所有虚拟节点视为同一类别,则总共得到10个类别,记为类别9、类别8、类别7、…、类别0。用长度为cn(此处cn=10)的数组Vnode_counts_by_key来记录属于某一类别的虚拟节点个数,如Vnode_counts_by_key[0]代表类别0(对应子区间[0%,10%])的虚拟节点个数。该数组在初始化时Vnode_counts_by_key[cn-1]=n,其余数组元素全为0。
虚拟节点类别链表。用10个链表List0,List1,…,List9存储属于对应类别号下的所有虚拟节点编号。在初始化时,List9中存储虚拟节点编号0、1、2、…、n-1(表示初始时所有虚拟节点都属于类别9),其他9个链表均初始化为空表。
虚拟节点的组别数。对虚拟节点进行分组的原则是:保证每个分组中虚拟节点所属的类别尽可能最多,同时每个类别在所有分组中只能出现一次。虚拟节点的组别数gn表示所有虚拟节点的当前分组总数,在初始时其值设为0,表示初始时尚未进行虚拟节点分组。当前的所有gn个组别记为分组0、分组1、…、分组gn-1,并且用VNG0、VNG1、…、VNGgn-1表示属于这些分组的虚拟节点编号集合(集合中元素是虚拟节点的编号)。
虚拟节点所属组别号。用长度为n的数组Vnode_map记录各虚拟节点所属的组别号,Vnode_map[i]代表编号为i的虚拟节点所属的组别号。该数组在初始化时将所有元素置为-1。
第二,判别对虚拟节点进行分组的时间点。存储系统并不需要一开始就对虚拟节点进行分组,因为在初始状态时虚拟节点的相对空闲度都为100%,此时可认为虚拟节点的负载量是均衡的(所有虚拟节点的负载量都为0)。随着存储对象的不断增加,虚拟节点的相对空闲度会逐渐发生变化,为了使多个虚拟节点实现负载均衡,需要在一定条件下对虚拟节点进行分组。确定虚拟节点分组时间点的标准是:保证每个分组至少包含两种类别的虚拟节点,并且在同一分组中属于一种类别的虚拟节点只有1个。
在系统开始运行后的短期内,所有虚拟节点的相对空闲度值将集中在子区间(90%,100%],即所有虚拟节点都属于类别9,此时也不满足虚拟节点分组时间点的鉴别标准。所以,对虚拟节点进行分组只会发生在系统运行一段时间之后,具体采用如下方法判别对虚拟节点进行分组的合理时间点:
(21)创建与Vnode_counts_by_key相同的数组Vnode_counts_by_key_bk,将当前Vnode_counts_by_key中的值复制到Vnode_counts_by_key_bk中。
(22)遍历数组Vnode_counts_by_key_bk,选出非零的最小值Min_count,然后将Vnode_counts_by_key_bk中所有非零元素都减去Min_count。
(23)若此时数组所有元素都为0,则返回True,结束;若此时数组只有一个元素不为0,其余都为0,则返回False,结束;否则转至步骤(22)。
若上述步骤(23)返回True,表示当前时刻是对虚拟节点进行分组的时间点,则按照以下的虚拟节点分组过程进行分组;若返回False,则意味着当前时刻不需要为虚拟节点分组。
第三,虚拟节点的分组过程。一旦当前时刻被判定为虚拟节点分组时间点,就需要对虚拟节点进行分组。分组的具体过程如下:
(31)定义长度为cn(此处cn=10)的布尔型数组CBool,其10个元素均初始化为0。
(32)从数组Vnode_counts_by_key中选出非零最小值,赋给临时变量mc;同时对于该数组中每一个值非零的元素所对应的类别j(0≤j≤cn-1),设置CBool[j]=1。
(33)建立mc个字典结构Ggn,Ggn+1,…,Ggn+mc-1,它们代表新增加的mc个分组。每个字典结构包含多个字典元素,每个字典元素是一个“key(键):value(值)”对,其中键为类别号,值为与该类别号对应的虚拟节点类别链表。
(34)遍历布尔型数组CBool,对于其中每一个值为1的数组元素CBool[k],进行如下操作:首先建立mc个字典元素DE(k,0),DE(k,1),…,DE(k,mc-1);然后从虚拟节点类别链表Listk中依次取出mc个虚拟节点编号,不妨记为Vn0、Vn1、…Vnmc-1,将它们分别加入字典元素DE(k,0),DE(k,1),…,DE(k,mc-1)中,即在每个字典元素的虚拟节点编号链表中加入1个虚拟节点编号;最后将这mc个字典元素对应加入到mc个字典结构Ggn,Ggn+1,…,Ggn+mc-1中,即把编号为Vnt(0≤t≤mc-1)的虚拟节点加入新的分组gn+t,同时对数组Vnode_map进行更新,Vnode_map[Vnt]=gn+t。
(35)对数组Vnode_counts_by_key进行更新,使该数组中所有非零元素的值都减去mc。
(36)对虚拟节点组别数gn进行更新,gn=gn+mc。
(37)若此时Vnode_counts_by_key数组中元素不全为0,则跳转至步骤(32);否则,结束分组,同时保存由gn个字典结构组成的集合G={G0,G1,…,Ggn-1},它的元素包含了gn个分组的信息。
第四,分组合并过程。随着Swift存储系统中所存储的对象不断增多,可能会出现某个分组内所有虚拟节点的相对空闲度都比较低的情况,这意味着该分组的负载已经很高。这时,需要在所有分组中选出一个负载较低的分组,与该分组进行合并。假定在当前时刻,分组m(0≤m≤gn-1,该分组由字典结构Gm描述,对应虚拟节点编号集合VNGm)需要与另一个分组进行合并,具体方法如下:
(41)遍历除分组m外的所有分组,找出其中包含有当前相对空闲度最大的虚拟节点的一个分组k(0≤k≤gn-1且k≠m)。
(42)将分组m中的所有虚拟节点都加入分组k,相对应地将字典结构Gm中所有字典元素并入字典结构Gk。在并入时,若两个字典元素的key(键)值相同,则只保留一个字典元素,并且需要将它们的value(值)部分进行合并。
(43)删除Gm,并将组别号大于m的所有分组的组别号减去1,同时对数组Vnode_map中虚拟节点所属组别号进行对应更新。
(44)最后对虚拟节点组别数gn进行更新,gn=gn-1。
第五,对象的存储过程。该过程将主要根据系统中虚拟节点是否已经进行过分组,而分情况实施。假定待存储对象大小为Obj_size,对象存储具体过程如下:
(51)通过哈希函数将待存储对象映射到Ring环上的位置Loc,从位置Loc开始沿Ring环以顺时针方向寻找第一个虚拟节点,不妨记为Vnt(0≤t≤n-1)。
(52)根据gn是否大于0,判断系统中虚拟节点是否已经进行过分组,若是,转至步骤(56);否则,转至步骤(53)。
(53)采用虚拟节点分组时间点判别方法,判断当前时刻是否需要对虚拟节点进行分组,若是,则转至步骤(55);否则,转至步骤(54)。
(54)将对象直接存储在虚拟节点Vnt对应的存储服务器中,转至步骤(510)。
(55)按照虚拟节点的分组过程对虚拟节点进行分组。分组结束之后,虚拟节点Vnt被分配到某一分组(该分组由相应的字典结构描述,并有对应的虚拟节点编号集合)。
(56)假定虚拟节点Vnt属于分组m,即Vnt∈VNGm。为简便计,将数组Vnode_left_percentage简记为VNLP,采用公式3进行判断:
若公式3取值为True,则将该对象存储在Vnt对应的存储服务器中,结束;若公式3取值为False,转至步骤(57)。
(57)在分组m中寻找虚拟节点Vnj,满足之后判断是否成立。若成立,则将对象存储在Vnj对应的存储服务器中,转至步骤(510);否则转至步骤(58)。
(58)按照分组合并过程选取分组k与分组m进行合并,假定合并之后得到分组s(0≤s≤gn-1,该分组由字典结构Gs描述,对应虚拟节点编号集合VNGs)。
(59)在分组s中寻找虚拟节点Vnk,满足将对象存储在Vnk对应的存储服务器中。
(510)由于对象被存储到虚拟节点中,需要重新计算该虚拟节点的相对空闲度。如果因为相对空闲度改变而引起虚拟节点类别变化,将该虚拟节点从它当前所在的类别链表中移除,并加入到新类别所对应的类别链表中。结束。
第六,对象的检索过程。在存储系统中对一个对象进行检索的具体过程如下:
(61)通过哈希函数将待检索对象映射到Ring环上的位置Loc,从位置Loc开始沿Ring环以顺时针方向寻找第一个虚拟节点,不妨记为Vnt(0≤t≤n-1)。
(62)查询虚拟节点Vnt所对应的存储服务器,若它存储了该对象,则该对象被检索到,结束;否则,转至步骤(63)。
(63)该对象一定存储在Vnt所属分组的其他虚拟节点对应的存储服务器中。假定虚拟节点Vnt属于分组m,即Vnt∈VNGm。遍历集合VNGm内所有虚拟节点,查询它们所对应的存储服务器,直到找到对象,结束。
下面根据附图,对基于虚拟节点存储优化的Swift负载均衡算法的实施例进行详细介绍:
1,假定Swift存储系统的Ring环上共有n个虚拟节点,首先设置与虚拟节点相关的参数。构造长度为n的数组Vnode_left_percentage,该数组所有元素Vnode_left_percentage[i]的初值设为100%。构造长度为10(cn=10)的数组Vnode_counts_by_key,将Vnode_counts_by_key[9]初值设为n,其余数组元素初值全设为0。构建10个虚拟节点类别链表List0、List1、…、List9,其中类别链表List9在初始化时存储所有虚拟节点编号0、1、2、…、n-1,其他9个类别链表均初始化为空表。构造长度为n的数组Vnode_map,该数组在初始化时将所有元素置为-1。设置虚拟节点的组别数gn的初值为0。
2,图3给出了虚拟节点分组时间点的判别流程示例。假定某一时刻数组Vnode_counts_by_key的值为[8,0,7,5,8,3,1,8,2,3],表示有8个虚拟节点属于类别0(对应相对空闲度子区间[0%,10%]),有0个虚拟节点属于类别1(对应子区间(10%,20%]),有7个虚拟节点属于类别2(对应子区间(20%,30%]),依次类推。首先复制数组Vnode_counts_by_key到数组Vnode_counts_by_key_bk,并在数组Vnode_counts_by_key_bk的各元素中找出非零的最小值Min_count,此时为1。然后将数组Vnode_counts_by_key_bk的每一个非零元素都减去最小值Min_count,该数组的值变为[7,0,6,4,7,2,0,7,1,2]。不断重复上述过程,最终数组Vnode_counts_by_key_bk的元素可能出现两种可能:(1).该数组中所有的元素的值都为0,则当前时刻是对虚拟节点进行分组的时间点;(2).该数组中有某一个元素的值不为0,其余元素的值都为0,则当前时刻不能为虚拟节点进行分组。
3,假定某一时刻数组Vnode_counts_by_key的值为[8,0,7,5,8,3,1,8,2,3],根据图3所示流程判定当前时刻是虚拟节点分组时间点,则立即对虚拟节点进行分组。记虚拟节点类别链表Listi(0≤i≤9)中第j个虚拟节点为Vn(i, j),由字典结构组成的集合G记录了当前时刻的所有分组信息。则具体的虚拟节点分组过程如图4所示:
(1)定义长度为10(cn=10)的布尔型数组CBool,所有元素均初始化为0。
(2)找出数组Vnode_counts_by_key中所有元素的非零最小值mc。对于图4的第一步而言,此时mc值为1。
(3)根据数组Vnode_counts_by_key中每一个值非零的元素所对应的类别,设置数组CBool=[1,0,1,1,1,1,1,1,1,1]。
(4)新建mc个空的字典结构Ggn,Ggn+1,…,Ggn+mc-1。对于图4的第一步而言,此时mc值为1,故新建1个空的字典结构G0。
(5)遍历布尔型数组CBool,对于其中每一个值为1的数组元素CBool[k],都从相应的虚拟节点类别链表Listk中取出mc个虚拟节点,以类别号为键(图4中为清楚显示,用相对空闲度子区间来代表类别号),包含该虚拟节点的类别列表为值,构造字典元素并加入到字典结构Ggn,Ggn+1,…,Ggn+mc-1中。对于图4的第一步而言,此时mc值为1,故从List0,,List2,List3,…,List9中各取出1个虚拟节点(即Vn(0,0),Vn(2,0),Vn(3,0),…,Vn(9,0)),构造9个字典元素,并加入字典结构G0。
(6)更新数组Vnode_counts_by_key,使该数组中所有非零元素的值都减去mc。对于图4的第一步而言,更新之后Vnode_counts_by_key=[7,0,6,4,7,2,0,7,1,2]。
(7)更新变量gn=gn+mc。对于图4的第一步而言,更新后gn=1。
(8)判断数组Vnode_counts_by_key是否存在非零值,若存在,则转至步骤(2);否则,结束分组。对于图4而言,在第一步完成之后,数组Vnode_counts_by_key中仍存在非零值,故转至步骤(2)继续循环至图4的第六步完成之后,此时数组Vnode_counts_by_key中元素全零,结束分组,最后总共得到8个分组。
4,以图4例最后一步所得的8个分组G0,G1,…,G7为例,说明虚拟节点的分组合并过程。假设分组G2需要合并,则分组合并过程如下:
(1)在所有分组中找出其中包含有当前相对空闲度最大的虚拟节点的一个分组G3。
(2)将分组G2中所有虚拟节点加入分组G3,并删除G2。
(3)将分组G3,G4,…,G7的组别号减去1,得到分组G2,G3,…,G6。同时对数组Vnode_map中虚拟节点所属组别号进行对应更新。
(4)最后对虚拟节点组别数gn进行更新,gn=7。
5,假定某一时刻要存储对象Objx,所需空间为Obj_size。通过判断参数gn的值,知道虚拟节点已经进行过分组。则对Objx对象的存储过程如下:
(1)通过哈希函数将待存储对象Objx映射到Ring环上的位置Loc,从该位置找到顺时针方向第一个虚拟节点,假设为Vn(2,2)。
(2)经判断,虚拟节点Vn(2,2)不满足公式3,转至步骤(3)。
(3)假定在G2中未能找到满足 的虚拟节点Vnj,转至步骤(4)。
(4)在所有的分组中找出其中包含有当前相对空闲度最大的虚拟节点的一个分组G3,将G2与G3合并。原来的分组G3中,Vn(8,3)所属类别的类别号最大,因此将对象Objx存储到虚拟节点Vn(8,3)所对应的存储服务器中。
6,假定某一时刻要在系统中检索对象Objx,具体的检索过程如下:
(1)通过哈希函数将待检索对象Objx映射到Ring环上的位置Loc,从该位置找到顺时针方向第一个虚拟节点,假设为Vn(2,2)。
(2)查询虚拟节点Vn(2,2)所对应的存储服务器,发现它没有存储对象Objx,则转至步骤(3)。
(3)找到虚拟节点Vn(2,2)所在分组G3,遍历分组3内所有虚拟节点,结果在虚拟节点Vn(8,3)所对应的存储服务器中找到对象Objx,结束。
Claims (8)
1.一种基于虚拟节点存储优化的Swift负载均衡方法,其特征在于,包括如下步骤:
(1)与虚拟节点相关参数的初始化;为了达到存储负载均衡的效果,Swift存储系统需要记录虚拟节点的相关参数,包括虚拟节点的相对空闲度、虚拟节点所属类别、虚拟节点类别链表、虚拟节点的组别数、虚拟节点所属组别号等。在Swift存储系统开始运行时,需要对这些参数进行初始化;
(2)对象的存储过程;该过程将主要根据系统中虚拟节点是否已经进行过分组,而分情况实施;若系统中虚拟节点尚未进行过分组,紧接着判断采用虚拟节点分组时间点判别方法,判断当前时刻是否需要对虚拟节点进行分组;如果无需分组,直接进行对象存储;如果需要分组,则先按照虚拟节点的分组过程对虚拟节点进行分组;一旦系统中虚拟节点进行过分组,判断对象被映射到的分组是否能够存储该对象;如果能够存储,将对象存储在合适的存储服务器;否则,先按照分组合并过程将对象被映射到的分组与另一个分组进行合并,然后在合并后的分组中完成对象存储;
(3)对象的检索过程;当系统收到读取某一对象的请求时,首先根据Swift中的Ring环找到该对象对应的虚拟节点,然后查询该虚拟节点所对应的存储服务器。如果在存储服务器中找到所请求的对象,则直接读取;否则,先找出该虚拟节点所在的分组,然后遍历分组内所有虚拟节点对应的存储服务器,直至找到所请求的对象。
2.如权利要求1所述的基于虚拟节点存储优化的Swift负载均衡方法,其特征在于,系统运行时需要设置与虚拟节点的相关参数,这些参数主要包括:虚拟节点的相对空闲度、虚拟节点所属类别、虚拟节点类别链表、虚拟节点的组别数、虚拟节点所属组别号等;
虚拟节点的相对空闲度;假定Ring环上共有n个虚拟节点,编号为i(0≤i≤n-1)的虚拟节点Vni的相对空闲度RFi是指其剩余空间占总存储空间的百分比,取值范围为区间[0%,100%];具体采用公式1进行计算:
其中,表示编号为i的虚拟节点Vni的存储空间大小,mi表示编号为i的虚拟节点目前已存储的对象个数,Mj表示编号为i的虚拟节点存储的第j(0≤j≤mi)个对象的大小;当编号为i的虚拟节点新增一个大小为a的存储对象时,则其相对空闲度RFi采用公式2进行更新:
用长度为n的数组Vnode_left_percentage来记录Ring环上n个虚拟节点的相对空闲度,其中Vnode_left_percentage[i]表示编号为i的虚拟节点的相对空闲度,初始化时将该数组所有元素初值设为100%;
虚拟节点所属类别;假定类别数目为cn,首先将相对空闲度取值区间[0%,100%]划分成cn个等间隔的子区间,得到cn个子区间,记为子区间cn-1、子区间cn-2、…、子区间0;相对空闲度落在同一子区间中的所有虚拟节点视为同一类别,则总共得到cn个类别,记为类别cn-1、类别cn-2、…、类别0;用长度为cn的数组Vnode_counts_by_key来记录属于某一类别的虚拟节点个数;该数组在初始化时Vnode_counts_by_key[cn-1]=n,其余数组元素全为0;
虚拟节点类别链表;用cn个链表List0,List1,…存储属于对应类别号下的所有虚拟节点编号;在初始化时,Listcn-1中存储虚拟节点编号0、1、2、…、n-1,其他cn-1个链表均初始化为空表;
虚拟节点的组别数;用参数gn表示所有虚拟节点的当前分组总数,在初始时其值设为0,表示初始时尚未进行虚拟节点分组;某一时刻系统中所有gn个组别记为分组0、分组1、…、分组gn-1,并且用VNG0、VNG1、…、VNGgn-1表示属于这些分组的虚拟节点编号集合;
虚拟节点所属组别号。用长度为n的数组Vnode_map记录各虚拟节点所属的组别号,Vnode_map[i]代表编号为i的虚拟节点所属的组别号;该数组在初始化时将所有元素置为-1。
3.如权利要求1所述的基于虚拟节点存储优化的Swift负载均衡方法,其特征在于,采用分组鉴别方法判断是否可以为虚拟节点进行分组;随着存储对象的不断增加,虚拟节点的相对空闲度逐渐发生变化且各虚拟节点的变化不同。但可以确定的是,在存储系统开始运行后的短期内,虚拟节点的相对空闲度的值还比较聚集在某个范围,即虚拟节点都属于某一、两个类别;因此,为虚拟节点分组不能发生在存储系统刚开始运行的时候,需要动态检测虚拟节点的状态从而确定可以为虚拟节点分组的时间点;分组鉴别方法的步骤如下:复制Vnode_counts_by_key,记作Vnode_counts_by_key_bk,遍历数组Vnode_counts_by_key_bk,选出数组中非零的最小值Min_count,数组中所有非零元素都减去Min_count;重复该过程,直到数组中只剩一个元素不为0或者数组中所有元素都为0;若数组中所有元素都为0,则返回True,表示可以开始为虚拟节点分组;若数组中只剩一个元素不为0,则返回False,表示不可以开始为虚拟节点分组。
4.如权利要求1所述的基于虚拟节点存储优化的Swift负载均衡方法,其特征在于,在对象的存储过程中,若系统中虚拟节点尚未进行过分组,需要判断当前时刻是否是对虚拟节点进行分组的时间点;
确定虚拟节点分组时间点的标准是:保证每个分组至少包含两种类别的虚拟节点,并且在同一分组中属于一种类别的虚拟节点只有1个;在系统开始运行后的短期内,所有虚拟节点的相对空闲度值将集中在一个子区间,即所有虚拟节点都属于一个类别,此时不满足虚拟节点分组时间点的鉴别标准;在系统运行一段时间之后,当系统收到对象存储请求时,采用如下方法判别当前时刻是否是对虚拟节点进行分组的合理时间点:
(1)创建与Vnode_counts_by_key相同的数组Vnode_counts_by_key_bk,将当前Vnode_counts_by_key中的值复制到Vnode_counts_by_key_bk中;
(2)遍历数组Vnode_counts_by_key_bk,选出非零的最小值Min_count,然后将Vnode_counts_by_key_bk中所有非零元素都减去Min_count;
(3)若此时数组所有元素都为0,则返回True,结束;若此时数组只有一个元素不为0,其余都为0,则返回False,结束;否则转至步骤(2);
若上述步骤(3)返回True,表示当前时刻是对虚拟节点进行分组的时间点,则按照以下的虚拟节点分组过程进行分组;若返回False,则意味着当前时刻不需要为虚拟节点分组。
5.如权利1所述的基于虚拟节点存储优化的Swift负载均衡方法,其特征在于,在对象的存储过程中,一旦当前时刻被判定为虚拟节点分组时间点,就需要对虚拟节点进行分组。分组的具体过程如下:
(1)定义长度为cn的布尔型数组CBool,其cn个元素均初始化为0。
(2)从数组Vnode_counts_by_key中选出非零最小值,赋给临时变量mc;同时对于该数组中每一个值非零的元素所对应的类别j(0≤j≤cn-1),设置CBool[j]=1;
(3)建立mc个字典结构Ggn,Ggn+1,…,Ggn+mc-1,它们代表新增加的mc个分组;每个字典结构包含多个字典元素,每个字典元素是一个“key(键):value(值)”对,其中键为类别号,值为与该类别号对应的虚拟节点类别链表;
(4)遍历布尔型数组CBool,对于其中每一个值为1的数组元素CBool[k],进行如下操作:首先建立mc个字典元素DE(k,0),DE(k,1),…,DE(k,mc-1);然后从虚拟节点类别链表Listk中依次取出mc个虚拟节点编号,不妨记为Vn0、Vn1、…Vnmc-1,将它们分别加入字典元素DE(k,0),DE(k,1),…,DE(k,mc-1)中,即在每个字典元素的虚拟节点编号链表中加入1个虚拟节点编号;最后将这mc个字典元素对应加入到mc个字典结构Ggn,Ggn+1,…,Ggn+mc-1中,即把编号为Vnt(0≤t≤mc-1)的虚拟节点加入新的分组gn+t,同时对数组Vnode_map进行更新,Vnode_map[Vnt]=gn+t;
(5)对数组Vnode_counts_by_key进行更新,使该数组中所有非零元素的值都减去mc;
(6)对虚拟节点组别数gn进行更新,gn=gn+mc;
(7)若此时Vnode_counts_by_key数组中元素不全为0,则跳转至步骤(2);否则,结束分组,同时保存由gn个字典结构组成的集合G={G0,G1,…,Ggn-1},它的元素包含了gn个分组的信息。
6.如权利1所述的基于虚拟节点存储优化的Swift负载均衡方法,其特征在于,在存储对象的过程中可能会导致分组合并;当某个分组内所有虚拟节点的相对空闲度都比较低时,需要在所有分组中选出一个负载较低的分组,与该分组进行合并。假定在当前时刻,分组m(0≤m≤gn-1,该分组由字典结构Gm描述,对应虚拟节点编号集合VNGm)需要与另一个分组进行合并,具体方法如下:
(1)遍历除分组m外的所有分组,找出其中包含有当前相对空闲度最大的虚拟节点的一个分组k(0≤k≤gn-1且k≠m);
(2)将分组m中的所有虚拟节点都加入分组k,相对应地将字典结构Gm中所有字典元素并入字典结构Gk;在并入时,若两个字典元素的key(键)值相同,则只保留一个字典元素,并且需要将它们的value(值)部分进行合并;
(3)删除Gm,并将组别号大于m的所有分组的组别号减去1,同时对数组Vnode_map中虚拟节点所属组别号进行对应更新;
(4)最后对虚拟节点组别数gn进行更新,gn=gn-1。
7.如权利1所述的基于虚拟节点存储优化的Swift负载均衡方法,其特征在于,具体的对象存储过程如下:
(1)通过哈希函数将待存储对象映射到Ring环上的位置Loc,从位置Loc开始沿Ring环以顺时针方向寻找第一个虚拟节点,不妨记为Vnt(0≤t≤n-1);
(2)根据gn是否大于0,判断系统中虚拟节点是否已经进行过分组,若是,转至步骤(6);否则,转至步骤(3);
(3)采用虚拟节点分组时间点判别方法,判断当前时刻是否需要对虚拟节点进行分组,若是,则转至步骤(5);否则,转至步骤(4);
(4)将对象直接存储在虚拟节点Vnt对应的存储服务器中,转至步骤(10);
(5)按照虚拟节点的分组过程对虚拟节点进行分组。分组结束之后,虚拟节点Vnt被分配到某一分组(该分组由相应的字典结构描述,并有对应的虚拟节点编号集合);
(6)假定虚拟节点Vnt属于分组m,即Vnt∈VNGm;为简便计,将数组Vnode_left_percentage简记为VNLP,采用公式3进行判断:
其中Obj_size为待存储对象的大小;若公式3取值为True,则将该对象存储在Vnt对应的存储服务器中,结束;若公式3取值为False,转至步骤(7);
(7)在分组m中寻找虚拟节点Vnj,满足之后判断是否成立;若成立,则将对象存储在Vnj对应的存储服务器中,转至步骤(10);否则转至步骤(8);
(8)按照分组合并过程选取分组k与分组m进行合并,假定合并之后得到分组s(0≤s≤gn-1,该分组由字典结构Gs描述,对应虚拟节点编号集合VNGs);
(9)在分组s中寻找虚拟节点Vnk,满足将对象存储在Vnk对应的存储服务器中;
(10)由于对象被存储到虚拟节点中,需要重新计算该虚拟节点的相对空闲度;如果因为相对空闲度改变而引起虚拟节点类别变化,将该虚拟节点从它当前所在的类别链表中移除,并加入到新类别所对应的类别链表中;结束。
8.如权利1所述的基于虚拟节点存储优化的Swift负载均衡方法,其特征在于,对象检索的具体过程如下:
(1)通过哈希函数将待检索对象映射到Ring环上的位置Loc,从位置Loc开始沿Ring环以顺时针方向寻找第一个虚拟节点,不妨记为Vnt(0≤t≤n-1);
(2)查询虚拟节点Vnt所对应的存储服务器,若它存储了该对象,则该对象被检索到,结束;否则,转至步骤(3);
(3)该对象一定存储在Vnt所属分组的其他虚拟节点对应的存储服务器中。假定虚拟节点Vnt属于分组m,即Vnt∈VNGm。遍历集合VNGm内所有虚拟节点,查询它们所对应的存储服务器,直到找到对象,结束。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610171589.0A CN105657064B (zh) | 2016-03-24 | 2016-03-24 | 基于虚拟节点存储优化的Swift负载均衡方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610171589.0A CN105657064B (zh) | 2016-03-24 | 2016-03-24 | 基于虚拟节点存储优化的Swift负载均衡方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105657064A true CN105657064A (zh) | 2016-06-08 |
CN105657064B CN105657064B (zh) | 2019-03-12 |
Family
ID=56494253
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610171589.0A Active CN105657064B (zh) | 2016-03-24 | 2016-03-24 | 基于虚拟节点存储优化的Swift负载均衡方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105657064B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106254240A (zh) * | 2016-09-18 | 2016-12-21 | 腾讯科技(深圳)有限公司 | 一种数据处理方法和路由层设备以及系统 |
CN107465729A (zh) * | 2017-07-25 | 2017-12-12 | 北京计算机技术及应用研究所 | 基于访问次数排名的虚拟节点副本调整系统及方法 |
CN107666673A (zh) * | 2016-07-28 | 2018-02-06 | 南宁富桂精密工业有限公司 | 网络管理方法及设备 |
CN111049929A (zh) * | 2019-12-24 | 2020-04-21 | 珠海大横琴科技发展有限公司 | 一种虚拟网络资源服务方法、装置、电子设备和存储介质 |
CN111124310A (zh) * | 2019-12-22 | 2020-05-08 | 苏州浪潮智能科技有限公司 | 存储系统调度优化方法及相关组件 |
CN113055495A (zh) * | 2021-03-31 | 2021-06-29 | 杭州海康威视系统技术有限公司 | 一种数据处理方法、装置及分布式存储系统 |
CN117827467A (zh) * | 2024-03-05 | 2024-04-05 | 南京群顶科技股份有限公司 | 一种基于动态画像的虚拟机资源调配方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104468844A (zh) * | 2014-12-31 | 2015-03-25 | 蓝盾信息安全技术股份有限公司 | 云计算iaas教育实验平台装置 |
CN104679611A (zh) * | 2015-03-05 | 2015-06-03 | 浙江宇视科技有限公司 | 数据资源复制方法以及装置 |
-
2016
- 2016-03-24 CN CN201610171589.0A patent/CN105657064B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104468844A (zh) * | 2014-12-31 | 2015-03-25 | 蓝盾信息安全技术股份有限公司 | 云计算iaas教育实验平台装置 |
CN104679611A (zh) * | 2015-03-05 | 2015-06-03 | 浙江宇视科技有限公司 | 数据资源复制方法以及装置 |
Non-Patent Citations (3)
Title |
---|
M.TIM JONES: ""Cloud computing and storage with OpenStack"", 《IBM.COM/DEVELOPERWORKS/》 * |
蒋溢,孙雪涛,杨川: ""Swift云存储环境下基于I/O负载均衡的读取策略"", 《计算机工程与设计》 * |
闫晓勇: ""基于Swift的资源负载均衡策略研究"", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107666673A (zh) * | 2016-07-28 | 2018-02-06 | 南宁富桂精密工业有限公司 | 网络管理方法及设备 |
CN106254240A (zh) * | 2016-09-18 | 2016-12-21 | 腾讯科技(深圳)有限公司 | 一种数据处理方法和路由层设备以及系统 |
CN106254240B (zh) * | 2016-09-18 | 2019-07-05 | 腾讯科技(深圳)有限公司 | 一种数据处理方法和路由层设备以及系统 |
CN107465729A (zh) * | 2017-07-25 | 2017-12-12 | 北京计算机技术及应用研究所 | 基于访问次数排名的虚拟节点副本调整系统及方法 |
CN111124310A (zh) * | 2019-12-22 | 2020-05-08 | 苏州浪潮智能科技有限公司 | 存储系统调度优化方法及相关组件 |
CN111124310B (zh) * | 2019-12-22 | 2023-01-10 | 苏州浪潮智能科技有限公司 | 存储系统调度优化方法及相关组件 |
CN111049929A (zh) * | 2019-12-24 | 2020-04-21 | 珠海大横琴科技发展有限公司 | 一种虚拟网络资源服务方法、装置、电子设备和存储介质 |
CN113055495A (zh) * | 2021-03-31 | 2021-06-29 | 杭州海康威视系统技术有限公司 | 一种数据处理方法、装置及分布式存储系统 |
CN117827467A (zh) * | 2024-03-05 | 2024-04-05 | 南京群顶科技股份有限公司 | 一种基于动态画像的虚拟机资源调配方法 |
CN117827467B (zh) * | 2024-03-05 | 2024-05-10 | 南京群顶科技股份有限公司 | 一种基于动态画像的虚拟机资源调配方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105657064B (zh) | 2019-03-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105657064A (zh) | 基于虚拟节点存储优化的Swift负载均衡方法 | |
CN101515298B (zh) | 基于树形数据结构节点的插入的方法和存储装置 | |
CN103858103B (zh) | 用于资源管理和资源分配的方法和系统 | |
CN102457571B (zh) | 一种云存储中数据均衡分布方法 | |
CN110008256A (zh) | 一种基于分层可导航小世界图的近似最近邻搜索方法 | |
CN108920552B (zh) | 一种面向多源大数据流的分布式索引方法 | |
CN110519090B (zh) | 一种fpga云平台的加速卡分配方法、系统及相关组件 | |
CN1937557A (zh) | 结构化对等网络系统及其负载查询、转移及资源查找方法 | |
CN103473334A (zh) | 数据存储、查询方法及系统 | |
CN109510852B (zh) | 灰度发布的方法及装置 | |
CN102013991A (zh) | 自动扩容的方法、管理设备及系统 | |
CN111488614A (zh) | 基于业务数据区块链的数字身份存储方法及装置 | |
CN106250566A (zh) | 一种分布式数据库及其数据运算的管理方法 | |
CN102325093B (zh) | 一种结构化p2p网络中的路由系统构建方法 | |
CN106973091B (zh) | 分布式内存数据重分布方法及系统、主控服务器 | |
CN107426315A (zh) | 一种基于BP神经网络的分布式缓存系统Memcached的改进方法 | |
CN108830436B (zh) | 基于分形树自平衡划分的共享自行车调度方法 | |
CN110232079A (zh) | 一种基于Hadoop的改进型FP-Growth数据挖掘方法 | |
CN104376047B (zh) | 一种基于HBase的大表join方法 | |
CN105978744A (zh) | 一种资源分配方法、装置及系统 | |
CN103036796B (zh) | 路由信息更新方法及装置 | |
CN112699134A (zh) | 基于图剖分的分布式图数据库的存储与查询方法 | |
CN112232401A (zh) | 一种基于差分隐私及随机梯度下降的数据分类方法 | |
CN107807793A (zh) | 分布式计算机存储系统中数据副本异构存储与访问方法 | |
KR101623113B1 (ko) | 의사 결정 트리의 학습과 분류를 위한 장치 및 그 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |