基于虚拟节点存储优化的Swift负载均衡方法

文档序号:9891600阅读:705来源:国知局
基于虚拟节点存储优化的Swift负载均衡方法
【技术领域】
[0001] 本发明设及一种基于虚拟节点存储优化的Swift负载均衡方法,该方法可W用于 实现大规模、分布式的存储系统,属于互联网技术领域。
【背景技术】
[0002] Swift是开源云计算平台化enStack中的云存储服务组件,是目前业界非常重要的 一种云存储解决方案。Swift的对象存取策略主要采取两层映射机制,该机制在对象与存储 服务器之间增加一个虚拟节点层,一起形成两层映射:(1)对象层与虚拟节点层之间的映 射,该映射主要通过一致性哈希算法完成;(2)虚拟节点层与存储服务器层之间的映射,该 映射主要根据存储服务器的物理位置,将虚拟节点分散地分布于服务器集群中。其中第一 层映射较为复杂,也是影响整个Swift存取性能的关键。在两层映射关系下,Swift中对象的 存取过程如图1所示,主要分为两步:第一步,利用哈希函数对请求中的对象进行哈希,根据 哈希计算的结果找到对应的虚拟节点;第二步,根据第二层映射找到该虚拟节点对应的存 储服务器,进而完成对象的存储或读取。
[0003] 一致性哈希算法(Consistent化sh)在Swift存取过程中起到非常重要的作用,其 原理如图2所示:该算法维护一个逻辑环(Ring环),它可视为一个环形的化sh空间,对象和 虚拟节点都将映射到此化sh空间中。当有存储对象的请求到来时,利用哈希函数将对象映 射到环上某一点,并W该位置为起点,沿环顺时针方向遇到的第一个虚拟节点为该对象所 对应的虚拟节点。如图2所示,对象Objects在环上的位置是L2,则Objects映射到虚拟节点 化ode3。Swift将虚拟节点均匀地分布在Ring环上,确保每个虚拟节点可存储的对象个数相 等。但是,由于每个对象所占存储空间大小存在差异,所W运样做并不能保证存储服务器的 空间利用率负载均衡。此外,当在Ring环上顺时针方向遇到的第一个虚拟节点不满足存储 条件时,Swift将继续沿顺时针方向直至找到合适的虚拟节点为止,最坏情况下将绕环一 周,影响对象的存取效率。
[0004] 由于Swift存储对象具有随机性,并且不同存储服务器的性能不同,为了避免因存 储服务器负载不均而使个别存储服务器出现存储瓶颈,Swift在存储对象时需要对各存储 服务器进行负载均衡。实现负载均衡的关键在于,如何W尽可能小的开销来平衡各服务器 的负载,从而提高存储系统的资源利用率。从Swift存储的负载均衡需求来看,目前已有的 一些动态负载均衡方法,在效率、可扩展性和性能等方面仍存在欠缺。例如,基于加权最小 连接(wei曲ted least-connections)的方法,用权值来反映各服务器间的性能差异,并采 用请求的连接数作为衡量负载量的标准,在分配请求时尽可能使服务器的连接数与性能权 值成比例,但该方法并没有考虑请求之间的差异。而基于双加权最小连接的方法虽然考虑 了请求之间的差异,并因此增加了表示请求的权值,但该方法对于Swift而言,由于比较次 数过多,致使效率较低。

【发明内容】

[0005] 发明目的:针对现有技术中存在的问题与不足,本发明提供一种基于虚拟节点存 储优化的Swift负载均衡方法。该方法综合考虑了存储服务器的性能差异和对象所占空间 的大小差异,通过采用分组、合并的机制,可实现全局和局部相结合的动态负载均衡,提升 云存储系统的资源利用率和提高云存储系统的存取效率,更加适用于大规模、分布式云存 储服务需求。
[0006] 技术方案:一种基于虚拟节点存储优化的Swift负载均衡方法,包括如下步骤:
[0007] (1)与虚拟节点相关参数的初始化。为了达到存储负载均衡的效果,Swift存储系 统需要记录虚拟节点的相关参数,包括虚拟节点的相对空闲度、虚拟节点所属类别、虚拟节 点类别链表、虚拟节点的组别数、虚拟节点所属组别号等。在Swift存储系统开始运行时,需 要对运些参数进行初始化。
[0008] (2)对象的存储过程。该过程将主要根据系统中虚拟节点是否已经进行过分组,而 分情况实施。若系统中虚拟节点尚未进行过分组,紧接着判断采用虚拟节点分组时间点判 别方法,判断当前时刻是否需要对虚拟节点进行分组。如果无需分组,直接进行对象存储; 如果需要分组,则先按照虚拟节点的分组过程对虚拟节点进行分组。一旦系统中虚拟节点 进行过分组,判断对象被映射到的分组是否能够存储该对象。如果能够存储,将对象存储在 合适的存储服务器;否则,先按照分组合并过程将对象被映射到的分组与另一个分组进行 合并,然后在合并后的分组中完成对象存储。
[0009] (3)对象的检索过程。当系统收到读取某一对象的请求时,首先根据Swift中的 Ring环找到该对象对应的虚拟节点,然后查询该虚拟节点所对应的存储服务器。如果在存 储服务器中找到所请求的对象,则直接读取;否则,先找出该虚拟节点所在的分组,然后遍 历分组内所有虚拟节点对应的存储服务器,直至找到所请求的对象。
[0010] 第一,与虚拟节点相关的参数及其计算。本方法在实现负载均衡时的主要依据是 与虚拟节点有关的一些参数,运些参数主要包括:虚拟节点的相对空闲度、虚拟节点所属类 另IJ、虚拟节点类别链表、虚拟节点的组别数、虚拟节点所属组别号等。
[0011 ]虚拟节点的相对空闲度。假定Ring环上共有η个虚拟节点,W其中一个虚拟节点为 起始点,顺时针进行编号为虚拟节点0、虚拟节点1、···、虚拟节点η-1,则编号为i(0 < i < η- 1)的虚拟节点化1的相对空闲度RFi是指其剩余空间占总存储空间的百分比,取值范围为区 间[0%,100% ]。具体采用公式1进行计算:
[oon]
(公式 1)
[001引其中,取η,表示编号为i的虚拟节点Vm的存储空间大小,mi表示编号为i的虚拟节 点目前已存储的对象个数,表示编号为i的虚拟节点存储的第j(0含j含ΠΗ)个对象的大小。 当编号为i的虚拟节点新增一个大小为a的存储对象时,则其相对空闲度RFi采用公式2进行 更新:
[0014]
(公式 2)
[0015] 相对空闲度反映了虚拟节点的存储负载状态,相对空闲度高代表负载高,相对空 闲度低则代表负载低。同时,用长度为η的数组化ode_left_pe;rcentage来记录化ng环上η个 虚拟节点的相对空闲度,其中化〇de_lef ^percentage [ i ]表示编号为i的虚拟节点的相对 空闲度,初始化时将该数组所有元素初值设为100 %。
[0016] 虚拟节点所属类别。它是在对虚拟节点进行分组时的重要参考因素,区分类别的 基础是虚拟节点的相对空闲度。假定类别数目为cn(此处Wcn=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来记录属于某一类别的虚拟节点个数,如化ode_counts_by_key [ 0 ]代表类 别0(对应子区间[0%,10% ])的虚拟节点个数。该数组在初始化时Vnode_counts_by_key kn-l ] =n,其余数组元素全为0。
[0017] 虚拟节点类别链表。用10个链表Listo,Listi,…,Lists存储属于对应类别号下的 所有虚拟节点编号。在初始化时,Lists中存储虚拟节点编号0、1、2、…、n-l (表示初始时所 有虚拟节点都属于类别9),其他9个链表均初始化为空表。
[0018] 虚拟节点的组别数。对虚拟节点进行分组的原则是:保证每个分组中虚拟节点所 属的类别尽可能最多,同时每个类别在所有分组中只能出现一次。虚拟节点的组别数gn表 示所有虚拟节点的当前分组总数,在初始时其值设为0,表示初始时尚未进行虚拟节点分 组。当前的所有即个组别记为分组0、分组1、…、分组即-1,并且用VNGo、VNGi、…、VNGgn-i表示 属于运些分组的虚拟节点编号集合(集合中元素是虚拟节点的编号)。
[0019] 虚拟节点所属组别号。用长度为η的数组Vnode_map记录各虚拟节点所属的组别 号,化ode_map[i]代表编号为i的虚拟节点所属的组别号。该数组在初始化时将所有元素置 为-1。
[0020] 第二,判别对虚拟节点进行分组的时间点。存储系统并不需要一开始就对虚拟节 点进行分组,因为在初始状态时虚拟节点的相对空闲度都为100%,此时可认为虚拟节点的 负载量是均衡的(所有虚拟节点的负载量都为0)。随着存储对象的不断增加,虚拟节点的相 对空闲度会逐渐发生变化,为了使多个虚拟节点实现负载均衡,需要在一定条件下对虚拟 节点进行分组。确定虚拟节点分组时间点的标准是:保证每个分组至少包含两种类别的虚 拟节点,并且在同一分组中属于一种类别的虚拟节点只有1个。
[0021] 在系统开始运行后的短期内,所有虚拟节点的相对空闲度值将集中在子区间 (90%,100% ],即所有虚拟节点都属于类别9,此时也不满足虚拟节点分组时间点的鉴别标 准。所W,对虚拟节点进行分组只会发生在系统运行一段时间之后,具体采用如下方法判别 对虚拟节点进行分组的合理时间点:
[0022] (21)创建与化〇(16_(3〇11]113_67_4巧相同的数组化〇(16_(3〇11]113_67_4巧_64,将当前 化 ode_counts_by_key 中的值复制到化 ode_counts_by_key_bk 中。
[0023] (22)遍历数组¥]1〇(16_(3〇11]113_67_467_化,选出非零的最小值1;[]1_(3〇11]11:,然后将 化ode_counts_by_key_bk中所有非零元素都减去Min_count。
[0024] (23)若此时数组所有元素都为0,则返回化ue,结束;若此时数组只有一个元素不
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1